การดำเนินการดาวน์โหลดไฟล์ Magento2


11

มีวิธียูทิลิตี้คุณภาพเยี่ยมซึ่งสามารถช่วยฉันในการสร้างการดำเนินการดาวน์โหลดเนื้อหาได้หรือไม่


1
คุณต้องการดาวน์โหลดไฟล์ประเภทใด / นามสกุลอะไร
Fayyaz Khattak

คำตอบ:


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

วิธีการส่งผ่านเนื้อหาเป็นโมฆะฉันมีอาร์เรย์ของข้อมูลเมื่อ passin ใช้วิธีการดังกล่าวข้างต้นกำหนดประเภทและข้อผิดพลาดของฟังก์ชั่น
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;
    }
}

ไม่มีสิทธิ์ที่ถูกต้อง (แม้ว่าจำเป็นต้องมีการอ่านที่นี่วีโอไอพีตรวจสอบสิทธิ์ในการเขียน) จะส่งผลให้เกิดข้อผิดพลาดแปลก ๆ "ไซต์หยุดทำงานหรือถูกย้าย" หรือ smth เช่นนั้น

เป็นมูลค่าการแอบสูงสุดที่ตรรกะใน $ fileFactory-> สร้าง () เช่นกัน

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.