/**
  * Create a new media object, from inline media data.
  *
  * @param int    $level
  * @param string $gedrec
  * @param Tree   $tree
  *
  * @return string
  */
 public static function createMediaObject($level, $gedrec, Tree $tree)
 {
     if (preg_match('/\\n\\d FILE (.+)/', $gedrec, $file_match)) {
         $file = $file_match[1];
     } else {
         $file = '';
     }
     if (preg_match('/\\n\\d TITL (.+)/', $gedrec, $file_match)) {
         $titl = $file_match[1];
     } else {
         $titl = '';
     }
     // Have we already created a media object with the same title/filename?
     $xref = Database::prepare("SELECT m_id FROM `##media` WHERE m_filename = ? AND m_titl = ? AND m_file = ?")->execute(array($file, $titl, $tree->getTreeId()))->fetchOne();
     if (!$xref) {
         $xref = $tree->getNewXref('OBJE');
         // renumber the lines
         $gedrec = preg_replace_callback('/\\n(\\d+)/', function ($m) use($level) {
             return "\n" . ($m[1] - $level);
         }, $gedrec);
         // convert to an object
         $gedrec = str_replace("\n0 OBJE\n", '0 @' . $xref . "@ OBJE\n", $gedrec);
         // Fix Legacy GEDCOMS
         $gedrec = preg_replace('/\\n1 FORM (.+)\\n1 FILE (.+)\\n1 TITL (.+)/', "\n1 FILE \$2\n2 FORM \$1\n2 TITL \$3", $gedrec);
         // Fix FTB GEDCOMS
         $gedrec = preg_replace('/\\n1 FORM (.+)\\n1 TITL (.+)\\n1 FILE (.+)/', "\n1 FILE \$3\n2 FORM \$1\n2 TITL \$2", $gedrec);
         // Create new record
         $record = new Media($xref, $gedrec, null, $tree);
         Database::prepare("INSERT INTO `##media` (m_id, m_ext, m_type, m_titl, m_filename, m_file, m_gedcom) VALUES (?, ?, ?, ?, ?, ?, ?)")->execute(array($xref, $record->extension(), $record->getMediaType(), $record->getTitle(), $record->getFilename(), $tree->getTreeId(), $gedrec));
     }
     return "\n" . $level . ' OBJE @' . $xref . '@';
 }
Exemple #2
0
 /**
  * Render the image to the output.
  */
 public function render()
 {
     if (!$this->media || !$this->media->canShow()) {
         Log::addMediaLog('Image Builder error: >' . I18N::translate('Missing or private media object.'));
         $this->renderError();
     }
     $serverFilename = $this->media->getServerFilename();
     if (!file_exists($serverFilename)) {
         Log::addMediaLog('Image Builder error: >' . I18N::translate('The media object does not exist.') . '< for path >' . $serverFilename . '<');
         $this->renderError();
     }
     $mimetype = $this->media->mimeType();
     $imgsize = $this->media->getImageAttributes();
     $filetime = $this->media->getFiletime();
     $filetimeHeader = gmdate('D, d M Y H:i:s', $filetime) . ' GMT';
     $expireHeader = gmdate('D, d M Y H:i:s', WT_TIMESTAMP + $this->getExpireOffset()) . ' GMT';
     $type = Functions::isImageTypeSupported($imgsize['ext']);
     $usewatermark = false;
     // if this image supports watermarks and the watermark module is intalled...
     if ($type) {
         $usewatermark = $this->isShowWatermark();
     }
     // determine whether we have enough memory to watermark this image
     if ($usewatermark) {
         if (!FunctionsMedia::hasMemoryForImage($serverFilename)) {
             // not enough memory to watermark this file
             $usewatermark = false;
         }
     }
     $etag = $this->media->getEtag();
     // parse IF_MODIFIED_SINCE header from client
     $if_modified_since = 'x';
     if (!empty(Filter::server('HTTP_IF_MODIFIED_SINCE'))) {
         $if_modified_since = preg_replace('/;.*$/', '', Filter::server('HTTP_IF_MODIFIED_SINCE'));
     }
     // parse IF_NONE_MATCH header from client
     $if_none_match = 'x';
     if (!empty(Filter::server('HTTP_IF_NONE_MATCH'))) {
         $if_none_match = str_replace('"', '', Filter::server('HTTP_IF_NONE_MATCH'));
     }
     // add caching headers.  allow browser to cache file, but not proxy
     header('Last-Modified: ' . $filetimeHeader);
     header('ETag: "' . $etag . '"');
     header('Expires: ' . $expireHeader);
     header('Cache-Control: max-age=' . $this->getExpireOffset() . ', s-maxage=0, proxy-revalidate');
     // if this file is already in the user’s cache, don’t resend it
     // first check if the if_modified_since param matches
     if ($if_modified_since === $filetimeHeader) {
         // then check if the etag matches
         if ($if_none_match === $etag) {
             http_response_code(304);
             return;
         }
     }
     // send headers for the image
     header('Content-Type: ' . $mimetype);
     header('Content-Disposition: filename="' . addslashes(basename($this->media->getFilename())) . '"');
     if ($usewatermark) {
         // generate the watermarked image
         $imCreateFunc = 'imagecreatefrom' . $type;
         $imSendFunc = 'image' . $type;
         if (function_exists($imCreateFunc) && function_exists($imSendFunc)) {
             $im = $imCreateFunc($serverFilename);
             $im = $this->applyWatermark($im);
             // send the image
             $imSendFunc($im);
             imagedestroy($im);
             return;
         } else {
             // this image is defective.  log it
             Log::addMediaLog('Image Builder error: >' . I18N::translate('This media file is broken and cannot be watermarked.') . '< in file >' . $serverFilename . '< memory used: ' . memory_get_usage());
         }
     }
     // determine filesize of image (could be original or watermarked version)
     $filesize = filesize($serverFilename);
     // set content-length header, send file
     header('Content-Length: ' . $filesize);
     // Some servers disable fpassthru() and readfile()
     if (function_exists('readfile')) {
         readfile($serverFilename);
     } else {
         $fp = fopen($serverFilename, 'rb');
         if (function_exists('fpassthru')) {
             fpassthru($fp);
         } else {
             while (!feof($fp)) {
                 echo fread($fp, 65536);
             }
         }
         fclose($fp);
     }
 }