public function executeBinary(AgaviRequestDataHolder $request_data) { $response = $this->getResponse(); $fss = $this->getServiceLocator()->getFilesystemService(); $art = $this->getAttribute('aggregate_root_type'); $file_id = $request_data->getParameter('file'); $uri = $request_data->getParameter('file_uri'); if (empty($uri)) { $this->logError('Necessary request parameter from validation not provided: file_uri'); $response->setHttpStatusCode(500); return; } $last_modified_time = $fss->getTimestamp($uri); $etag = $file_id . '-' . $last_modified_time; $response->setHttpHeader('Last-Modified', gmdate('D, d M Y H:i:s', $last_modified_time) . ' GMT'); $response->setHttpHeader('Etag', $etag); // is timestamp sufficient as ETag? $etag_from_request = trim($request_data->getHeader('If-None-Match', '')); $timestamp_from_request = $request_data->getHeader('If-Modified-Since', false); $equal_time = $timestamp_from_request !== false && @strtotime($timestamp_from_request) == $last_modified_time; if ($etag_from_request === $etag || $equal_time) { $response->setHttpStatusCode(304); return; } $disposition = 'inline'; if ($request_data->getParameter('download') !== null) { $disposition = 'attachment'; } $content_type = $fss->getMimetype($uri); // TODO do we need this? with X-Sendfile header and HTTP 1.1 it's not mandatory I think, attribute info? $content_length = $fss->getSize($uri); $file_name = FileToolkit::slugify($file_id); $content_disposition = $disposition . '; filename=' . $file_name; $response->setHttpHeader('Content-Type', $content_type); $response->setHttpHeader('Content-Length', $content_length); $response->setHttpHeader('Content-Disposition', $content_disposition); $resource = $fss->readStream($uri); // $this->logInfo('Download request for', $uri, $resource); $response->setContent($resource); }
/** * Returns a file extension guessed for the given local file. * * @see Honeybee\Common\Util\FileToolkit::guessExtension * * @param string $file_path_path to file * @param string $fallback_extension extension to return on failed guess * * @return string default file extension for given mime type or fallback extension provided */ public function guessExtensionForLocalFile($file_path, $fallback_extension = '') { return FileToolkit::guessExtensionForLocalFile($file_path, $fallback_extension); }