From: Raphaƫl Gertz Date: Mon, 13 Oct 2025 13:30:47 +0000 (+0200) Subject: Add download action X-Git-Tag: 0.5.5~1 X-Git-Url: https://git.rapsys.eu/packbundle/commitdiff_plain/a26fe0faab15b48d3bac7ef4d48949a0fb0897c0?ds=inline Add download action Add width and height in thumb path Cleanup --- diff --git a/Controller.php b/Controller.php index 77a3e14..7728f2e 100644 --- a/Controller.php +++ b/Controller.php @@ -220,6 +220,57 @@ class Controller extends AbstractController implements ServiceSubscriberInterfac return $response; } + /** + * Return download file + * + * @param Request $request The Request instance + * @param string $hash The hash + * @param string $path The image path + * @return Response The rendered image + */ + public function download(Request $request, string $hash, string $path/*, string $_format*/): Response { + //Without matching hash + if ($hash !== $this->slugger->hash($path)) { + //Throw new exception + throw new NotFoundHttpException('Invalid download hash'); + //Without valid format + #} elseif ($_format !== 'jpeg' && $_format !== 'png' && $_format !== 'webp') { + # //Throw new exception + # throw new NotFoundHttpException('Invalid download format'); + } + + //Unshort path + $path = $this->slugger->unshort($short = $path); + + //Without file + if (!is_file($path) || !($mtime = stat($path)['mtime'])) { + //Throw new exception + throw new NotFoundHttpException('Unable to get thumb file'); + } + + //Read thumb from cache + $response = new BinaryFileResponse($path); + + //Set file name + $response->setContentDisposition(HeaderUtils::DISPOSITION_INLINE, basename($path)); + + //Set etag + //TODO: set etag to file content md5 ? cache it ? + $response->setEtag(md5($hash)); + + //Set last modified + $response->setLastModified(\DateTime::createFromFormat('U', strval($mtime))); + + //Set as public + $response->setPublic(); + + //Return 304 response if not modified + $response->isNotModified($request); + + //Return response + return $response; + } + /** * Return facebook image * @@ -257,6 +308,7 @@ class Controller extends AbstractController implements ServiceSubscriberInterfac $response->setContentDisposition(HeaderUtils::DISPOSITION_INLINE, 'facebook-'.$hash.'.'.$_format); //Set etag + //TODO: set etag to file content md5 ? cache it ? $response->setEtag(md5($hash)); //Set last modified @@ -443,6 +495,7 @@ class Controller extends AbstractController implements ServiceSubscriberInterfac $response->setContentDisposition(HeaderUtils::DISPOSITION_INLINE, basename($map)); //Set etag + //TODO: set etag to file content md5 ? cache it ? $response->setEtag(md5(serialize([$height, $width, $zoom, $latitude, $longitude]))); //Set last modified @@ -708,6 +761,7 @@ class Controller extends AbstractController implements ServiceSubscriberInterfac $response->setContentDisposition(HeaderUtils::DISPOSITION_INLINE, basename($map)); //Set etag + //TODO: set etag to file content md5 ? cache it ? $response->setEtag(md5(serialize([$height, $width, $zoom, $coordinate]))); //Set last modified @@ -751,16 +805,16 @@ class Controller extends AbstractController implements ServiceSubscriberInterfac $path = $this->slugger->unshort($short = $path); //Set thumb - $thumb = $this->config['cache'].'/'.$this->config['prefixes']['thumb'].$path.'.'.$_format; + $thumb = $this->config['cache'].'/'.$this->config['prefixes']['thumb'].$path.'.'.$width.'x'.$height.'.'.$_format; //Without file - if (!is_file($path) || !($updated = stat($path)['mtime'])) { + if (!is_file($path) || !($mtime = stat($path)['mtime'])) { //Throw new exception throw new NotFoundHttpException('Unable to get thumb file'); } //Without thumb up to date file - if (!is_file($thumb) || !($mtime = stat($thumb)['mtime']) || $mtime < $updated) { + if (!is_file($thumb) || !($updated = stat($thumb)['mtime']) || $updated < $mtime) { //Without existing thumb path if (!is_dir($dir = dirname($thumb))) { //Create filesystem object @@ -803,8 +857,8 @@ class Controller extends AbstractController implements ServiceSubscriberInterfac throw new \Exception(sprintf('Unable to write image "%s"', $thumb)); } - //Set mtime - $mtime = stat($thumb)['mtime']; + //Set updated + $updated = stat($thumb)['mtime']; } //Read thumb from cache @@ -814,10 +868,11 @@ class Controller extends AbstractController implements ServiceSubscriberInterfac $response->setContentDisposition(HeaderUtils::DISPOSITION_INLINE, 'thumb-'.$hash.'.'.$_format); //Set etag + //TODO: set etag to file content md5 ? cache it ? $response->setEtag(md5($hash)); //Set last modified - $response->setLastModified(\DateTime::createFromFormat('U', strval($mtime))); + $response->setLastModified(\DateTime::createFromFormat('U', strval($updated))); //Set as public $response->setPublic();