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 :

Forcer le téléchargement de fichier


Sujet :

Langage PHP

  1. #1
    Membre du Club
    Inscrit en
    Juin 2002
    Messages
    104
    Détails du profil
    Informations forums :
    Inscription : Juin 2002
    Messages : 104
    Points : 49
    Points
    49
    Par défaut Forcer le téléchargement de fichier
    Salut,

    voilà, j'ai une page web qui présente un lien qui permet de générer dynamiquement un fichier. Je voudrais que dès que l'utilisateur clique sur ce lien, que mon fichier soit crée et qu'une boîte de download s'affiche pour que l'utilisateur puisse le télécharger.

    Pour cela, mon lien pointe vers un fichier php qui génère un fichier .csv et dans ce script, j'ai ajouté une fonction de download qui comporte le source de la FAQ php pour le download forcé de fichiers.

    Le problème, c'est qu'au lieu d'avoir une boîte de dialogue de téléchargement qui apparaît, le contenu de mon fichier s'affiche dans la page...

    Code de ma fonction :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    function downloadGeneratedFile($fichier)
    {
     
          $nomFichier = results.csv;
          $tailleFichier = filesize($fichier);
     
          header('Content-Type: application/octet-stream');
          header("Content-Length: $tailleFichier");
          header("Content-Disposition: attachment; filename=\"$nomFichier\"");
          readfile($fichier);
     
    }
    Merci d'avance, pour votre aide.

  2. #2
    Inactif  
    Avatar de Kerod
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    11 672
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 11 672
    Points : 20 778
    Points
    20 778
    Par défaut
    Avec la fonction rechercher tu aurais trouver des sujets traitant du même problème :
    Forcer un téléchargement : nom du fichier de destination
    [Fichiers] Forcer le téléchargement
    [Langage] Forcer téléchargement (header)
    et j'en passe

  3. #3
    Membre du Club
    Inscrit en
    Juin 2002
    Messages
    104
    Détails du profil
    Informations forums :
    Inscription : Juin 2002
    Messages : 104
    Points : 49
    Points
    49
    Par défaut
    J'avais fait la fonction Rechercher juste avant de poser ma question mais je n'ai rien trouvé !

    Je n'ai pas encore lu quelque chose qui traite de mon problème...

  4. #4
    Membre du Club
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    57
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 57
    Points : 50
    Points
    50
    Par défaut idem
    Bonjour à tous,
    j'ai le même problème que toi BARBIER, mais j'ai remarqué un truc :
    Quand j'écris le code direct dans une page comme ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    $fichier = 'monrepertoire/fichier.PDF';
    $nomFichier = 'fichier.PDF';
    $tailleFichier = filesize($fichier);
     
    header('Content-Type: application/octet-stream');
    header("Content-Length: $tailleFichier");
    header("Content-Disposition: attachment; filename=\"$nomFichier\"");
    readfile($fichier);
    tout marche et j'ai le téléchargement qui débute (avec la petite fenêtre).
    Mais par contre quand je passe par la bdd pour récupérer le nom du fichier et que j'écris la même chose à partir des variables : ça ne marche pas, le navigateur m'ouvre le fichier complètement éclaté (pdf)

    La page simple : http://cfi-nice.org/italangue_m2/download2.php
    la page dynamique : http://cfi-nice.org/italangue_m2/download.php?a=1


    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
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    if(isset($_GET['a']) && ($_GET['a']!='')){
    	$chemin='download/annales/';
    	$idfichier=$_GET['a'];
    	$table='annales';
    	$id='an_id';
    	$pdf='an_pdf';
    	$download=1;
    }elseif(isset($_GET['p']) && ($_GET['p']!='')){
    	$chemin='download/presse/';
    	$idfichier=$_GET['p'];
    	$table='presse';
    	$id='pr_id';
    	$pdf='pr_pdf';
    	$download=1;
    }else{
    	$download=0; // neutralise le téléchargement
    	echo"<html><body>\r\n<h1>:-(</h1><br />\r\n</body></html>";
    }
     
    if($download==true){
    	// connection à la base de donnée
    	include("_connexion.php");
    	$query = "SELECT $id, $pdf FROM $table WHERE $id='$idfichier'"; 
    	$result = mysql_query($query) or die('<error>'.mysql_error().'</error>');
    	$val = mysql_fetch_array($result);
    	// donne le nom du fichier
    	$nomFichier = $val["$pdf"];
    	$fichier = $chemin.$nomFichier;
    	$tailleFichier = filesize($fichier);
    	/*
    	 * ici on place le compteur de téléchargement
    	 */
    	mysql_free_result();
    	mysql_close();
     
    	header("Content-type: application/force-download");
    	header("Content-Length: $tailleFichier");
    	header("Content-Disposition: attachment; filename=".$nomFichier);
    	readfile($fichier);
    Franchement, je ne vois pas le truc !!!

  5. #5
    Membre du Club
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    57
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 57
    Points : 50
    Points
    50
    Par défaut Une première réponse
    J'ai remarqué une autre chose :
    en virant toutes include() ou require() de la page elle marche normalement.
    Je ne l'explique pas mais je sais que ça a un rapport avec l'usage de header(). Je n'ai pourtant pas mis de HTML avant le header(). Bref si quelqu'un trouve une explication à cela ce sera le bienvenu.

    @+

  6. #6
    Membre habitué
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    147
    Détails du profil
    Informations personnelles :
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Mai 2005
    Messages : 147
    Points : 165
    Points
    165
    Par défaut
    essaies de mettre un ob_start() en début de script, et avant les headers du téléchargement fais un ob_clean().
    si ça vient des headers ça devrait régler le problème.

    ps: t'appels une table qui n'existe pas sur la page d'accueil...

  7. #7
    Membre du Club
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    57
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 57
    Points : 50
    Points
    50
    Par défaut trop cool
    Génial ça marche !!
    En mettant en cache avec ob_start() au début du script et ob_clean() juste avant les header() je peux garder les include() dans la page.

    Mille merci tthierry

    PS : pour la première page c'est normal, c'est ma maquette de travail, je m'en sert juste pour les tests en ligne ; tout rentrera dans l'ordre très bientôt, la publication est prévue pour la rentrée seulement.

  8. #8
    Futur Membre du Club
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2005
    Messages : 5
    Points : 5
    Points
    5
    Par défaut
    salut tout le monde,
    j'essaye moi aussi de forcer le téléchargement pour un pdf mais sans utiliser de bdd

    Dans telechargement.php :

    <?php

    // on essaie de reconnaitre l'extension pour que le téléchargement corresponde au type de fichier afin d'éviter les erreurs de corruptions

    switch(strrchr(basename($Fichier_a_telecharger), ".")) {

    case ".gz": $type = "application/x-gzip"; break;
    case ".tgz": $type = "application/x-gzip"; break;
    case ".zip": $type = "application/zip"; break;
    case ".pdf": $type = "application/pdf"; break;
    case ".png": $type = "image/png"; break;
    case ".gif": $type = "image/gif"; break;
    case ".jpg": $type = "image/jpeg"; break;
    case ".txt": $type = "text/plain"; break;
    case ".htm": $type = "text/html"; break;
    case ".html": $type = "text/html"; break;
    default: $type = "application/octet-stream"; break;

    }
    $Fichier_a_telecharger='minutes.PDF';
    $chemin='http://www.xxx.fr/xxx/xxx/';
    header("Content-disposition: attachment; filename=$Fichier_a_telecharger");
    header("Content-Type: application/force-download");
    header("Content-Transfer-Encoding: $type\n"); // Surtout ne pas enlever le \n
    header("Content-Length: ".filesize($chemin . $Fichier_a_telecharger));
    header("Pragma: no-cache");
    header("Cache-Control: must-revalidate, post-check=0, pre-check=0, public");
    header("Expires: 0");
    readfile($chemin . $Fichier_a_telecharger);
    ?>

    et dans test.html :

    <html>
    <head>
    <title>Test du téléchargement d'un fichier</title>
    <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
    </head>

    <body>

    <a href="telechargement.php?Fichier_a_telecharger=minutes.PDF&chemin=http://www.xxx.fr/xxx/xxx/">Télécharger</a>

    </body>
    </html>

    Voilà, j' ai bien la boite de téléchargement qui s'affiche avec Ouvrir/Enregistrer sous mais le souci c'est que c'est telechargement.php qui m'est proposé et non minutes.pdf

    Merci d'avance pour vos réponses.

  9. #9
    Membre du Club
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    57
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 57
    Points : 50
    Points
    50
    Par défaut
    Salut elmoino
    en reprenant ton code chez moi ça marche très bien, même en le testant sur un serveur distant. A mon avis ça vient de la récupération de tes variables d'url.

    si tu veux tester : http://dividere.free.fr/barbapapa/telechargement.htm

    La page telechargement.htm
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    <html><body>
    <a href="telechargement.php?Fichier_a_telecharger=BAC02_LV2_ES_S_SEPT_C.PDF&chemin=http://cfi-nice.org/italangue_m2/046553614/annales/">Télécharger</a>
    </body></html>
    La page telechargement.php
    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
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    <?php
    if(isset($_GET['Fichier_a_telecharger']) && ($_GET['Fichier_a_telecharger'] !='')){
    	$Fichier_a_telecharger = $_GET['Fichier_a_telecharger'];
    }else{
    	$Fichier_a_telecharger = '';
    }
    if(isset($_GET['chemin']) && ($_GET['chemin'] !='')){
    	$chemin = $_GET['chemin'];
    }else{
    	$chemin = '';
    }
     
    if($Fichier_a_telecharger !='' && $chemin !=''){
    	// on essaie de reconnaitre l'extension pour que le téléchargement corresponde 
    	// au type de fichier afin d'éviter les erreurs de corruptions
    	switch(strrchr(basename($Fichier_a_telecharger), ".")) 
    	{
    	case ".gz": $type = "application/x-gzip"; break;
    	case ".tgz": $type = "application/x-gzip"; break;
    	case ".zip": $type = "application/zip"; break;
    	case ".pdf": $type = "application/pdf"; break;
    	case ".png": $type = "image/png"; break;
    	case ".gif": $type = "image/gif"; break;
    	case ".jpg": $type = "image/jpeg"; break;
    	case ".txt": $type = "text/plain"; break;
    	case ".htm": $type = "text/html"; break;
    	case ".html": $type = "text/html"; break;
    	default: $type = "application/octet-stream"; break;
    	}
     
    	header("Content-disposition: attachment; filename=$Fichier_a_telecharger");
    	header("Content-Type: application/force-download");
    	header("Content-Transfer-Encoding: $type\n"); // Surtout ne pas enlever le \n
    	header("Content-Length: ".filesize($chemin . $Fichier_a_telecharger));
    	header("Pragma: no-cache");
    	header("Cache-Control: must-revalidate, post-check=0, pre-check=0, public");
    	header("Expires: 0");
    	readfile($chemin . $Fichier_a_telecharger);
    }
    ?>

  10. #10
    Futur Membre du Club
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2005
    Messages : 5
    Points : 5
    Points
    5
    Par défaut
    J'ai essayé avec ton nouveau code, il m'affiche tout le code telchargement.php

    dans telechargement.php, tu remplaces fichier_a_telecharger par xxx.pdf ?
    et chemin parhttp://www.xxx.fr/xxx/xxx/ ?

Discussions similaires

  1. Réponses: 1
    Dernier message: 02/07/2009, 12h36
  2. forcer le téléchargement de fichiers
    Par nezdeboeuf62 dans le forum GWT et Vaadin
    Réponses: 3
    Dernier message: 23/10/2008, 11h27
  3. forcer le téléchargement de fichier
    Par Emcy dans le forum Langage
    Réponses: 5
    Dernier message: 04/05/2008, 21h12
  4. Forcer un téléchargement de fichier
    Par dedz dans le forum Langage
    Réponses: 1
    Dernier message: 26/03/2007, 20h32
  5. Forcer le téléchargement de fichiers
    Par aktos dans le forum Langage
    Réponses: 4
    Dernier message: 07/01/2007, 22h04

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