Magento2 파일 다운로드 작업


답변:


19

\Magento\Backend\App\Action백엔드 또는 \Magento\Framework\App\Action\Action프론트 엔드 로 확장하여 컨트롤러 조치를 작성할 수 있습니다 .
다음과 같이 보이게하십시오.

<?php 
namespace Your\Namespace\Here;

class ClassName extends \Magento\Backend\App\Action 
{
    public function __construct(
        \Magento\Framework\Controller\Result\RawFactory $resultRawFactory,
        \Magento\Framework\App\Response\Http\FileFactory $fileFactory,
        \Magento\Backend\App\Action\Context $context
    ) {
        $this->resultRawFactory      = $resultRawFactory;
        $this->fileFactory           = $fileFactory;
        parent::__construct($context);
    }
    public function execute()
    {
        //do your custom stuff here
        $fileName = 'file name for download here';
        $this->fileFactory->create(
            $fileName,
            null, //content here. it can be null and set later 
            base dir of the file to download here
            'application/octet-stream', //content type here
            content lenght here...can be null
        );
        $resultRaw = $this->resultRawFactory->create();
        $resultRaw->setContents(contents of file here); //set content for download file here
        return $resultRaw;
    }
}

null로 내용을 전달하는 방법, 위의 방법을 사용하여 전달할 때 데이터 배열이 있습니다.
Rakesh Jesadiya

3
$this->fileFactory->create()이미 응답 구현이므로 그 결과를 직접 반환 할 수 있습니다.$resultRaw
Fabian Schmengler

@fschmengler 당신이 옳을 수도 있지만 백업 다운로드 작업 의 핵심 에서이 예제 가져 왔습니다 .
Marius

1
대부분의 M2 코어 모듈은 나쁜 예입니다.)
Fabian Schmengler

예 예 토론을 알고 있습니다. 나는 실제로 그것의 일부를 시작했다고 생각합니다. 그러나 이것은 항상 사실이 아닙니다
Marius

8

또한 다운로드하려는 파일의 경로를 제공 할 수도 있습니다.

//Send file for download
//@see Magento\Framework\App\Response\Http\FileFactory::create()
return $this->_fileFactory->create(
    //File name you would like to download it by
    $filename,
    [
        'type'  => "filename", //type has to be "filename"
        'value' => "folder/{$filename}", // path will append to the
                                         // base dir
        'rm'    => true, // add this only if you would like the file to be
                         // deleted after being downloaded from server
    ],
    \Magento\Framework\App\Filesystem\DirectoryList::MEDIA
);

2

Marius가 제공 한 답변을 기반으로합니다.

class Download extends \Magento\Framework\App\Action\Action
{
    protected $resultRawFactory;
    protected $fileFactory;

    public function __construct(
        \Magento\Framework\Controller\Result\RawFactory $resultRawFactory,
        \Magento\Framework\App\Response\Http\FileFactory $fileFactory,
        \Magento\Backend\App\Action\Context $context
    ) {
        $this->resultRawFactory      = $resultRawFactory;
        $this->fileFactory           = $fileFactory;
        parent::__construct($context);
    }
    public function execute()
    {
        try{
            $fileName = 'FileName'; // the name of the downloaded resource
            $this->fileFactory->create(
                $fileName,
                [
                    'type' => 'filename',
                    'value' => 'relative/path/to/file/from/basedir'
                ],
                DirectoryList::MEDIA , //basedir
                'application/octet-stream',
                '' // content length will be dynamically calculated
            );
        }catch (\Exception $exception){
            // Add your own failure logic here
            var_dump($exception->getMessage());
            exit;
        }
        $resultRaw = $this->resultRawFactory->create();
        return $resultRaw;
    }
}

올바른 권한이 없으면 (여기에서 읽기가 필요하지만 Magento가 쓰기 권한을 검사하더라도) 이상한 오류가 발생합니다. "사이트가 다운되었거나 이동되었습니다"또는 그런 것입니다.

$ fileFactory-> create () 내부의 논리를 살펴볼 가치가 있습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.