rootDirBasePath = $rootDirBasePath; $this->_rootDir = $filesystem->getDirectoryWrite($this->rootDirBasePath); $this->_fileStorageDatabase = $fileStorageDatabase; $this->_storageDatabaseFactory = $storageDatabaseFactory; $this->_fileFactory = $fileFactory; } /** * Custom options downloader * * @param array $info * @return void * @throws \Exception */ public function downloadFile($info) { $relativePath = $info['order_path']; if (!$this->_isCanProcessed($relativePath)) { //try get file from quote $relativePath = $info['quote_path']; if (!$this->_isCanProcessed($relativePath)) { throw new LocalizedException( __('Path "%1" is not part of allowed directory "%2"', $relativePath, $this->rootDirBasePath) ); } } $this->_fileFactory->create( $info['title'], ['value' => $this->_rootDir->getRelativePath($relativePath), 'type' => 'filename'], $this->rootDirBasePath, $info['type'] ); } /** * Method checks, if file can be returned depends on the given filepath * * @param string $relativePath * @return bool */ protected function _isCanProcessed($relativePath) { $filePath = $this->_rootDir->getAbsolutePath($relativePath); $pathWithFixedSeparator = str_replace('\\', '/', $this->_rootDir->getDriver()->getRealPath($filePath)); return (strpos($pathWithFixedSeparator, $relativePath) !== false && $this->_rootDir->isFile($relativePath) && $this->_rootDir->isReadable($relativePath)) || $this->_processDatabaseFile($filePath, $relativePath); } /** * Check file in database storage if needed and place it on file system * * @param string $filePath * @param string $relativePath * @return bool */ protected function _processDatabaseFile($filePath, $relativePath) { if (!$this->_fileStorageDatabase->checkDbUsage()) { return false; } $file = $this->_storageDatabaseFactory->create()->loadByFilename($relativePath); if (!$file->getId()) { return false; } $stream = $this->_rootDir->openFile($relativePath, 'w+'); $stream->lock(); $stream->write($filePath, $file->getContent()); $stream->unlock(); $stream->close(); return true; } }