123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122 |
- <?php
- /**
- *
- * Copyright © Magento, Inc. All rights reserved.
- * See COPYING.txt for license details.
- */
- namespace Magento\Framework\App\Response\Http;
- use Magento\Framework\App\Filesystem\DirectoryList;
- class FileFactory
- {
- /**
- * @var \Magento\Framework\App\ResponseInterface
- */
- protected $_response;
- /**
- * @var \Magento\Framework\Filesystem
- */
- protected $_filesystem;
- /**
- * @param \Magento\Framework\App\ResponseInterface $response
- * @param \Magento\Framework\Filesystem $filesystem
- */
- public function __construct(
- \Magento\Framework\App\ResponseInterface $response,
- \Magento\Framework\Filesystem $filesystem
- ) {
- $this->_response = $response;
- $this->_filesystem = $filesystem;
- }
- /**
- * 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;
- $fileContent = $this->getFileContent($content);
- 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($fileContent) : $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, $fileContent);
- $file = $fileName;
- $stream = $dir->openFile($fileName, 'r');
- while (!$stream->eof()) {
- echo $stream->read(1024);
- }
- }
- $stream->close();
- flush();
- if (!empty($content['rm'])) {
- $dir->delete($file);
- }
- }
- return $this->_response;
- }
- /**
- * Returns file content for writing.
- *
- * @param string|array $content
- * @return string|array
- */
- private function getFileContent($content)
- {
- if (isset($content['type']) && $content['type'] === 'string') {
- return $content['value'];
- }
- return $content;
- }
- }
|