web-dev-qa-db-fra.com

PHP créer un fichier à télécharger sans enregistrer 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 (ci-dessous appelé test-download.html) en insérant les informations fournies dans un modèle puis forcer un téléchargement. Comme je veux le démontrer lors d'un prochain atelier où les gens l'utiliseront "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 jouer avec un fichier (le test-download.html) sur le serveur?

30
Thomas

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

34
alex

Sachez que presque chaque fois qu'un script PHP répond à une demande, il "génère un fichier" téléchargé par le navigateur. Tout ce que vous echo, print, printf, ou autrement mis en sortie standard est le contenu de ce "fichier".

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 générez doivent déjà le faire. Une fois les en-têtes envoyés, tout ce que vous imprimez devient le contenu du téléchargement.

19
cHao