Magento2-Datei herunterladen

11

Gibt es eine Magento-Dienstprogrammmethode, mit der ich eine Aktion zum Herunterladen von Inhalten erzwingen kann?

Atish Goswami
quelle
1
Welche Art / Erweiterung von Dateien müssen Sie zwangsweise herunterladen?
Fayyaz Khattak

Antworten:

19

Sie können Ihre Controller-Aktion erstellen, indem Sie sie \Magento\Backend\App\Actionfür das Backend oder \Magento\Framework\App\Action\Actionfür das Frontend erweitern.
und lass es so aussehen:

<?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
quelle
Wie man Inhalt in null übergibt, ich habe ein Array von Daten, wenn ich mit der obigen Methode seinen definierten Typ- und Funktionsfehler übergebe.
Rakesh Jesadiya
3
Sie können das Ergebnis direkt zurückgeben, $this->fileFactory->create()da dies bereits eine Antwortimplementierung ist, die nicht erforderlich ist$resultRaw
Fabian Schmengler
@fschmengler Sie haben wahrscheinlich Recht, aber ich habe dieses Beispiel aus dem Kern der Backup-Download-Aktion genommen.
Marius
1
Die meisten M2-Kernmodule sind ein schlechtes Beispiel;)
Fabian Schmengler
Ja ja ich kenne die Diskussion. Ich glaube tatsächlich, ich habe einen Teil davon angefangen. Dies ist jedoch nicht immer der Fall
Marius
8

Sie können auch einen Pfad zu einer Datei angeben, die heruntergeladen werden soll:

//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
quelle
2

Basierend auf der Antwort, die Marius gab.

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

Wenn Sie nicht über die richtigen Berechtigungen verfügen (obwohl hier ein Lesevorgang erforderlich ist, prüft Magento, ob Schreibberechtigungen vorliegen), führt dies zu einem seltsamen Fehler. "Die Seite ist heruntergekommen oder verschoben" oder so etwas.

Es lohnt sich auch, einen kurzen Blick auf die Logik in $ fileFactory-> create () zu werfen.

vitoriodachef
quelle