/** * Declare headers and content file in response for file download * * @param string $fileName * @param string|array $content set to null to avoid starting output, $contentLength should be set explicitly in * that case * @param string $baseDir * @param string $contentType * @param int $contentLength explicit content length, if strlen($content) isn't applicable * @throws \Exception * @throws \InvalidArgumentException * @return \Magento\Framework\App\ResponseInterface * * @SuppressWarnings(PHPMD.CyclomaticComplexity) * @SuppressWarnings(PHPMD.NPathComplexity) * @SuppressWarnings(PHPMD.ExitExpression) */ public function create($fileName, $content, $baseDir = DirectoryList::ROOT, $contentType = 'application/octet-stream', $contentLength = null) { $dir = $this->_filesystem->getDirectoryWrite($baseDir); $isFile = false; $file = null; if (is_array($content)) { if (!isset($content['type']) || !isset($content['value'])) { throw new \InvalidArgumentException("Invalid arguments. Keys 'type' and 'value' are required."); } if ($content['type'] == 'filename') { $isFile = true; $file = $content['value']; if (!$dir->isFile($file)) { throw new \Exception((string) new \Magento\Framework\Phrase('File not found')); } $contentLength = $dir->stat($file)['size']; } } $this->_response->setHttpResponseCode(200)->setHeader('Pragma', 'public', true)->setHeader('Cache-Control', 'must-revalidate, post-check=0, pre-check=0', true)->setHeader('Content-type', $contentType, true)->setHeader('Content-Length', $contentLength === null ? strlen($content) : $contentLength, true)->setHeader('Content-Disposition', 'attachment; filename="' . $fileName . '"', true)->setHeader('Last-Modified', date('r'), true); if ($content !== null) { $this->_response->sendHeaders(); if ($isFile) { $stream = $dir->openFile($file, 'r'); while (!$stream->eof()) { echo $stream->read(1024); } } else { $dir->writeFile($fileName, $content); $stream = $dir->openFile($fileName, 'r'); while (!$stream->eof()) { echo $stream->read(1024); } } $stream->close(); flush(); if (!empty($content['rm'])) { $dir->delete($file); } $this->callExit(); } return $this->_response; }
/** * Fetches and outputs file to user browser * $info is array with following indexes: * - 'path' - full file path * - 'type' - mime type of file * - 'size' - size of file * - 'title' - user-friendly name of file (usually - original name as uploaded in Magento) * * @param \Magento\Framework\App\ResponseInterface $response * @param string $filePath * @param array $info * @return bool */ public function downloadFileOption($response, $filePath, $info) { try { $response->setHttpResponseCode(200)->setHeader('Pragma', 'public', true)->setHeader('Cache-Control', 'must-revalidate, post-check=0, pre-check=0', true)->setHeader('Content-type', $info['type'], true)->setHeader('Content-Length', $info['size'])->setHeader('Content-Disposition', 'inline' . '; filename=' . $info['title'])->clearBody(); $response->sendHeaders(); echo $this->directory->readFile($this->directory->getRelativePath($filePath)); } catch (\Exception $e) { return false; } return true; }