logo

NPDS : Gestion de contenu et de communauté


Content & Community Management System (CCMS) robuste, sécurisé, complet, performant, parlant vraiment français, libre (Open-Source) et gratuit.
31 visiteur(s) et 0 membre(s) en ligne.
Activité du Site

Pages vues depuis 25/05/2001 : 111 433 693

  • Nb. de membres 8 701
  • Nb. d'articles 1 695
  • Nb. de forums 26
  • Nb. de sujets 8
  • Nb. de critiques 92

Top 10  Statistiques

Index du forum »»  Le coin des codeurs »» Transmettre des données dans un fichier au navigateur...

Transmettre des données dans un fichier au navigateur...#15479

2Contributeur(s)
BorisTribal-Dolphin
3 Modérateur(s)
developpeurjpbJireck
Boris Borisicon_post
Salut tout le monde!

J'aurais besoin de transmettre des données générées à partir d'un formulaire sous forme d'un fichier (compressé ou non-compressé selon choix) comme le fait SavemySQL. Le problème... :-P On fait comment?!? :-?
Tribal-Dolphin Tribal-Dolphinicon_post
http://www.Nexen.net et tu fait une recherche dans la doc PHP sur :
- fopen()
- fwrite()
- fclose()

Ces trois fonctions te permetent d'écrire dans un fichier. D'ailleurs, savemysql les utilises, tout comme les préférences, .......

Et ensuite, pour envoyer ce beau fichier dans le navigateur du client (pour forcer le download en fait) tu n'as qu'à suivre ceci http://www.tribal-dolphin.net/sections.php?op=viewarticle&artid=21

Message édité par : Tribal-Dolphin

Boris Borisicon_post
Mais euh... Ca permet aussi de transmettre un fichier sans qu'il soit fait sur le serveur? (Pr pas qu'il y ait de conflit si plusieurs personnes utilisent le formulaire en même temps et que les fichiers de chacune de ces deux personnes se marchent dessus...) Moi, faudrait juste que l'utilisateur recoive le fichier, mais pas qu'il soit créé sur le serveur... Si c'est possible! Ou alors une idée pour éviter les conflits?
Boris Borisicon_post
Bon, je pense avoir trouvé une partie de la solution... Grace au lien de TD! (Merci bôcou!!!)



<?php
// Fichier à télécharger :
$fichier = 'docs/bon_de_commande.doc';
$mom_fichier = 'bon_de_commande.doc';

// Pour forcer le téléchargement, il faut utiliser des HEADER
// Attachement du fichier
header('!!content-disposition:!! attachment; filename='.$mom_fichier);
// Type de document, toujours mettre application/force-download
header('!!content-type:!! application/force-download');
header('!!content-transfer-encoding:!! fichier');
// La taille du fichier est obtenu par la fonction filesize
header('Content-Length: '.filesize($fichier));
// Pas de mise en cache
header('Pragma: no-cache');
header('Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0');
header('Expires: 0');
// Envoie du fichier
readfile($fichier);

==> Ici, si j'affiche simplement la variable qui contient ce qui est censé se trouver dans le fichier avec des echo, ca marche?

?>



