Forcer les téléchargements de fichiers dans Symfony2
Lors de la gestion des événements de clic de l'utilisateur sur les liens de téléchargement, l'objectif est d'inviter l'utilisateur à enregistrer un fichier. Cependant, dans Symfony2, les tentatives de lancement de téléchargements de fichiers conduisent souvent à des résultats indésirables.
Une approche consiste à spécifier manuellement les en-têtes de la réponse :
<code class="php"> $response = new Response(); $response->headers->set('Content-type', 'application/octect-stream'); $response->headers->set('Content-Disposition', sprintf('attachment; filename="%s"', $filename)); $response->headers->set('Content-Length', filesize($filename));</code>
Cependant, cette approche peut entraîner le téléchargement boîte de dialogue affichant une taille de fichier de 0 octet.
L'inclusion de l'en-tête Content-Transfer-Encoding peut résoudre ce problème :
<code class="php"> $response->headers->set('Content-Transfer-Encoding', 'binary'); $response->setContent(readfile($filename));</code>
Cependant, cela génère parfois un flux de caractères illisibles.
Une méthode alternative consiste à utiliser la fonction setContent avec la fonction file_get_contents() :
<code class="php"> $response->setContent(file_get_contents($filename));</code>
Cette approche peut conduire à une erreur PHP liée à la limite de mémoire.
Pour Pour éviter ces problèmes, envisagez d'utiliser la classe BinaryFileResponse :
<code class="php">use Symfony\Component\HttpFoundation\BinaryFileResponse; use Symfony\Component\HttpFoundation\ResponseHeaderBag; $response = new BinaryFileResponse($file); $response->setContentDisposition(ResponseHeaderBag::DISPOSITION_ATTACHMENT);</code>
Cette solution est simple et sans effort, facilitant le comportement de téléchargement de fichiers souhaité.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!