Existe-t-il une méthode utilitaire magento qui peut m'aider à créer une action de téléchargement de contenu forcé?
Existe-t-il une méthode utilitaire magento qui peut m'aider à créer une action de téléchargement de contenu forcé?
Réponses:
vous pouvez créer votre action de contrôleur en l'étendant \Magento\Backend\App\Action
pour le backend ou \Magento\Framework\App\Action\Action
pour le frontend.
et le faire ressembler à ceci:
<?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()
car il s'agit déjà d'une implémentation de réponse, pas besoin de$resultRaw
On peut également fournir un chemin vers un fichier que vous souhaitez télécharger:
//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
);
Basé sur la réponse que Marius a donnée.
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;
}
}
Ne pas avoir les autorisations correctes (même si une lecture est nécessaire ici, Magento vérifie les autorisations d'écriture) entraînera une erreur étrange. "Le site est en panne ou déplacé" ou quelque chose comme ça.
Cela vaut également la peine de jeter un coup d'œil à la logique de $ fileFactory-> create ().