Et pour un cas comme celui-là, comment faire pour déterminer la taille? On peut laisser le header('Content-Length: vide?

Message édité par : Boris

Tribal-Dolphin Tribal-Dolphinicon_post
Tu est obliger de le créer sur le serveur, mais juste après l'envoie, tu peut le supprimer bien sûr !!

Par contre, je ne comprends pas ton histoire de conflit, il ne peut en avoir car tu fait tout sur la même page (1 page de formulaire et 1 page qui crée / envoie / supprime le fichier)
Boris Borisicon_post
CT si deux personnes génèrent leur fichier en même temps... Tu pense le risque est suffisemment minime pour que ca ne gêne pas? (J'suis assez accro sur la sécu! :-P )
Tribal-Dolphin Tribal-Dolphinicon_post
Pour faire simple, voici un exemple avec un formulaire qui envoie les variables $nom, $prenom, $age



<?
$nom_fichier 
uniqid ();
$nom_fichier $nom_fichier.".txt";
$fichier = 
"docs/".$nom_fichier;

$fp = fopen($fichier, 
"w");
fwrite($fp, 
"NOM : ".$nom."\n");
fwrite($fp, 
"PRENOM : ".$prenom."\n");
fwrite($fp, 
"AGE : ".$age." ans\n");
fclose($fp);

// Le fichier est crée, on va donc attaqué le download
// Pour forcer le téléchargement, il faut utiliser des HEADER
// Attachement du fichier
header('!!!content-disposition:!!! attachment; filename='.$mom_fichier);
// Type de document, toujours mettre application/force-download
header('!!!content-type:!!! application/force-download');
header('!!!content-transfer-encoding:!!! fichier');
// La taille du fichier est obtenu par la fonction filesize
header('Content-Length: '.filesize($fichier));
// Pas de mise en cache
header('Pragma: no-cache');
header('Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0');
header('Expires: 0');
// Envoie du fichier
readfile($fichier);

// On efface le fichier car on en à plus besoin
unlink($fichier);
?>




Et voilà, tu à tout ce dont tu à besoin
Boris Borisicon_post
Merci! :=! J'te redis si ca marche!
Boris Borisicon_post
Euh... Ou est l'erreur? Le fichier est créé sur le serveur et il contient bien le mot Bonjour, mais pas le fichier récupéré par le vanigateur... (j'ai essayé en appelant le fichier install.conf.txt, mais ca change rien)
Voilà le code:


<?
    $installconf 
"modules/".$ModPath."/generator/install.conf.php";
    $fp = fopen($installconf,
"w");
    if(@fwrite($fp, 
"Bonjour"))
    
{
        fclose($fp);
        // Pour forcer le téléchargement, il faut utiliser des HEADER
        // Attachement du fichier
        header('!content-disposition:! attachment; filename=install.conf.php');
        // Type de document, toujours mettre application/force-download
        header('!content-type:! application/force-download');
        header('!content-transfer-encoding:! fichier');
        // La taille du fichier est obtenu par la fonction filesize
        header('Content-Length: '.filesize($installconf));
        // Pas de mise en cache
        header('Pragma: no-cache');
        header('Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0');
        header('Expires: 0');
        // Envoie du fichier
        readfile($installconf);
        unlink($installconf);
    
}
    else
    
{
        if(file_exists($installconf))
        
{
            unlink($installconf);
        
}
        echo 
"<br/><br/><h1 style=\"color:red\">Impossible de créer le fichier install.conf.php. Vérifiez que le dossier modules/".$ModStart."/generator/ a bien un chod 777.</h1>";
    
}
?>




HELP! :-?
Tribal-Dolphin Tribal-Dolphinicon_post
Vérifie que tu passe bien la variable $ModPath

Et essaye ceci (mais suis pas convaincu)

<?
readfile
(stripslashes(basename($installconf)));
?>

Boris Borisicon_post
$ModPath ok, puisque le fichier est correctement écrit sur le serveur, mais ca marche pas non plus avec ta modif

Message édité par : Boris

Tribal-Dolphin Tribal-Dolphinicon_post
Bizarre tout ça.
Je testerais et je te tient au courant
Boris Borisicon_post
J'ai trouvé!!!!!!

Le problème ne viens pas du script!
Il vient du fait que admin.php inclu automatiquement le header.php et donc envoie des données au navigateur AVANT l'envoi des headers et du fichier, ce qui fait planter le bazar! J'ai essayé en faisant l'appel à partir de modules.php qui n'inclus pas le header.php, et ca marche!

Le problème, maintenant:

Est-ce qu'il existe un paramètre qui permette à admin.php de ne pas inclure le header.php ?

Car ce script est exécuté depuis le NPDS-Plugin, et est réservé aux admin...
Tribal-Dolphin Tribal-Dolphinicon_post
Ouverture du fichier en popup, je ne vois que ça !!

Ou mieux, tu fait ton traitement et ensuite tu ouvre un popup avec le paramètre du nom de fichier dans l'URL.

Après, c'est à toi de faire ta sauce.
Boris Borisicon_post
Je crois que j'ai trouvé une autre soluce... Je conserve l'appel par modules.php, et pr le mettre dans npdsplugin, je fais comme c'est fait pour sdv dans sable. (Sais pas si ca y est dans narval...)
Par contre, faut inclure des tests sur la variable $admin pour contrôler si la personne est admin ou pas... Avis?

EDIT : C bon, ca marche! Merci à tous pour votre aide! (Enfin... Merci TD!)

NMIG bientôt en test sur modules!!!
Conception de logiciels, sites web & communication, hébergement web professionnel, solutions de sécurité, dépannage/maintenance et fourniture de matériel, etc.
E-Concept Applications


Message édité par : Boris

Tribal-Dolphin Tribal-Dolphinicon_post
Comme je l'ai dit plus haut, fait ta sauce mon grand :-D