From abfe0cf94d715ac17250f400dc1d01b3fc2b8922 Mon Sep 17 00:00:00 2001 From: Varun Patil Date: Wed, 29 Mar 2023 15:05:05 -0700 Subject: [PATCH] image: throw proper errors in decodable (close #529) Signed-off-by: Varun Patil --- lib/Controller/ImageController.php | 44 ++++++++++++++++++++++++++---- 1 file changed, 38 insertions(+), 6 deletions(-) diff --git a/lib/Controller/ImageController.php b/lib/Controller/ImageController.php index 7fd2131e..6413322e 100644 --- a/lib/Controller/ImageController.php +++ b/lib/Controller/ImageController.php @@ -260,12 +260,7 @@ class ImageController extends GenericApiController // Convert image to JPEG if required if (!\in_array($mimetype, ['image/png', 'image/webp', 'image/jpeg', 'image/gif'], true)) { - $image = new \Imagick(); - $image->readImageBlob($blob); - $image->setImageFormat('jpeg'); - $image->setImageCompressionQuality(95); - $blob = $image->getImageBlob(); - $mimetype = $image->getImageMimeType(); + [$blob, $mimetype] = $this->getImageJPEG($blob, $mimetype); } // Return the image @@ -276,6 +271,43 @@ class ImageController extends GenericApiController }); } + /** + * Given a blob of image data, return a JPEG blob. + * + * @param string $blob Blob of image data in any format + * @param string $mimetype Mimetype of image data + * + * @return array [blob, mimetype] + */ + private function getImageJPEG($blob, $mimetype): array { + // TODO: Use imaginary if available + + // Check if Imagick is available + if (!\class_exists('Imagick')) { + throw Exceptions::Forbidden('Imagick extension is not available'); + } + + // Read original image + try { + $image = new \Imagick(); + $image->readImageBlob($blob); + } catch (\ImagickException $e) { + throw Exceptions::Forbidden('Imagick failed to read image: '. $e->getMessage()); + } + + // Convert to JPEG + try { + $image->setImageFormat('jpeg'); + $image->setImageCompressionQuality(95); + $blob = $image->getImageBlob(); + $mimetype = $image->getImageMimeType(); + } catch (\ImagickException $e) { + throw Exceptions::Forbidden('Imagick failed to convert image: '. $e->getMessage()); + } + + return [$blob, $mimetype]; + } + /** * Get the tags for a file. */