30 votes

PHP crée un fichier à télécharger sans le sauvegarder sur le serveur

Objectif ultime : Je veux créer une page Web où un utilisateur peut saisir des informations dans des formulaires. Avec ces informations, je veux créer un fichier html (appelé ci-dessous test-download.html) en insérant les informations données dans un modèle, puis forcer un téléchargement. Comme je veux faire une démonstration lors d'un prochain atelier où les gens utiliseront cette application "en même temps", je voudrais ne pas enregistrer le fichier sur le serveur et simplement forcer le téléchargement.

Jusqu'à présent : J'ai ceci dans mon fichier html (test.html) :

<form action="test.php" method="post">
To file: <input type="text" name="tofile" />
<input type="submit" />
</form>

et ceci dans mon test.php :

<?php
$filename = 'test-download.html';
$htmlcode1 = "<HTML> \n <BODY>";
$htmlcode2 = "</BODY> \n <HTML>";
$somecontent = $htmlcode1.$_POST["tofile"].$htmlcode2;
!$handle = fopen($filename, 'w');
fwrite($handle, $somecontent);
fclose($handle);

header("Cache-Control: public");
header("Content-Description: File Transfer");
header("Content-Length: ". filesize("$filename").";");
header("Content-Disposition: attachment; filename=$filename");
header("Content-Type: application/octet-stream; "); 
header("Content-Transfer-Encoding: binary");

readfile($filename);

?>

Cela écrase le fichier test-download.html et force un téléchargement.

Question : Comment puis-je faire cela sans toucher à un fichier (le test-download.html) sur le serveur ?

34voto

alex Points 186293

Au lieu de l'enregistrer dans un fichier, il suffit de echo après avoir envoyé les en-têtes.

19voto

cHao Points 42294

Sachez que presque chaque fois qu'un script PHP répond à une requête, il "génère un fichier" qui est téléchargé par le navigateur. Tout ce que vous echo , print , printf Le contenu de ce "fichier" est le résultat de l'utilisation de l'ordinateur, ou de toute autre manière de la sortie standard.

Tout ce que vous avez à faire est d'indiquer au navigateur que le "fichier" doit être traité différemment - et les en-têtes que vous produisez devraient déjà le faire. Une fois les en-têtes envoyés, tout ce que vous imprimez devient le contenu du téléchargement.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X