Action de téléchargement de fichier Magento2


11

Existe-t-il une méthode utilitaire magento qui peut m'aider à créer une action de téléchargement de contenu forcé?


1
quel type / extension de fichiers devez-vous télécharger de force?
Fayyaz Khattak

Réponses:


19

vous pouvez créer votre action de contrôleur en l'étendant \Magento\Backend\App\Actionpour le backend ou \Magento\Framework\App\Action\Actionpour 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;
    }
}

Comment passer du contenu en null, j'ai un tableau de données lorsque passin utilisant la méthode ci-dessus définit son erreur de type et de fonction.
Rakesh Jesadiya

3
Vous pouvez retourner directement le résultat $this->fileFactory->create()car il s'agit déjà d'une implémentation de réponse, pas besoin de$resultRaw
Fabian Schmengler

@fschmengler vous avez probablement raison, mais j'ai pris cet exemple du cœur de l'action de téléchargement de sauvegarde.
Marius

1
La plupart des modules de base M2 sont un mauvais exemple;)
Fabian Schmengler

Oui oui je connais la discussion. En fait, je pense que j'en ai commencé une partie. Mais ce n'est pas toujours vrai
Marius

8

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

2

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 ().

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.