Page 1 sur 1
Problème lors d'un téléchargement forcé
Posté : 06 mai 2008, 16:01
par M.Jerome
Bonjour,
Je force le transfert d'un fichier à l'aide des en-têtes suivantes :
Code : Tout sélectionner
header('Content-Disposition: attachment; filename="'.$nom.'"');
header('Content-Type: application/octet-stream;');
header('Content-Transfer-Encoding: application/octet-stream\n');
header('Content-Length: '.$taille);
header('Pragma: no-cache');
header('Cache-Control: no-cache, must-revalidate');
header('Expires: 0');
flush();
### Envoie du contenu au navigateur ###
readfile($link);
exit();
Le transfert fonctionne sans erreur, la réception est OK. Le problème se situe pendant le tranfert. Effectivement, il est impossible de télécharger en même temps un autre fichier ni de naviguer dans le site. Plus précisément, lorsque je clique pour lancer un second transfert, celui-ci ne démarre qu'à la fin du premier transfert, laissant le navigateur chargé on ne sait pas quoi. De plus si je navigue vers une autre section du site, je me retrouve déconnecté, c'est-à-dire que le navigateur perd la session.
Pouvez vous m'aider ? merci bien.
Posté : 06 mai 2008, 20:28
par sadeq
Utilise AJAX pour lancer ton programme de téléchargement comme ça il s'exécutera en mode asynchrone (sans devoir attendre sa terminaison)
Posté : 06 mai 2008, 23:38
par caroube
Utilise AJAX pour lancer ton programme de téléchargement comme ça il s'exécutera en mode asynchrone (sans devoir attendre sa terminaison)
Et tu es sûr que si tu navigues sur d'autres pages du site, le téléchargement en Ajax va se poursuivre ?
Posté : 07 mai 2008, 09:02
par M.Jerome
Enfin une réponse, merci

(j'ai posté sur plusieurs forum, sans réponse ...)
Donc, comme le dit caroube, je ne pense pas que cela réglera le problème avec Ajax, tout simplement parce que si je met un "target" à "_blank" sur le lien, cela ouvre une autre page, donc indépendante de la page du lien, et pourtant j'obtient les mêmes problèmes.
Je me souviens que sur un site, je ne pouvais faire qu'un download à la fois, c'était le même genre de problème je pense. Hélas, ça fait très longtemps, et je ne me souviens plus du site.
Merci encore.
Posté : 07 mai 2008, 12:59
par AB
Je peux pas te répondre précisément pour ton code. Voilà celui que j'utilise et qui d'après mes tests n'a pas les problèmes que tu indique :
header("Content-Type: application/force-download; name=\"".$file."\"");
header("Content-Transfer-Encoding: binary");
header("Content-Length: ".$filesize);
header("Content-Disposition: attachment; filename=\"".$file."\"");
header("Expires: Mon, 26 Jul 1997 05:00:00 GMT");
header("Cache-Control: no-store, no-cache, must-revalidate");
header("Pragma: no-cache");
readfile($dirfile);
header("Location: ".$_SERVER['PHP_SELF']);
exit();
EDIT : avec $dirfile = chemin complet du fichier; $file = basename($dirfile) et $filesize filesize($dirfile)
Posté : 07 mai 2008, 13:01
par agité
C'est normal ca ?
header("Expires: Mon, 26 Jul 1997 05:00:00 GMT");
26 juin 1997

Posté : 07 mai 2008, 13:07
par AB
C'est normal ca ?
header("Expires: Mon, 26 Jul 1997 05:00:00 GMT");
26 juin 1997

Oui c'est une date du passé; une méthode pour indiquer à certains navigateurs (qui comprennent moins bien les autres lignes de code) que le cache a expiré depuis longtemps.
Posté : 08 mai 2008, 00:09
par Hywan
Hey

,
La différence viendrait-elle de :
? Je ne connais pas ce type MIME ... Un historique ?
Posté : 08 mai 2008, 12:14
par M.Jerome
La différence entre un "application/force-download" et un "application/octet-stream", c'est que le force-download permet de faire "ouvrir" directement au lieu de l'enregistrer sur le DD, alors que l'autre ne permet pas l'ouverture, et force vraiment à le télécharger et le mettre sur le DD avant de pouvoir l'ouvrir. (en tout cas sous Firefox, ça fait ça).
Sinon j'ai réglé le souci de déconnexion, c'était du au faite que je régénérais l'ID de session, Lorsque j'allais autre part surle site, ça déconnectait. J'ai donc supprime la régénération de l'ID pour le téléchargement, et ça marche. Par contre la page ne se charge pas avant la fin du téléchargement. Je finirait bien par trouver.
En tout merci de votre aide, parce que là c'est vraiment pas évident comme truc.
Posté : 08 mai 2008, 12:21
par zeus
Modération :
M.Jerome, si ta question est résolue, pense à ajouter le tag [Résolu]
pour indiquer aux personnes qui voudront consulter ce sujet qu'il contient une solution.
Tu peux réaliser cette opération en cliquant sur le bouton
en haut à gauche de ce sujet.
Posté : 08 mai 2008, 12:26
par M.Jerome
Bah, non c'est pas résolu. Je sais toujours pas pourquoi que lors d'un téléchargement, je ne peux plus changer de page avant la fin du transfert

Posté : 13 mai 2008, 15:10
par M.Jerome
Bonjour à tous,
Je reviens à la charge, mais cette fois ci pour donner la solution
Alors, j'ai mis plein de ligne de debug, et je me suis rendu compte que ça bloquait sur "session_start". D'après ce que je comprend, lors d'un téléchargement de ce genre, le serveur ne libère pas le fichier de session. Donc lorsque je navigue sur une autre page, le script bloque sur "session_start" en attendant que le script de téléchargement soit terminée.
La solution est simple, j'ai mis avant mes en-tête : "session_write_close", ce qui a pour effet d'écrire les infos de session sur le disque et de terminer la session, libérant ainsi le fichier de session.
Je remercie tout de même ceux qui m'ont aider.
@tte