X-Git-Url: http://source.bookstackapp.com/bookstack/blobdiff_plain/3b31ac75ec41b3990cea770a9e48e2066bd8e9a3..refs/pull/4728/head:/app/Uploads/Controllers/ImageController.php diff --git a/app/Uploads/Controllers/ImageController.php b/app/Uploads/Controllers/ImageController.php index fea0713a2..c68ffdf6b 100644 --- a/app/Uploads/Controllers/ImageController.php +++ b/app/Uploads/Controllers/ImageController.php @@ -4,23 +4,23 @@ namespace BookStack\Uploads\Controllers; use BookStack\Exceptions\ImageUploadException; use BookStack\Exceptions\NotFoundException; +use BookStack\Exceptions\NotifyException; use BookStack\Http\Controller; use BookStack\Uploads\Image; use BookStack\Uploads\ImageRepo; +use BookStack\Uploads\ImageResizer; use BookStack\Uploads\ImageService; +use BookStack\Util\OutOfMemoryHandler; use Exception; use Illuminate\Http\Request; -use Illuminate\Validation\ValidationException; class ImageController extends Controller { - protected ImageRepo $imageRepo; - protected ImageService $imageService; - - public function __construct(ImageRepo $imageRepo, ImageService $imageService) - { - $this->imageRepo = $imageRepo; - $this->imageService = $imageService; + public function __construct( + protected ImageRepo $imageRepo, + protected ImageService $imageService, + protected ImageResizer $imageResizer, + ) { } /** @@ -41,13 +41,10 @@ class ImageController extends Controller /** * Update image details. - * - * @throws ImageUploadException - * @throws ValidationException */ public function update(Request $request, string $id) { - $this->validate($request, [ + $data = $this->validate($request, [ 'name' => ['required', 'min:2', 'string'], ]); @@ -55,9 +52,7 @@ class ImageController extends Controller $this->checkImagePermission($image); $this->checkOwnablePermission('image-update', $image); - $image = $this->imageRepo->updateImageDetails($image, $request->all()); - - $this->imageRepo->loadThumbs($image); + $image = $this->imageRepo->updateImageDetails($image, $data); return view('pages.parts.image-manager-form', [ 'image' => $image, @@ -65,6 +60,33 @@ class ImageController extends Controller ]); } + /** + * Update the file for an existing image. + */ + public function updateFile(Request $request, string $id) + { + $this->validate($request, [ + 'file' => ['required', 'file', ...$this->getImageValidationRules()], + ]); + + $image = $this->imageRepo->getById($id); + $this->checkImagePermission($image); + $this->checkOwnablePermission('image-update', $image); + $file = $request->file('file'); + + new OutOfMemoryHandler(function () { + return $this->jsonError(trans('errors.image_upload_memory_limit')); + }); + + try { + $this->imageRepo->updateImageFile($image, $file); + } catch (ImageUploadException $exception) { + return $this->jsonError($exception->getMessage()); + } + + return response(''); + } + /** * Get the form for editing the given image. * @@ -79,12 +101,20 @@ class ImageController extends Controller $dependantPages = $this->imageRepo->getPagesUsingImage($image); } - $this->imageRepo->loadThumbs($image); - - return view('pages.parts.image-manager-form', [ + $viewData = [ 'image' => $image, 'dependantPages' => $dependantPages ?? null, - ]); + 'warning' => '', + ]; + + new OutOfMemoryHandler(function () use ($viewData) { + $viewData['warning'] = trans('errors.image_thumbnail_memory_limit'); + return response()->view('pages.parts.image-manager-form', $viewData); + }); + + $this->imageResizer->loadGalleryThumbnailsForImage($image, false); + + return view('pages.parts.image-manager-form', $viewData); } /** @@ -103,10 +133,29 @@ class ImageController extends Controller return response(''); } + /** + * Rebuild the thumbnails for the given image. + */ + public function rebuildThumbnails(string $id) + { + $image = $this->imageRepo->getById($id); + $this->checkImagePermission($image); + $this->checkOwnablePermission('image-update', $image); + + new OutOfMemoryHandler(function () { + return $this->jsonError(trans('errors.image_thumbnail_memory_limit')); + }); + + $this->imageResizer->loadGalleryThumbnailsForImage($image, true); + + return response(trans('components.image_rebuild_thumbs_success')); + } + /** * Check related page permission and ensure type is drawio or gallery. + * @throws NotifyException */ - protected function checkImagePermission(Image $image) + protected function checkImagePermission(Image $image): void { if ($image->type !== 'drawio' && $image->type !== 'gallery') { $this->showPermissionError();