Delete file on class destruction or we do it too quickly

Source image was removed when trying to use it for resizeTo
This commit is contained in:
Mikael Nordfeldth 2016-07-21 00:23:27 +02:00
parent fc440ba7e7
commit e8e996182f

View File

@ -120,6 +120,14 @@ class ImageFile
Event::handle('FillImageFileMetadata', array($this)); Event::handle('FillImageFileMetadata', array($this));
} }
public function __destruct()
{
if (strlen($this->filepath) > 0 && (!$this->fileRecord instanceof File || $this->filepath !== $this->fileRecord->getPath())) {
common_debug(__METHOD__.': Deleting temporary file that was created as image file thumbnail source: '._ve($this->filepath));
@unlink($this->filepath);
}
}
public static function fromFileObject(File $file) public static function fromFileObject(File $file)
{ {
$imgPath = null; $imgPath = null;
@ -152,9 +160,6 @@ class ImageFile
try { try {
$image = new ImageFile($file->getID(), $imgPath); $image = new ImageFile($file->getID(), $imgPath);
} catch (Exception $e) { } catch (Exception $e) {
common_debug(sprintf('Exception caught when creating ImageFile for File id==%s and imgPath==', _ve($file->id), _ve($imgPath)));
throw $e;
} finally {
// Avoid deleting the original // Avoid deleting the original
try { try {
if (strlen($imgPath) > 0 && $imgPath !== $file->getPath()) { if (strlen($imgPath) > 0 && $imgPath !== $file->getPath()) {
@ -166,6 +171,8 @@ class ImageFile
// doesn't exist anyway, so it's safe to delete $imgPath // doesn't exist anyway, so it's safe to delete $imgPath
@unlink($imgPath); @unlink($imgPath);
} }
common_debug(sprintf('Exception caught when creating ImageFile for File id==%s and imgPath==', _ve($file->id), _ve($imgPath)));
throw $e;
} }
return $image; return $image;
} }
@ -587,7 +594,7 @@ class ImageFile
list($width, $height, $x, $y, $w, $h) = $this->scaleToFit($width, $height, $crop); list($width, $height, $x, $y, $w, $h) = $this->scaleToFit($width, $height, $crop);
$thumb = File_thumbnail::pkeyGet(array( $thumb = File_thumbnail::pkeyGet(array(
'file_id'=> $this->fileRecord->id, 'file_id'=> $this->fileRecord->getID(),
'width' => $width, 'width' => $width,
'height' => $height, 'height' => $height,
)); ));
@ -597,7 +604,7 @@ class ImageFile
$filename = $this->fileRecord->filehash ?: $this->filename; // Remote files don't have $this->filehash $filename = $this->fileRecord->filehash ?: $this->filename; // Remote files don't have $this->filehash
$extension = File::guessMimeExtension($this->mimetype); $extension = File::guessMimeExtension($this->mimetype);
$outname = "thumb-{$this->fileRecord->id}-{$width}x{$height}-{$filename}." . $extension; $outname = "thumb-{$this->fileRecord->getID()}-{$width}x{$height}-{$filename}." . $extension;
$outpath = File_thumbnail::path($outname); $outpath = File_thumbnail::path($outname);
// The boundary box for our resizing // The boundary box for our resizing
@ -615,7 +622,7 @@ class ImageFile
throw new ServerException('Bad thumbnail size parameters.'); throw new ServerException('Bad thumbnail size parameters.');
} }
common_debug(sprintf('Generating a thumbnail of File id==%u of size %ux%u', $this->fileRecord->id, $width, $height)); common_debug(sprintf('Generating a thumbnail of File id==%u of size %ux%u', $this->fileRecord->getID(), $width, $height));
// Perform resize and store into file // Perform resize and store into file
$this->resizeTo($outpath, $box); $this->resizeTo($outpath, $box);