X-Git-Url: https://git.mxchange.org/?a=blobdiff_plain;f=lib%2Fimagefile.php;h=a328df9852bd965f33e0d0107021505f61c56281;hb=f134a423f6a9e7bb61d069c4d6281c05417bbd45;hp=97aa85c1ffb1e6a21508ec9d90dac80d17f74c84;hpb=f6df1f1dd3735b66eaeab9a32e85615fe77e494d;p=quix0rs-gnu-social.git diff --git a/lib/imagefile.php b/lib/imagefile.php index 97aa85c1ff..a328df9852 100644 --- a/lib/imagefile.php +++ b/lib/imagefile.php @@ -63,7 +63,7 @@ class ImageFile if (!empty($this->id)) { $this->fileRecord = new File(); $this->fileRecord->id = $this->id; - if (!$this->find(true)) { + if (!$this->fileRecord->find(true)) { // If we have set an ID, we need that ID to exist! throw new NoResultException($this->fileRecord); } @@ -95,7 +95,7 @@ class ImageFile if ($this->type == IMAGETYPE_JPEG && function_exists('exif_read_data')) { // Orientation value to rotate thumbnails properly - $exif = exif_read_data($this->filepath); + $exif = @exif_read_data($this->filepath); if (is_array($exif) && isset($exif['Orientation'])) { switch ((int)$exif['Orientation']) { case 1: // top is top @@ -125,9 +125,17 @@ class ImageFile $imgPath = null; $media = common_get_mime_media($file->mimetype); if (Event::handle('CreateFileImageThumbnailSource', array($file, &$imgPath, $media))) { - if (empty($file->filename)) { + if (empty($file->filename) && !file_exists($imgPath)) { throw new UnsupportedMediaException(_('File without filename could not get a thumbnail source.')); } + + // First some mimetype specific exceptions + switch ($file->mimetype) { + case 'image/svg+xml': + throw new UseFileAsThumbnailException($file->id); + } + + // And we'll only consider it an image if it has such a media type switch ($media) { case 'image': $imgPath = $file->getPath(); @@ -142,11 +150,17 @@ class ImageFile } try { - $image = new ImageFile($file->id, $imgPath); + $image = new ImageFile($file->getID(), $imgPath); } catch (UnsupportedMediaException $e) { // Avoid deleting the original - if ($imgPath != $file->getPath()) { - unlink($imgPath); + try { + if ($imgPath !== $file->getPath()) { + @unlink($imgPath); + } + } catch (FileNotFoundException $e) { + // File reported (via getPath) that the original file + // doesn't exist anyway, so it's safe to delete $imgPath + @unlink($imgPath); } throw $e; } @@ -181,6 +195,8 @@ class ImageFile case UPLOAD_ERR_NO_FILE: // No file; probably just a non-AJAX submission. + throw new ClientException(_('No file uploaded.')); + default: common_log(LOG_ERR, __METHOD__ . ": Unknown upload error " . $_FILES[$param]['error']); // TRANS: Exception thrown when uploading an image fails for an unknown reason. @@ -198,31 +214,6 @@ class ImageFile return new ImageFile(null, $_FILES[$param]['tmp_name']); } - /** - * Compat interface for old code generating avatar thumbnails... - * Saves the scaled file directly into the avatar area. - * - * @param int $size target width & height -- must be square - * @param int $x (default 0) upper-left corner to crop from - * @param int $y (default 0) upper-left corner to crop from - * @param int $w (default full) width of image area to crop - * @param int $h (default full) height of image area to crop - * @return string filename - */ - function resize($size, $x = 0, $y = 0, $w = null, $h = null) - { - $targetType = $this->preferredType(); - $outname = Avatar::filename($this->id, - image_type_to_extension($targetType), - $size, - common_timestamp()); - $outpath = Avatar::path($outname); - $this->resizeTo($outpath, array('width'=>$size, 'height'=>$size, - 'x'=>$x, 'y'=>$y, - 'w'=>$w, 'h'=>$h)); - return $outname; - } - /** * Copy the image file to the given destination. * @@ -556,7 +547,7 @@ class ImageFile return $count > 1; } - public function getFileThumbnail($width, $height, $crop) + public function getFileThumbnail($width, $height, $crop, $upscale=false) { if (!$this->fileRecord instanceof File) { throw new ServerException('No File object attached to this ImageFile object.'); @@ -568,6 +559,15 @@ class ImageFile $crop = common_config('thumbnail', 'crop'); } + if (!$upscale) { + if ($width > $this->width) { + $width = $this->width; + } + if (!is_null($height) && $height > $this->height) { + $height = $this->height; + } + } + if ($height === null) { $height = $width; $crop = true; @@ -613,12 +613,17 @@ class ImageFile // Perform resize and store into file $this->resizeTo($outpath, $box); - // Avoid deleting the original - if ($this->getPath() != File_thumbnail::path($this->filename)) { - $this->unlink(); + try { + // Avoid deleting the original + if (!in_array($this->getPath(), [File::path($this->filename), File_thumbnail::path($this->filename)])) { + $this->unlink(); + } + } catch (FileNotFoundException $e) { + // $this->getPath() says the file doesn't exist anyway, so no point in trying to delete it! } - return File_thumbnail::saveThumbnail($this->fileRecord->id, - File_thumbnail::url($outname), + + return File_thumbnail::saveThumbnail($this->fileRecord->getID(), + null, // no url since we generated it ourselves and can dynamically generate the url $width, $height, $outname); }