mirror of
https://github.com/BookStackApp/BookStack.git
synced 2025-12-13 07:42:23 +03:00
@@ -55,7 +55,7 @@ class ImageResizer
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* Get the thumbnail for an image.
|
* Get the thumbnail for an image.
|
||||||
* If $keepRatio is true only the width will be used.
|
* If $keepRatio is true, only the width will be used.
|
||||||
* Checks the cache then storage to avoid creating / accessing the filesystem on every check.
|
* Checks the cache then storage to avoid creating / accessing the filesystem on every check.
|
||||||
*
|
*
|
||||||
* @throws Exception
|
* @throws Exception
|
||||||
@@ -84,7 +84,7 @@ class ImageResizer
|
|||||||
return $this->storage->getPublicUrl($cachedThumbPath);
|
return $this->storage->getPublicUrl($cachedThumbPath);
|
||||||
}
|
}
|
||||||
|
|
||||||
// If thumbnail has already been generated, serve that and cache path
|
// If a thumbnail has already been generated, serve that and cache path
|
||||||
$disk = $this->storage->getDisk($image->type);
|
$disk = $this->storage->getDisk($image->type);
|
||||||
if (!$shouldCreate && $disk->exists($thumbFilePath)) {
|
if (!$shouldCreate && $disk->exists($thumbFilePath)) {
|
||||||
Cache::put($thumbCacheKey, $thumbFilePath, static::THUMBNAIL_CACHE_TIME);
|
Cache::put($thumbCacheKey, $thumbFilePath, static::THUMBNAIL_CACHE_TIME);
|
||||||
@@ -110,7 +110,7 @@ class ImageResizer
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Resize the image of given data to the specified size, and return the new image data.
|
* Resize the image of given data to the specified size and return the new image data.
|
||||||
* Format will remain the same as the input format, unless specified.
|
* Format will remain the same as the input format, unless specified.
|
||||||
*
|
*
|
||||||
* @throws ImageUploadException
|
* @throws ImageUploadException
|
||||||
@@ -125,6 +125,7 @@ class ImageResizer
|
|||||||
try {
|
try {
|
||||||
$thumb = $this->interventionFromImageData($imageData, $format);
|
$thumb = $this->interventionFromImageData($imageData, $format);
|
||||||
} catch (Exception $e) {
|
} catch (Exception $e) {
|
||||||
|
Log::error('Failed to resize image with error:' . $e->getMessage());
|
||||||
throw new ImageUploadException(trans('errors.cannot_create_thumbs'));
|
throw new ImageUploadException(trans('errors.cannot_create_thumbs'));
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -154,17 +155,21 @@ class ImageResizer
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* Create an intervention image instance from the given image data.
|
* Create an intervention image instance from the given image data.
|
||||||
* Performs some manual library usage to ensure image is specifically loaded
|
* Performs some manual library usage to ensure the image is specifically loaded
|
||||||
* from given binary data instead of data being misinterpreted.
|
* from given binary data instead of data being misinterpreted.
|
||||||
*/
|
*/
|
||||||
protected function interventionFromImageData(string $imageData, ?string $fileType): InterventionImage
|
protected function interventionFromImageData(string $imageData, ?string $fileType): InterventionImage
|
||||||
{
|
{
|
||||||
|
if (!extension_loaded('gd')) {
|
||||||
|
throw new ImageUploadException('The PHP "gd" extension is required to resize images, but is missing.');
|
||||||
|
}
|
||||||
|
|
||||||
$manager = new ImageManager(
|
$manager = new ImageManager(
|
||||||
new Driver(),
|
new Driver(),
|
||||||
autoOrientation: false,
|
autoOrientation: false,
|
||||||
);
|
);
|
||||||
|
|
||||||
// Ensure gif images are decoded natively instead of deferring to intervention GIF
|
// Ensure GIF images are decoded natively instead of deferring to intervention GIF
|
||||||
// handling since we don't need the added animation support.
|
// handling since we don't need the added animation support.
|
||||||
$isGif = $fileType === 'gif';
|
$isGif = $fileType === 'gif';
|
||||||
$decoder = $isGif ? NativeObjectDecoder::class : BinaryImageDecoder::class;
|
$decoder = $isGif ? NativeObjectDecoder::class : BinaryImageDecoder::class;
|
||||||
@@ -223,7 +228,7 @@ class ImageResizer
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Checks if the image is a gif. Returns true if it is, else false.
|
* Checks if the image is a GIF. Returns true if it is, else false.
|
||||||
*/
|
*/
|
||||||
protected function isGif(Image $image): bool
|
protected function isGif(Image $image): bool
|
||||||
{
|
{
|
||||||
@@ -250,7 +255,7 @@ class ImageResizer
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* Check if the given avif image data represents an animated image.
|
* Check if the given avif image data represents an animated image.
|
||||||
* This is based up the answer here: https://stackoverflow.com/a/79457313
|
* This is based upon the answer here: https://stackoverflow.com/a/79457313
|
||||||
*/
|
*/
|
||||||
protected function isAnimatedAvifData(string &$imageData): bool
|
protected function isAnimatedAvifData(string &$imageData): bool
|
||||||
{
|
{
|
||||||
|
|||||||
Reference in New Issue
Block a user