Parfois, vous devez désactiver le rendu de vue actionné par défaut.
Pour ce faire, renvoyez simplement l'objet Response
de l'action du contrôleur.
Par exemple, créons une classe DownloadController
et ajoutons l'action "file", qui permettrait aux
utilisateurs du site de télécharger des fichiers depuis votre site. Cette action n'a pas besoin
d'une vue file.phtml correspondante car elle ne fait que copier le contenu du fichier donné.
Ajoutez le fichier DownloadController.php au dossier Controller du module Application, puis placez le code suivant dans le fichier :
<?php
namespace Application\Controller;
use Zend\Mvc\Controller\AbstractActionController;
use Zend\View\Model\ViewModel;
/**
* This is the controller class for managing file downloads.
*/
class DownloadController extends AbstractActionController
{
/**
* This is the 'file' action that is invoked
* when a user wants to download the given file.
*/
public function fileAction()
{
// Get the file name from GET variable
$fileName = $this->params()->fromQuery('name', '');
// Take some precautions to make file name secure
$fileName = str_replace("/", "", $fileName); // Remove slashes
$fileName = str_replace("\\", "", $fileName); // Remove back-slashes
// Try to open file
$path = './data/download/' . $fileName;
if (!is_readable($path)) {
// Set 404 Not Found status code
$this->getResponse()->setStatusCode(404);
return;
}
// Get file size in bytes
$fileSize = filesize($path);
// Write HTTP headers
$response = $this->getResponse();
$headers = $response->getHeaders();
$headers->addHeaderLine(
"Content-type: application/octet-stream");
$headers->addHeaderLine(
"Content-Disposition: attachment; filename=\"" .
$fileName . "\"");
$headers->addHeaderLine("Content-length: $fileSize");
$headers->addHeaderLine("Cache-control: private");
// Write file content
$fileContent = file_get_contents($path);
if($fileContent!=false) {
$response->setContent($fileContent);
} else {
// Set 500 Server Error status code
$this->getResponse()->setStatusCode(500);
return;
}
// Return Response to avoid default view rendering
return $this->getResponse();
}
}
La méthode Action prend le paramètre name de la partie query de l'URL (ligne 19),
supprime les barres obliques du nom de fichier (lignes 22-23), ajoute des en-têtes HTTP à l'objet
Response
(lignes 39-45) et contenu du fichier (lignes 48-55).
Enfin, il renvoie l'objet Response
pour désactiver le rendu de vue par défaut.
Déclarez la classe DownloadController
en ajoutant la ligne suivante à votre fichier module.config.php :
<?php
return [
// ...
'controllers' => [
'factories' => [
// ...
Controller\DownloadController::class => InvokableFactory::class
],
],
// ...
];
Vous devrez également ajouter une route à votre module.config.php (une route indique à ZF3 quelle URL
doit correspondre à l'action du contrôleur).
Modifiez la clé des routes
du fichier de configuration comme suit :
<?php
return [
// ...
'router' => [
'routes' => [
// Add this route for the DownloadController
'download' => [
'type' => Segment::class,
'options' => [
'route' => '/download[/:action]',
'defaults' => [
'controller' => Controller\DownloadController::class,
'action' => 'index',
],
],
],
],
],
// ...
];
Pour voir comment fonctionne le téléchargement du fichier, créez le dossier APP_DIR/data/download et placez-y un fichier texte nommé sample.txt. Ouvrez ensuite votre navigateur Web et tapez l'URL "http://localhost/download/file?name=sample.txt" dans la barre de navigation de votre navigateur et appuyez sur la touche Entrée. Le navigateur téléchargera le fichier sample.txt et vous proposera de l'enregistrer à un emplacement donné.