Tindakan pengunduhan file Magento2

11

Apakah ada metode utilitas magento yang tersedia yang dapat membantu saya membuat tindakan pengunduhan konten paksa?

Atish Goswami
sumber
1
jenis / ekstensi file mana yang perlu Anda unduh dengan paksa?
Fayyaz Khattak

Jawaban:

19

Anda dapat membuat aksi pengontrol Anda dengan memperluas \Magento\Backend\App\Actionuntuk backend atau \Magento\Framework\App\Action\Actionuntuk frontend.
dan membuatnya terlihat seperti ini:

<?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;
    }
}
Marius
sumber
Bagaimana cara mengirimkan konten dalam null, saya memiliki array data ketika passin menggunakan metode di atas yang menentukan jenis dan kesalahan fungsi.
Rakesh Jesadiya
3
Anda dapat langsung mengembalikan hasilnya $this->fileFactory->create()karena ini sudah merupakan implementasi respons, tidak perlu$resultRaw
Fabian Schmengler
@fschmengler Anda mungkin benar, tetapi saya mengambil contoh ini dari inti dari tindakan unduhan cadangan.
Marius
1
Sebagian besar modul inti M2 adalah contoh buruk;)
Fabian Schmengler
Ya ya saya tahu bahasannya. Saya benar-benar berpikir saya mulai bagian dari itu. Tetapi ini tidak selalu benar
Marius
8

Anda juga dapat memberikan jalur ke file yang ingin Anda unduh:

//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
);
Atish Goswami
sumber
2

Berdasarkan jawaban yang Marius berikan.

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;
    }
}

Tidak memiliki izin yang benar (meskipun membaca diperlukan di sini, Magento memeriksa izin menulis) akan menghasilkan kesalahan aneh. "Situs ini down atau pindah" atau bertiga seperti itu.

Layak mengambil puncak menyelinap di logika di dalam $ fileFactory-> create () juga.

vitoriodachef
sumber