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);
}
$this->type = $info[2];
$this->mimetype = $info['mime'];
- if ($this->type == IMAGETYPE_JPEG && function_exists('exif_read_data')) {
+ 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
$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);
+ }
+
+ // And we'll only consider it an image if it has such a media type
switch ($media) {
case 'image':
$imgPath = $file->getPath();
}
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;
}
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.
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.
*
}
if (!file_exists($outpath)) {
- throw new UseFileAsThumbnailException($this->id);
+ if ($this->fileRecord instanceof File) {
+ throw new UseFileAsThumbnailException($this->fileRecord);
+ } else {
+ throw new UnsupportedMediaException('No local File object exists for ImageFile.');
+ }
}
return $outpath;
}
fclose($fh);
- return $count > 1;
+ return $count >= 1; // number of animated frames apart from the original image
}
- 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.');
$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;
// 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);
}