Forum Clubic

[résolu][PHP5] Flux de fichier et téléchargement - Forcer le téléchargement d'un fichier

Bonjour à tous,

J’utilise depuis longtemps un script php qui me permet de forcer le téléchargement d’un fichier stocker sur le serveur.

Cependant, j’aimerai pouvoir préparer un flux XML (par exemple) du style :
$mon_xml = <a><b>b</b><c>c</c></a>;
et le lancer en téléchargement sur le navigateur de l’utilisateur.

Je cherche donc un script qui prenne en paramètre une variable, un type mime, un nom de fichier et qui ouvre une boite de dialogue “ouvrir/enregistrer” à l’utilisateur.

Le script que j’utilise depuis lgtps prend un chemin de fichier en paramètre or là je ne veux pas générer de fichier (et ne pas avoir à le stocker sur le serveur).

Script en question :

header("Content-disposition: attachment; filename=".$nom_fichier);
header("Content-Type: application/force-download");
header("Content-Transfer-Encoding: binary");
header("Content-Length: ".filesize($chemin."/".$nom_fichier));
header("Pragma: no-cache");
header("Cache-Control: must-revalidate, post-check=0, pre-check=0");
header("Expires: 0");
readfile($chemin."/".$nom_fichier);

Euh je vois pas trop la différence… :neutre:

Si.

Suffit de générer ta chaîne de caractères, de renvoyer strlen($s) au lieu de filesize(), et de faire un echo $s à la fin…

Magnifique, ça marche super :

$flux_csv = <a><b>b</b>…;
header("Content-disposition: attachment; filename=nomDuFichier.csv");
header("Content-Type: application/force-download");
header("Content-Transfer-Encoding: binary");
header("Content-Length: ".strlen($flux_csv));
header("Pragma: no-cache");
header("Cache-Control: must-revalidate, post-check=0, pre-check=0");
header("Expires: 0");
echo $flux_csv;

Bah bien sûr :slight_smile:

Moi j’ai rien compris ^^
Je vois ce que fait le code mais j’ai pas compris l’intérêt. :paf:

L’intérêt c’est de forcer le téléchargement d’un fichier :slight_smile:

En fait mon premier code permet de forcer le téléchargement d’un fichier.
C’est à dire par exemple obliger IE à proposer un choix “ouvrir/enregistrer” sur les fichiers PDF car bien souvent les PDF s’ouvrent dans IE directement si on fait un lien directement vers le PDF.
Le problème de mon premier code c’est qu’il prend en paramètre un fichier stocker physiquement sur le serveur. Et lorsque ce fichier est généré à la volée, par exemple en prenant son contenu dans une BDD, ça oblige à générer le fichier sur le serveur temporairement et donc à avoir des droits d’écriture sur au moins un dossier.

Mon 2ème code (merci Sans-Nom pour ton aide) permet de forcer le téléchargement d’un fichier sans qu’il existe réellement.
En clair, pour un fichier CSV par exemple, je génère le contenu de mon fichier et le place dans une variable PHP. Ensuite je passe cette variable à mon script et il lance automatiquement une fenêtre “ouvrir/enregistrer” qui permet de télécharger un fichier CSV contenant le contenu de ma variable.

Ah ok ! J’avais compris que c’était pour forcer un téléchargement mais je voyais pas l’intérêt d’utiliser la méthode avec header(“Content-disposition: attachment; filename=nomDuFichier.csv”);