Gibt es eine Magento-Dienstprogrammmethode, mit der ich eine Aktion zum Herunterladen von Inhalten erzwingen kann?
Gibt es eine Magento-Dienstprogrammmethode, mit der ich eine Aktion zum Herunterladen von Inhalten erzwingen kann?
Antworten:
Sie können Ihre Controller-Aktion erstellen, indem Sie sie \Magento\Backend\App\Action
für das Backend oder \Magento\Framework\App\Action\Action
fü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;
}
}
$this->fileFactory->create()
da dies bereits eine Antwortimplementierung ist, die nicht erforderlich ist$resultRaw
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
);
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.