diff options
Diffstat (limited to 'app/Http/Controllers/MediaFileController.php')
| -rw-r--r-- | app/Http/Controllers/MediaFileController.php | 422 |
1 files changed, 217 insertions, 205 deletions
diff --git a/app/Http/Controllers/MediaFileController.php b/app/Http/Controllers/MediaFileController.php index 3be2749451..5a4c30ee1d 100644 --- a/app/Http/Controllers/MediaFileController.php +++ b/app/Http/Controllers/MediaFileController.php @@ -43,241 +43,253 @@ use Throwable; /** * Controller for the media page and displaying images. */ -class MediaFileController extends AbstractBaseController { - /** - * Download a non-image media file. - * - * @param Request $request - * - * @return Response - */ - public function mediaDownload(Request $request): Response { - /** @var Tree $tree */ - $tree = $request->attributes->get('tree'); - $xref = $request->get('xref'); - $fact_id = $request->get('fact_id'); - $media = Media::getInstance($xref, $tree); +class MediaFileController extends AbstractBaseController +{ + /** + * Download a non-image media file. + * + * @param Request $request + * + * @return Response + */ + public function mediaDownload(Request $request): Response + { + /** @var Tree $tree */ + $tree = $request->attributes->get('tree'); + $xref = $request->get('xref'); + $fact_id = $request->get('fact_id'); + $media = Media::getInstance($xref, $tree); - if ($media === null) { - throw new MediaNotFoundException; - } + if ($media === null) { + throw new MediaNotFoundException; + } - if (!$media->canShow()) { - throw new AccessDeniedHttpException; - } + if (!$media->canShow()) { + throw new AccessDeniedHttpException; + } - foreach ($media->mediaFiles() as $media_file) { - if ($media_file->factId() === $fact_id) { - if ($media_file->isExternal()) { - return new RedirectResponse($media_file->filename()); - } + foreach ($media->mediaFiles() as $media_file) { + if ($media_file->factId() === $fact_id) { + if ($media_file->isExternal()) { + return new RedirectResponse($media_file->filename()); + } - if (!$media_file->isImage() && $media_file->fileExists()) { - $data = file_get_contents($media_file->getServerFilename()); - $response = new Response($data); + if (!$media_file->isImage() && $media_file->fileExists()) { + $data = file_get_contents($media_file->getServerFilename()); + $response = new Response($data); - $disposition = $response->headers->makeDisposition( - ResponseHeaderBag::DISPOSITION_ATTACHMENT, - basename($media_file->filename()) - ); + $disposition = $response->headers->makeDisposition( + ResponseHeaderBag::DISPOSITION_ATTACHMENT, + basename($media_file->filename()) + ); - $response->headers->set('Content-Disposition', $disposition); - $response->headers->set('Content-Type', $media_file->mimeType()); + $response->headers->set('Content-Disposition', $disposition); + $response->headers->set('Content-Type', $media_file->mimeType()); - return $response; - } - } - } + return $response; + } + } + } - throw new NotFoundHttpException; - } + throw new NotFoundHttpException; + } - /** - * Show an image/thumbnail, with/without a watermark. - * - * @param Request $request - * - * @return Response - */ - public function mediaThumbnail(Request $request): Response { - /** @var Tree $tree */ - $tree = $request->attributes->get('tree'); - $xref = $request->get('xref'); - $fact_id = $request->get('fact_id'); - $media = Media::getInstance($xref, $tree); + /** + * Show an image/thumbnail, with/without a watermark. + * + * @param Request $request + * + * @return Response + */ + public function mediaThumbnail(Request $request): Response + { + /** @var Tree $tree */ + $tree = $request->attributes->get('tree'); + $xref = $request->get('xref'); + $fact_id = $request->get('fact_id'); + $media = Media::getInstance($xref, $tree); - if ($media === null) { - return $this->httpStatusAsImage(Response::HTTP_NOT_FOUND); - } + if ($media === null) { + return $this->httpStatusAsImage(Response::HTTP_NOT_FOUND); + } - if (!$media->canShow()) { - return $this->httpStatusAsImage(Response::HTTP_FORBIDDEN); - } + if (!$media->canShow()) { + return $this->httpStatusAsImage(Response::HTTP_FORBIDDEN); + } - // @TODO handle SVG files - foreach ($media->mediaFiles() as $media_file) { - if ($media_file->factId() === $fact_id) { - if ($media_file->isExternal()) { - return new RedirectResponse($media_file->filename()); - } else if ($media_file->isImage()) { - return $this->generateImage($media_file, $request->query->all()); - } else { - return $this->fileExtensionAsImage($media_file->extension()); - } - } - } + // @TODO handle SVG files + foreach ($media->mediaFiles() as $media_file) { + if ($media_file->factId() === $fact_id) { + if ($media_file->isExternal()) { + return new RedirectResponse($media_file->filename()); + } else { + if ($media_file->isImage()) { + return $this->generateImage($media_file, $request->query->all()); + } else { + return $this->fileExtensionAsImage($media_file->extension()); + } + } + } + } - return $this->httpStatusAsImage(Response::HTTP_NOT_FOUND); - } + return $this->httpStatusAsImage(Response::HTTP_NOT_FOUND); + } - /** - * Generate a thumbnail for an unsed media file (i.e. not used by any media object). - * - * @param Request $request - * - * @return Response - */ - public function unusedMediaThumbnail(Request $request): Response { - $folder = $request->get('folder'); - $file = $request->get('file'); + /** + * Generate a thumbnail for an unsed media file (i.e. not used by any media object). + * + * @param Request $request + * + * @return Response + */ + public function unusedMediaThumbnail(Request $request): Response + { + $folder = $request->get('folder'); + $file = $request->get('file'); - try { - $server = $this->glideServer($folder); - $path = $server->makeImage($file, $request->query->all()); - $cache = $server->getCache(); + try { + $server = $this->glideServer($folder); + $path = $server->makeImage($file, $request->query->all()); + $cache = $server->getCache(); - return new Response($cache->read($path), Response::HTTP_OK, [ - 'Content-Type' => $cache->getMimeType($path), - 'Content-Length' => $cache->getSize($path), - 'Cache-Control' => 'max-age=31536000, public', - 'Expires' => date_create('+1 years')->format('D, d M Y H:i:s') . ' GMT', - ]); - } catch (FileNotFoundException $ex) { - return $this->httpStatusAsImage(Response::HTTP_NOT_FOUND); - } catch (NotReadableException $ex) { - return $this->httpStatusAsImage(Response::HTTP_INTERNAL_SERVER_ERROR); - } catch (Throwable $ex) { - return $this->httpStatusAsImage(Response::HTTP_INTERNAL_SERVER_ERROR); - } - } + return new Response($cache->read($path), Response::HTTP_OK, [ + 'Content-Type' => $cache->getMimeType($path), + 'Content-Length' => $cache->getSize($path), + 'Cache-Control' => 'max-age=31536000, public', + 'Expires' => date_create('+1 years')->format('D, d M Y H:i:s') . ' GMT', + ]); + } catch (FileNotFoundException $ex) { + return $this->httpStatusAsImage(Response::HTTP_NOT_FOUND); + } catch (NotReadableException $ex) { + return $this->httpStatusAsImage(Response::HTTP_INTERNAL_SERVER_ERROR); + } catch (Throwable $ex) { + return $this->httpStatusAsImage(Response::HTTP_INTERNAL_SERVER_ERROR); + } + } - /** - * Generate a thumbnail image for a file. - * - * @param MediaFile $media_file - * @param array $params - * - * @return Response - */ - private function generateImage(MediaFile $media_file, array $params): Response { - try { - // Validate HTTP signature - $signature = $this->glideSignature(); + /** + * Generate a thumbnail image for a file. + * + * @param MediaFile $media_file + * @param array $params + * + * @return Response + */ + private function generateImage(MediaFile $media_file, array $params): Response + { + try { + // Validate HTTP signature + $signature = $this->glideSignature(); - $signature->validateRequest(parse_url(WT_BASE_URL . 'index.php', PHP_URL_PATH), $params); + $signature->validateRequest(parse_url(WT_BASE_URL . 'index.php', PHP_URL_PATH), $params); - $server = $this->glideServer($media_file->folder()); - $path = $server->makeImage($media_file->filename(), $params); + $server = $this->glideServer($media_file->folder()); + $path = $server->makeImage($media_file->filename(), $params); - return new Response($server->getCache()->read($path), Response::HTTP_OK, [ - 'Content-Type' => $server->getCache()->getMimeType($path), - 'Content-Length' => $server->getCache()->getSize($path), - 'Cache-Control' => 'max-age=31536000, public', - 'Expires' => date_create('+1 years')->format('D, d M Y H:i:s') . ' GMT', - ]); - } catch (SignatureException $ex) { - return $this->httpStatusAsImage(Response::HTTP_FORBIDDEN); - } catch (FileNotFoundException $ex) { - return $this->httpStatusAsImage(Response::HTTP_NOT_FOUND); - } catch (Throwable $ex) { - Log::addErrorLog('Cannot create thumbnail ' . $ex->getMessage()); + return new Response($server->getCache()->read($path), Response::HTTP_OK, [ + 'Content-Type' => $server->getCache()->getMimeType($path), + 'Content-Length' => $server->getCache()->getSize($path), + 'Cache-Control' => 'max-age=31536000, public', + 'Expires' => date_create('+1 years')->format('D, d M Y H:i:s') . ' GMT', + ]); + } catch (SignatureException $ex) { + return $this->httpStatusAsImage(Response::HTTP_FORBIDDEN); + } catch (FileNotFoundException $ex) { + return $this->httpStatusAsImage(Response::HTTP_NOT_FOUND); + } catch (Throwable $ex) { + Log::addErrorLog('Cannot create thumbnail ' . $ex->getMessage()); - return $this->httpStatusAsImage(Response::HTTP_INTERNAL_SERVER_ERROR); - } - } + return $this->httpStatusAsImage(Response::HTTP_INTERNAL_SERVER_ERROR); + } + } - /** - * Create a glide server to generate files in the specified folder - * - * Caution: $media_folder may contain relative paths: ../../ - * - * @param string $media_folder - * - * @return Server - */ - private function glideServer(string $media_folder): Server { - $cache_folder = new Filesystem(new Local(WT_DATA_DIR . 'thumbnail-cache/' . md5($media_folder))); - $driver = $this->graphicsDriver(); - $source_folder = new Filesystem(new Local($media_folder)); - $watermark_folder = new Filesystem(new Local('resources/assets/img')); + /** + * Create a glide server to generate files in the specified folder + * + * Caution: $media_folder may contain relative paths: ../../ + * + * @param string $media_folder + * + * @return Server + */ + private function glideServer(string $media_folder): Server + { + $cache_folder = new Filesystem(new Local(WT_DATA_DIR . 'thumbnail-cache/' . md5($media_folder))); + $driver = $this->graphicsDriver(); + $source_folder = new Filesystem(new Local($media_folder)); + $watermark_folder = new Filesystem(new Local('resources/assets/img')); - return ServerFactory::create([ - 'cache' => $cache_folder, - 'driver' => $driver, - 'source' => $source_folder, - 'watermarks' => $watermark_folder, - ]); - } + return ServerFactory::create([ + 'cache' => $cache_folder, + 'driver' => $driver, + 'source' => $source_folder, + 'watermarks' => $watermark_folder, + ]); + } - /** - * Generate a signature, to verify the request parameters. - * - * @return Signature - */ - private function glideSignature(): Signature { - $glide_key = Site::getPreference('glide-key'); - $signature = SignatureFactory::create($glide_key); + /** + * Generate a signature, to verify the request parameters. + * + * @return Signature + */ + private function glideSignature(): Signature + { + $glide_key = Site::getPreference('glide-key'); + $signature = SignatureFactory::create($glide_key); - return $signature; - } + return $signature; + } - /** - * Which graphics driver should we use for glide/intervention? - * - * Prefer ImageMagick - * - * @return string - */ - private function graphicsDriver(): string { - if (extension_loaded('imagick')) { - $driver = 'imagick'; - } else { - $driver = 'gd'; - } + /** + * Which graphics driver should we use for glide/intervention? + * + * Prefer ImageMagick + * + * @return string + */ + private function graphicsDriver(): string + { + if (extension_loaded('imagick')) { + $driver = 'imagick'; + } else { + $driver = 'gd'; + } - return $driver; - } + return $driver; + } - /** - * Send a dummy image, to replace one that could not be found or created. - * - * @param int $status HTTP status code - * - * @return Response - */ - private function httpStatusAsImage(int $status): Response { - $svg = '<svg xmlns="http://www.w3.org/2000/svg" width="100" height="100"><rect width="100" height="100" fill="#F88" /><text x="5" y="55" font-family="Verdana" font-size="35">' . $status . '</text></svg>'; + /** + * Send a dummy image, to replace one that could not be found or created. + * + * @param int $status HTTP status code + * + * @return Response + */ + private function httpStatusAsImage(int $status): Response + { + $svg = '<svg xmlns="http://www.w3.org/2000/svg" width="100" height="100"><rect width="100" height="100" fill="#F88" /><text x="5" y="55" font-family="Verdana" font-size="35">' . $status . '</text></svg>'; - // We can't use the actual status code, as browser's won't show images with 4xx/5xx - return new Response($svg, Response::HTTP_OK, [ - 'Content-Type' => 'image/svg+xml' - ]); - } + // We can't use the actual status code, as browser's won't show images with 4xx/5xx + return new Response($svg, Response::HTTP_OK, [ + 'Content-Type' => 'image/svg+xml', + ]); + } - /** - * Send a dummy image, to replace a non-image file. - * - * @param string $extension - * - * @return Response - */ - private function fileExtensionAsImage(string $extension): Response { - $extension = '.' . strtolower($extension); + /** + * Send a dummy image, to replace a non-image file. + * + * @param string $extension + * + * @return Response + */ + private function fileExtensionAsImage(string $extension): Response + { + $extension = '.' . strtolower($extension); - $svg = '<svg xmlns="http://www.w3.org/2000/svg" width="100" height="100"><rect width="100" height="100" fill="#88F" /><text x="5" y="60" font-family="Verdana" font-size="30">' . $extension . '</text></svg>'; + $svg = '<svg xmlns="http://www.w3.org/2000/svg" width="100" height="100"><rect width="100" height="100" fill="#88F" /><text x="5" y="60" font-family="Verdana" font-size="30">' . $extension . '</text></svg>'; - return new Response($svg, Response::HTTP_OK, [ - 'Content-Type' => 'image/svg+xml' - ]); - } + return new Response($svg, Response::HTTP_OK, [ + 'Content-Type' => 'image/svg+xml', + ]); + } } |
