IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage PHP Discussion :

[CSV] Enregistrer sous? Apres un fichier enregistré


Sujet :

Langage PHP

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    24
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2005
    Messages : 24
    Points : 13
    Points
    13
    Par défaut [CSV] Enregistrer sous? Apres un fichier enregistré
    Bonjour,

    la question du jour et la suivante.

    Je fais une requete mysql pour sortir des données sur un fichier texte à plat. Celui est donc enregistrer sur le disque avec un nom aleatoire (c'est voulu).

    Je ne veux pas empecher cette enregistrement bien au contraire.

    Par contre ce que j'aimerais, c'est qu'après que le fichier soit enregistré sur le disque, une fenetre enregistrer sous s'afficher pour la balancer dans un autre repertoire au choix de la personne.

    Est-ce possible?

    Le problême entre autre vient du fait que le fichier créé n'est pas seul dans le répertoire et qu'il a un nom aléatoire ce que j'aimerais garder bien entendu.

    Bien entendu tout cela doit etre fait en php^^...

    Une idée?

  2. #2
    Expert éminent Avatar de Mr N.
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    5 418
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 5 418
    Points : 6 449
    Points
    6 449
    Par défaut
    oui :

    1. extraction des données en bdd
    2. enregistrement du contenu du fichier dans une variable V
    3. choix du nom de fichier F
    4. ouverture du fichier et ecriture de V
    5. fermeture du fichier
    6. lancement des header proposant au navigateur un telechargement
    7. Donner le nom de fichier F dans le header approprié
    8. ecriture de V
    9. c'est fini.

    Il faut s'assurer à l'étape 6 qu'aucun caractère n'est été envoyer au navigateur.

  3. #3
    Membre éprouvé Avatar de trattos
    Profil pro
    Inscrit en
    Juillet 2003
    Messages
    1 000
    Détails du profil
    Informations personnelles :
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Juillet 2003
    Messages : 1 000
    Points : 1 080
    Points
    1 080
    Par défaut
    PHP!
    Il te suffit de forcer le téléchargement!
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    <?php
    $fichier = 'répertoire/fichier.ext';
    $nomFichier = 'nomFichier.ext';
    $tailleFichier = filesize($fichier);
     
    header('Content-Type: application/octet-stream');
    header("Content-Length: $tailleFichier");
    header("Content-Disposition: attachment; filename=\"$nomFichier\"");
    readfile($fichier);
    ?>

  4. #4
    Membre à l'essai
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    24
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2005
    Messages : 24
    Points : 13
    Points
    13
    Par défaut
    Pour tout dire, j'avais effectivement déjà vu la faq concernant le téléchargement forcé ...

    Mon problême vient plus du nom aléatoire et de la façon dont je le crée. Vu qu'avant de le faire télécharger par le client, je veux que le fichier soit déjà enregistré sur le disque automatiquement. En clair, une sauvegarde déjà faite et forcer son téléchargement juste après.

    De surcroit, c'est un nom aleatoire.

    Je crée le fichier comme suit avec un system()

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    system(sprintf( 
       $v_mysqlBinDir.'mysql -h %s -u %s -p%s -D %s -N -e "SELECT <nom des différents index> FROM <tables>" > ../../%s/client_%s_%s.txt',                                                  
       $v_host,
       $v_user,
       $v_password,
       $v_database,
       $v_extractdir,
       $v_database,
       date ("Ymd_His")
      ), $rc);
      if ($rc!=0)   {
    	$_SESSION["msgNiv"] = "0";
    	$_SESSION["msg"] = $trad_errbd;//erreur bd
    }
    Le fichier est donc envoyé en premier sur le dur. A la suite de ça, j'aimerais forcer son téléchargement.

    Comment enfermer le nom de mon fichier créé dans une variable pour en forcer le téléchargement? Je pense que c'est cela plutot la question^^...

  5. #5
    Expert éminent Avatar de Mr N.
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    5 418
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 5 418
    Points : 6 449
    Points
    6 449
    Par défaut
    Traite le nom de ton fichier à part :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
     
    $nom = sprintf('../../%s/client_%s_%s.txt', $v_extractdir,
       $v_database,
       date ("Ymd_His"));
    $cmd = sprintf(
       $v_mysqlBinDir.'mysql -h %s -u %s -p%s -D %s -N -e "SELECT <nom des différents index> FROM <tables>" > %s',                                                 
       $v_host,
       $v_user,
       $v_password,
       $v_database,
       $nom);
    system($cmd, $rc);
    ...
    ...
    force_download($nom);

  6. #6
    Membre à l'essai
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    24
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2005
    Messages : 24
    Points : 13
    Points
    13
    Par défaut
    Cela marche effectivement et je n'y avais pas du tout pensé^^...

    Merci beaucoup.

    Une derniere petite question. La fenetre d'enregistrer sous apparait bien mais il est en html alors qu'à la base le fichier est en texte. C'est assez génant vu que je perds le formatage des données de la sortie pour une future utilisation en excell notamment. Y a-t-il quelque chose à changer dans les headers?

    J'ai remplacé application/octet-stream par text/plain mais rien n'y fait. Cela reste en html. Y a-t-il une façon de le laisser en texte?

  7. #7
    Expert éminent Avatar de Mr N.
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    5 418
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 5 418
    Points : 6 449
    Points
    6 449
    Par défaut
    quel est ton code php ? C'est quoi comme format ? csv ?

  8. #8
    Membre à l'essai
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    24
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2005
    Messages : 24
    Points : 13
    Points
    13
    Par défaut
    Pfff, j'ai rien dit. Je viens de reussir

    Merci beaucoup, résolu

  9. #9
    Membre à l'essai
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    24
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2005
    Messages : 24
    Points : 13
    Points
    13
    Par défaut
    Ah! J'ai tout de même un petit problême^^...

    Voici mon code de bas de page :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    $fichier = $nom;
    $nomfichier = sprintf('client_%s_%s.txt',
       $v_database,
       date ("Ymd_His"));
    $tailleFichier = filesize($fichier);
     
    header('Content-Type: application/octet-stream');
    header("Content-Length: $tailleFichier");
    header("Content-Disposition: attachment; filename=\"$nomfichier\"");
    readfile($fichier); 
     
    //On revient à la page client
    echo '<script>window.history.go(-1);</script>';
    //On inclus le pied de page
    include "pdp.inc.php";
    Ce qui est étrange, c'est quand je regarde le fichier texte que j'enregistre sur le bureau. Celui contient en bas de fichier texte :

    <script>window.history.go(-1);</script> puis ce qui est contenu dans mon include^^...

  10. #10
    Expert éminent Avatar de Mr N.
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    5 418
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 5 418
    Points : 6 449
    Points
    6 449
    Par défaut
    ben c'est normal. Tout ce qui est envoyer apres tes header de téléchargement fait parti du téléchargement !

  11. #11
    Membre à l'essai
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    24
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2005
    Messages : 24
    Points : 13
    Points
    13
    Par défaut
    D'accord, donc je suppose qu'il n'y a rien à faire^^...

    On fera avec alors Merci

  12. #12
    Membre éprouvé Avatar de trattos
    Profil pro
    Inscrit en
    Juillet 2003
    Messages
    1 000
    Détails du profil
    Informations personnelles :
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Juillet 2003
    Messages : 1 000
    Points : 1 080
    Points
    1 080
    Par défaut
    C'est normal, en gros ce code source est ton fichier, si tu met un echo() ou un include(), cela sera inclu dans ton fichier!

  13. #13
    Membre à l'essai
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    24
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2005
    Messages : 24
    Points : 13
    Points
    13
    Par défaut
    Je comprends mieux effectivement^^... Cette subtilité est bonne à savoir en tout cas ...

    Merci à vous deux pour 'laide apporté

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [AC-97] Fichier : Enregistrer sous
    Par titi95 dans le forum VBA Access
    Réponses: 5
    Dernier message: 31/12/2010, 10h32
  2. Enregistrer sous + lien du fichier
    Par Julien42 dans le forum Access
    Réponses: 1
    Dernier message: 25/12/2010, 14h52
  3. fichier - enregistrer sous
    Par pascale86 dans le forum Langage
    Réponses: 1
    Dernier message: 15/03/2010, 12h23
  4. "enregistrer sous" de deux fichiers
    Par koalafab dans le forum Langage
    Réponses: 3
    Dernier message: 03/12/2007, 19h08
  5. Incrementer nom fichier enregistrement sous
    Par pomny dans le forum Macros et VBA Excel
    Réponses: 24
    Dernier message: 02/11/2007, 18h34

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo