/** * Thumbnail renderer action * * @return array */ public function renderAction() { $redir = false; $params = $this->params(); $pathname = $params->fromRoute('pathname'); $matches = array(); $hasMatch = preg_match('#^(.+)/([^/]+)/([0-9x\\-]+)/([^/]+)/' . '([^/]+)/([0-9]+)/([^/\\?]+)(\\?.*)?$#', $pathname, $matches); if (!$hasMatch) { return $this->error(400); } list(, $this->path, $this->method, $sizes, $this->bgColor, $filters, $mtime, $this->file) = $matches; $sizes = explode('-', $sizes, 3); if (count($sizes) == 3) { $this->crop = true; list($this->width, $this->height) = explode('x', $sizes[2], 2); list($this->cropLeft, $this->cropTop) = explode('x', $sizes[0], 2); list($this->cropWidth, $this->cropHeight) = explode('x', $sizes[1], 2); } else { $this->crop = false; list($this->width, $this->height) = explode('x', $sizes[0], 2); } $mtime = (int) $mtime; $this->width = (int) $this->width; $this->height = (int) $this->height; $inputPath = Thumbnail::THUMBNAIL_BASEPATH . '/' . $this->filePath(); if (0 == $this->width && self::MIN_HEIGHT <= $this->height && is_file($inputPath) && filesize($inputPath) > 0) { $inputSizes = getimagesize($inputPath); if (!empty($inputSizes[0]) && !empty($inputSizes[1])) { $this->width = (int) ($inputSizes[0] * $this->height / $inputSizes[1]); $redir = true; } } if (0 == $this->height && self::MIN_WIDTH <= $this->width && is_file($inputPath) && filesize($inputPath) > 0) { $inputSizes = getimagesize($inputPath); if (!empty($inputSizes[0]) && !empty($inputSizes[1])) { $this->height = (int) ($inputSizes[1] * $this->width / $inputSizes[0]); $redir = true; } } if (self::MIN_WIDTH > $this->width) { $this->width = self::DEFAULT_WIDTH; $redir = true; } if (self::MIN_HEIGHT > $this->height) { $this->height = self::DEFAULT_HEIGHT; $redir = true; } if (!is_file($inputPath)) { return $this->error(404); } if (1 > filesize($inputPath)) { return $this->error(415); } if (preg_match('#^image/(x-|vnd.microsoft.)?icon?$#', $this->getMime($inputPath))) { return $this->redirect()->toUrl('/uploads/' . $this->filePath()); } if ($filters == 'none') { $this->filters = array(); } else { $this->filters = explode('-', $filters); } if (!Image::isResize($this->method)) { $this->method = self::DEFAULT_METHOD; $redir = true; } foreach ($this->filters as $index => $filter) { $filter = explode(',', $filter); if (!Image::isFilter($filter[0])) { unset($this->filters[$index]); } } if (empty($this->filters)) { $newFilters = 'none'; } else { $newFilters = implode('-', $this->filters); } if ($filters != $newFilters) { $redir = true; } $fmt = filemtime($inputPath); if ($fmt != $mtime) { $mtime = $fmt; $redir = true; } if ($redir) { return $this->redirect()->toUrl($this->outputUri($mtime)); } if (!$this->getImage($inputPath)) { return $this->error(415); } if ($this->crop) { $this->getImage()->cropTo($this->cropLeft, $this->cropTop, $this->cropWidth, $this->cropHeight); } $this->getImage()->resize($this->width, $this->height, $this->method, $this->bgColor); foreach ($this->filters as $filter) { $filter = explode(',', $filter); $name = array_shift($filter); $this->getImage()->filter($name, $filter); } $outputPath = $this->outputPath($mtime); if (!is_dir(dirname($outputPath))) { mkdir(dirname($outputPath), 0777, true); } $this->getImage()->render($outputPath); $response = Readfile::fromFile($outputPath, Image::typeToMimeType($this->getImage()->getType())); $this->getEvent()->setResponse($response); return $response; }
/** * Test render with unknown type * * @expectedException Zork\Image\Exception\ExceptionInterface */ public function testRenderWithUnknownType() { $image = Image::create(100, 100); $image->render('/tmp/~' . uniqid(), -1); }