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

  1. #1
    Membre à l'essai
    Homme Profil pro
    Inscrit en
    juillet 2009
    Messages
    31
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : juillet 2009
    Messages : 31
    Points : 13
    Points
    13

    Par défaut Problème de header pour forcer le téléchargement, site figé

    Bonjour,

    Voilà j'ai un petit problème de script, je code donc un site où on peut télécharger des fichiers allant de 1Ko à plus de 500Mo, les fichiers viennent de mon serveur mais le plus souvent ils viennent de serveurs externes.

    Jusque là tout fonctionne, les fichiers passent à travers un fichier file.php, précisés par plusieurs variables GET pour désigner le fichier à télécharger, et un header est envoyé pour forcer le téléchargement, changer plusieurs variables statistiques au passage, etc.

    Le gros problème, dont je ne m'étais même pas rendu compte pendant la création de ce script il y a quelques semaines, c'est qu'une fois un téléchargement lancé, l'utilisateur ne peut naviguer nul part sur mon site, les pages "chargent", et n'aboutissent à rien avant la fin du téléchargement des fichiers qui passent à travers le header (on est donc obligé d'annuler le téléchargement pour pouvoir faire quelque chose sur le site).

    Après quelques tests, j'ai pu voir que cela ne touchait pas le site entier; cela concerne uniquement l'user qui télécharge, pas les autres users naviguant (ce qui est quand même une bonne nouvelle vu le contexte).

    Bon évidemment vous l'imaginez, lorsqu'on télécharge un fichier de 500Mo, il faut plusieurs heures pour le finir et le fait que mon site soit complètement figé pour l'user concerné c'est très très gênant, et frustrant pour celui-ci.

    J'ai cherché sur Internet et n'ai pas trouvé de cas similaire - je suppose que j'ai mal cherché - je suppose que le problème est dû au fait que le header fait passer le fichier concerné par mon site et qu'aucune autre header (donc page) ne peut être envoyé à l'user avant la fin du chargement.

    Y a-t-il une solution ? Est-ce une erreur de ma part ?

    Voici le code...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    header("Content-disposition: attachment; filename=".basename($local_file)."\n"); 
    header("Content-Type: application/force-download\n"); 
    header("Content-Transfer-Encoding: octet-stream\n"); // Surtout ne pas enlever le \n
    header("Content-Length: ".$local_file_size."\n"); 
    header("Pragma: no-cache"); 
    header("Cache-Control: must-revalidate, post-check=0, pre-check=0, public\n"); 
    header("Expires: 0\n"); 
    readfile($local_file);
    Je ne vois pas trop de solution, si quelqu'un pouvait me dire que c'est simplement un mauvais paramètre dans le header, ça me sauverait vraiment !

    Merci de m'avoir lu

  2. #2
    Modérateur
    Avatar de sabotage
    Homme Profil pro
    Inscrit en
    juillet 2005
    Messages
    29 206
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : juillet 2005
    Messages : 29 206
    Points : 43 378
    Points
    43 378

    Par défaut

    Je verrais plus un problème au niveau du serveur web ou du client que de PHP lui même.
    N'oubliez pas de consulter les FAQ PHP et les cours et tutoriels PHP

  3. #3
    Membre habitué
    Profil pro
    Inscrit en
    juin 2004
    Messages
    70
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : juin 2004
    Messages : 70
    Points : 131
    Points
    131

    Par défaut

    J'ai moi même rencontré ce problème.
    Le solution consiste à terminer la session avant l'envoi des données.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    header("Content-disposition: attachment; filename=".basename($local_file)."\n"); 
    header("Content-Type: application/force-download\n"); 
    header("Content-Transfer-Encoding: octet-stream\n"); // Surtout ne pas enlever le \n
    header("Content-Length: ".$local_file_size."\n"); 
    header("Pragma: no-cache"); 
    header("Cache-Control: must-revalidate, post-check=0, pre-check=0, public\n"); 
    header("Expires: 0\n");
     
    session_write_close();
     
    readfile($local_file);

  4. #4
    Membre à l'essai
    Homme Profil pro
    Inscrit en
    juillet 2009
    Messages
    31
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : juillet 2009
    Messages : 31
    Points : 13
    Points
    13

    Par défaut

    Non ce n'est pas un problème de serveur puisque j'ai fait le test en local et en ligne

    Après beaucoup de recherche j'ai pu arriver à une conclusion similaire Blount, je vais tester cela immédiatement ! Merci

    Edit: ça marche nickel, merci infiniment, je me demande pourquoi les session sont en conflits avec les header comme ça.

  5. #5
    Membre habitué
    Profil pro
    Inscrit en
    juin 2004
    Messages
    70
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : juin 2004
    Messages : 70
    Points : 131
    Points
    131

    Par défaut

    Citation Envoyé par MaXOhBalle Voir le message
    Non ce n'est pas un problème de serveur puisque j'ai fait le test en local et en ligne

    Après beaucoup de recherche j'ai pu arriver à une conclusion similaire Blount, je vais tester cela immédiatement ! Merci

    Edit: ça marche nickel, merci infiniment, je me demande pourquoi les session sont en conflits avec les header comme ça.
    En fait cela n'a rien à voir avec les header.

    Les données de session sont bloqués en écriture durant l'exécution d'une requête. Tout au long de l'exécution de celle-ci, les autres requêtes seront bloqué du au verrou sur la session.
    Tant que le verrou n'est pas libéré, le page est "en attente".
    Et effectivement, dès que le téléchargement est terminé, le verrou est libéré et tout de suite les autres requêtes reprennent.

    L'explication n'est pas forcément parlante pour tous le monde.

  6. #6
    Membre à l'essai
    Homme Profil pro
    Inscrit en
    juillet 2009
    Messages
    31
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : juillet 2009
    Messages : 31
    Points : 13
    Points
    13

    Par défaut

    Je comprends mieux, merci en tout cas

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

Discussions similaires

  1. GET et POST pour forcer le téléchargement
    Par jimmo dans le forum Fichiers
    Réponses: 3
    Dernier message: 24/07/2014, 11h38
  2. [PHP 5.0] Fonction pour forcer le téléchargement
    Par hugoclo dans le forum Fonctions
    Réponses: 0
    Dernier message: 07/08/2011, 18h25
  3. [Système] Problème pour forcer un téléchargement
    Par Spaeda dans le forum Fonctions
    Réponses: 2
    Dernier message: 25/09/2006, 11h02
  4. Problème de header pour une redirection de page
    Par soda_o_rat dans le forum Smarty
    Réponses: 2
    Dernier message: 16/08/2006, 10h58
  5. Réponses: 3
    Dernier message: 02/01/2006, 17h23

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