Page 1 sur 1

Générer un fichier à la volée mais en mémoire

Posté : 15 août 2012, 10:47
par Sebastien
Bonjour,

Je souhaiterais générer un fichier sur le serveur en php (fichier texte) mais sans que celui ci soit enregistré sur le serveur !
Je m'explique : suite à un processus de remplissage de formulaires, je voudrais colationner toutes ces infos dans un fichier XML que l'utilisateur puisse télécharger mais je ne voudrais pas qu'il soit enregistré sur mon serveur. Juste en quelque sorte dans une zone mémoire que l'utilisateur je récupère et voila
Suis je clair ? et est-ce réalisable ce genre de chose en PHP ?

Re: Générer un fichier à la volée mais en mémoire

Posté : 15 août 2012, 10:59
par Mazarini
Si tu fais un echo de la chaine de caractères en ajoutant un header pour spécifier le type mime, ca doit marcher.

Re: Générer un fichier à la volée mais en mémoire

Posté : 15 août 2012, 11:09
par moogli
salut,

oui surement :)

cela doit il suivre un seul formulaire ? ou collecter plusieurs ?

dans tous les cas il te suffit d'utiliser la fonction header pour envoyer le fichier au navigateur (regarde les exemples de la doc).

tu met dans une variable et l'envoie au navigateur.

@+

Re: Générer un fichier à la volée mais en mémoire

Posté : 15 août 2012, 16:24
par Sebastien
salut moogli,

Les données seront sûrement collectée de plusieurs formulaires mais dans ce cas, elles seront dans des variables de session a chaque fois que je quitterai un formulaire. Cela change un peu la donne du coup, ca ne vient plus de formulaires mais de variables de session, ca change pas grand choses finalement

@Mazarini: je comprends pas le lien entre ton echo et le téléchargement du fichier. Tu pourrais m'expliquer + en détail ?
@moogli : comment tu transforme alors ta variable où toutes les données sont collationné en fichier à télécharger, sans l'enregistrer sur le serveur ?

Merci pour vos réponses, je n'ai pas pu répondre + tôt

Re: Générer un fichier à la volée mais en mémoire

Posté : 15 août 2012, 19:41
par AB
Ou sinon en variante tu peux écrire dans un fichier temporaire avec tmpfile()

Re: Générer un fichier à la volée mais en mémoire

Posté : 15 août 2012, 20:43
par Sebastien
ah là je viens de découvrir la fonction tmpfile. Faus que je vois si on peu "concatener" des données dans le même fichier temporaire mais ca peut effectivement etre une bonne piste

Re: Générer un fichier à la volée mais en mémoire

Posté : 16 août 2012, 09:05
par xTG
Pour expliquer le echo.
Un fichier c'est une liste de caractères.
Donc tu peux faire un echo de caractères qui représentent un fichier et utiliser un header() pour indiquer au navigateur le type de fichier.
Lui il reçoit une suite de caractère et fait la relation et l'interprétation en fonction du type qui est associé.

Re: Générer un fichier à la volée mais en mémoire

Posté : 16 août 2012, 11:02
par moogli
Mwé ou regarder la doc de header que j'ai donné plus haut, l'exemple d'envoie de fichier PDF est bon, il faut juste adapter et voir ce que fait readfile :s

pour tmpfile(), comme l'indique la doc
Ce fichier sera automatiquement effacé lorsqu'il sera fermé (avec fclose()), ou lorsque le script sera terminé.
donc inutilisable sur plusieurs page, la solution reste donc variable (session ou pas) + header + echo (ou print si tu préfère XD).

Re: Générer un fichier à la volée mais en mémoire

Posté : 16 août 2012, 17:12
par AB
pour tmpfile(), comme l'indique la doc
Ce fichier sera automatiquement effacé lorsqu'il sera fermé (avec fclose()), ou lorsque le script sera terminé.
donc inutilisable sur plusieurs page, la solution reste donc variable (session ou pas) + header + echo (ou print si tu préfère XD).
Nan, je ne voulais pas dire d'enregistrer les données dans un fichier temporaire de pages en pages. C'est juste un moyen pour pouvoir faire ouvrir systématiquement la boite de téléchargement avec le fichier associé et les bonnes valeurs (poids du fichier) à partir de données stockées initialement en mémoire, donc évidemment c'est à faire au dernier moment. Si l'on souhaite simplement pouvoir faire afficher les données à l'écran cela n'a bien sûr aucun intérêt.

Re: Générer un fichier à la volée mais en mémoire

Posté : 16 août 2012, 17:26
par moogli
ha ok, effectivement ça éviter de faire un truc trop crado :)


@+

Re: Générer un fichier à la volée mais en mémoire

Posté : 16 août 2012, 18:14
par AB
oui c'est ça. Sur le princicpe :
$handle = tmpfile();
$info = stream_get_meta_data($handle);

// on écrit dans le fichier avec les données enregistrées dans une variable de session (ou autres)
//...

// on récupère le poids du fichier
$filesize = filesize($info['uri']);

// on nomme le fichier
$date = date("y-m-d-H-i-s");
$fichier_de_sauvegarde = 'Sauvegarde-donnees-'.$_SESSION['login'].'-'.$date.'.xml'; 

// on envoi les headers
header("Content-Type: application/force-download; name=\"".$fichier_de_sauvegarde."\"");
header("Content-Transfer-Encoding: application/xml");
header("Content-Length: ".$filesize);
header("Content-Disposition: attachment; filename=\"".$fichier_de_sauvegarde."\"");


//on envoi le fichier
rewind($handle);
fpassthru($handle);
fclose($handle);
exit;