[CORE] Fixed bug where all thumbnails were using the original file

This commit is contained in:
Miguel Dantas 2019-06-27 02:20:39 +01:00 committed by Diogo Cordeiro
parent bea06da531
commit 04d1caff78
4 changed files with 21 additions and 25 deletions

View File

@ -179,18 +179,17 @@ class AttachmentAction extends ManagedAction
} }
/** /**
* Include $this as a file read from $filepath, for viewing and downloading * Include $filepath in the response, for viewing and downloading
*/ */
public function sendFile(string $filepath) { static function sendFile(string $filepath, int $size) {
if (common_config('site', 'use_x_sendfile')) { if (common_config('site', 'use_x_sendfile')) {
header('X-Sendfile: ' . $filepath); header('X-Sendfile: ' . $filepath);
} else { } else {
$filesize = $this->attachment->size; // ensure we have a file size
// 'if available', it says, so ensure we have it if (empty($size)) {
if (empty($filesize)) { $size = filesize($filepath);
$filesize = filesize($filepath);
} }
header("Content-Length: {$filesize}"); header("Content-Length: {$size}");
// header('Cache-Control: private, no-transform, no-store, must-revalidate'); // header('Cache-Control: private, no-transform, no-store, must-revalidate');
$ret = @readfile($filepath); $ret = @readfile($filepath);

View File

@ -17,7 +17,7 @@ class Attachment_downloadAction extends AttachmentAction
{ {
// Checks file exists or throws FileNotStoredLocallyException // Checks file exists or throws FileNotStoredLocallyException
$filepath = $this->attachment->getPath(); $filepath = $this->attachment->getPath();
$filesize = $this->attachment->size;
$filename = MediaFile::getDisplayName($this->attachment); $filename = MediaFile::getDisplayName($this->attachment);
// Disable errors, to not mess with the file contents (suppress errors in case access to this // Disable errors, to not mess with the file contents (suppress errors in case access to this
@ -31,6 +31,6 @@ class Attachment_downloadAction extends AttachmentAction
header('Expires: 0'); header('Expires: 0');
header('Content-Transfer-Encoding: binary'); // FIXME? Can this be different? header('Content-Transfer-Encoding: binary'); // FIXME? Can this be different?
$this->sendFile($filepath); parent::sendFile($filepath, $filesize);
} }
} }

View File

@ -57,13 +57,21 @@ class Attachment_thumbnailAction extends AttachmentAction
{ {
// Returns a File_thumbnail object or throws exception if not available // Returns a File_thumbnail object or throws exception if not available
try { try {
$file = $this->attachment->getThumbnail($this->thumb_w, $this->thumb_h, $this->thumb_c)->getFile(); $thumb = $this->attachment->getThumbnail($this->thumb_w, $this->thumb_h, $this->thumb_c);
$file = $thumb->getFile();
} catch (UseFileAsThumbnailException $e) { } catch (UseFileAsThumbnailException $e) {
// With this exception, the file exists locally // With this exception, the file exists locally
$file = $e->file; $file = $e->file;
} }
$filepath = $this->attachment->getPath(); if (!empty($thumb)) {
$filepath = $thumb->getPath();
$filesize = 0;
} else {
$filepath = $file->getPath();
$filesize = $file->size;
}
$filename = MediaFile::getDisplayName($file); $filename = MediaFile::getDisplayName($file);
// Disable errors, to not mess with the file contents (suppress errors in case access to this // Disable errors, to not mess with the file contents (suppress errors in case access to this
@ -76,19 +84,7 @@ class Attachment_thumbnailAction extends AttachmentAction
header("Content-Disposition: inline; filename=\"{$filename}\""); header("Content-Disposition: inline; filename=\"{$filename}\"");
header('Expires: 0'); header('Expires: 0');
header('Content-Transfer-Encoding: binary'); header('Content-Transfer-Encoding: binary');
$filesize = $this->file->size;
// 'if available', it says, so ensure we have it
if (empty($filesize)) {
$filesize = filesize($this->attachment->filename);
}
header("Content-Length: {$filesize}");
// header('Cache-Control: private, no-transform, no-store, must-revalidate');
$ret = @readfile($filepath); parent::sendFile($filepath, $filesize);
if ($ret === false || $ret !== $filesize) {
common_log(LOG_ERR, "The lengths of the file as recorded on the DB (or on disk) for the file " .
"{$filepath}, with id={$this->attachment->id} differ from what was sent to the user.");
}
} }
} }

View File

@ -15,6 +15,7 @@ class Attachment_viewAction extends AttachmentAction
{ {
// Checks file exists or throws FileNotStoredLocallyException // Checks file exists or throws FileNotStoredLocallyException
$filepath = $this->attachment->getPath(); $filepath = $this->attachment->getPath();
$filesize = $this->attachment->size;
$filename = MediaFile::getDisplayName($this->attachment); $filename = MediaFile::getDisplayName($this->attachment);
@ -33,6 +34,6 @@ class Attachment_viewAction extends AttachmentAction
header('Expires: 0'); header('Expires: 0');
header('Content-Transfer-Encoding: binary'); header('Content-Transfer-Encoding: binary');
$this->sendFile($filepath); parrent::sendFile($filepath, $filesize);
} }
} }