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

Répondre


Cette question est un moyen d’empêcher des soumissions automatisées de formulaires par des robots.
Smileys
:D :) :( :o :shock: :? 8-) :lol: :x :P :oops: :cry: :evil: :twisted: :roll: :wink: :!: :?: :idea: :arrow: :| :mrgreen: =D> #-o =P~ :^o :non: :priere: 8-|
Voir plus de smileys
  Revue du sujet
 

  Étendre la vue Revue du sujet : Générer un fichier à la volée mais en mémoire

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

par AB » 16 août 2012, 18:14

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;

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

par moogli » 16 août 2012, 17:26

ha ok, effectivement ça éviter de faire un truc trop crado :)


@+

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

par AB » 16 août 2012, 17:12

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

par moogli » 16 août 2012, 11:02

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

par xTG » 16 août 2012, 09:05

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

par Sebastien » 15 août 2012, 20:43

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

par AB » 15 août 2012, 19:41

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

par Sebastien » 15 août 2012, 16:24

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

par moogli » 15 août 2012, 11:09

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

par Mazarini » 15 août 2012, 10:59

Si tu fais un echo de la chaine de caractères en ajoutant un header pour spécifier le type mime, ca doit marcher.

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

par Sebastien » 15 août 2012, 10:47

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 ?