/** * Render image directly * * @param string $request_path The `Request::path()` * @return string The path, relative to the storage disk, to the crop */ public function render($request_path) { // Get crop path relative to it's dir $crop_path = $this->url->relativePath($request_path); // If the crops_dir is a remote disk and if the crop has already been // created. If it has, just return that path. if ($this->storage->cropsAreRemote() && $this->storage->cropExists($crop_path)) { return $crop_path; } // Parse the path. In the case there is an error (the pattern on the route // SHOULD have caught all errors with the pattern) just return if (!($params = $this->url->parse($request_path))) { return; } list($path, $width, $height, $options) = $params; // Check if there are too many crops already if ($this->storage->tooManyCrops($path)) { throw new Exception('Croppa: Max crops'); } // Increase memory limit, cause some images require a lot to resize if ($this->config['memory_limit'] !== null) { ini_set('memory_limit', $this->config['memory_limit']); } // Build a new image using fetched image data $image = new Image($this->storage->readSrc($path), $this->url->phpThumbConfig($options)); // Process the image and write its data to disk $this->storage->writeCrop($crop_path, $image->process($width, $height, $options)->get()); // Return the paht to the crop, relative to the storage disk return $crop_path; }
/** * Handles a Croppa style route * * @param string $request The `Request::path()` * @throws Exception * @return Symfony\Component\HttpFoundation\StreamedResponse */ public function handle($request) { // Validate the signing token if (($token = $this->url->signingToken($request)) && $token != $this->request->input('token')) { throw new NotFoundHttpException('Token missmatch'); } // Get crop path relative to it's dir $crop_path = $this->url->relativePath($request); // If the crops_dir is a remote disk, check if the path exists on it and redirect if (($remote_crops = $this->storage->cropsAreRemote()) && $this->storage->cropExists($crop_path)) { return new RedirectResponse($this->url->pathToUrl($crop_path), 301); } // Parse the path. In the case there is an error (the pattern on the route // SHOULD have caught all errors with the pattern) just return if (!($params = $this->url->parse($request))) { return; } list($path, $width, $height, $options) = $params; // Check if there are too many crops already if ($this->storage->tooManyCrops($path)) { throw new Exception('Croppa: Max crops'); } // Increase memory limit, cause some images require a lot to resize if ($this->config['memory_limit'] !== null) { ini_set('memory_limit', $this->config['memory_limit']); } // Build a new image using fetched image data $image = new Image($this->storage->readSrc($path), $this->url->phpThumbConfig($options)); // Process the image and write its data to disk $this->storage->writeCrop($crop_path, $image->process($width, $height, $options)->get()); // Redirect to remote crops ... if ($remote_crops) { return new RedirectResponse($this->url->pathToUrl($crop_path), 301); // ... or echo the image data to the browser } else { $absolute_path = $this->storage->getLocalCropsDirPath() . '/' . $crop_path; return new BinaryFileResponse($absolute_path, 200, ['Content-Type' => $this->getContentType($path)]); } }