Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1541 connectés 

 


 Mot :   Pseudo :  
 
 Page :   1  2
Page Suivante
Auteur Sujet :

Comment savoir si un téléchargement s'est bien déroulé

n°1443820
Djebel1
Nul professionnel
Posté le 17-09-2006 à 23:45:15  profilanswer
 

Reprise du message précédent :
Voilà le code que j'utilise. Et donc en ligne et avec des fichiers qui sont pas téléchargés instantanément, si tu cliques sur annuler la suite du code ne s'execute pas.

Code :
  1. //on lance le téléchargement
  2.         header('Last-Modified: ' . gmdate('D, d M Y H:i:s') . ' GMT');
  3.         header('Cache-Control: no-store, no-cache, must-revalidate'); // HTTP/1.1
  4.         header('Cache-Control: pre-check=0, post-check=0, max-age=0'); // HTTP/1.1
  5.         header('Content-Length: '.filesize($objTelechargement->getDirectory()));
  6.         header("Content-Type: application/octet-stream" );
  7.         header("Content-Transfer-Encoding: Binary" );
  8.         header('Content-Disposition: attachment; filename="'.$objTelechargement->getNomFichier().'"');
  9.         @$this->_readfile_chunked($objTelechargement->getDirectory());


et la fonction _readfile_chunked

Code :
  1. private function _readfile_chunked($filename,$retbytes=true) {
  2.         $chunksize = 1*(1024*1024); // Nombre de bytes par chunk
  3.         $buffer = '';
  4.         $cnt =0;
  5.         $handle = fopen($filename, 'rb');
  6.         if ($handle === false) {
  7.             return false;
  8.         }
  9.         while (!feof($handle)) {
  10.             $buffer = fread($handle, $chunksize);
  11.             echo $buffer;
  12.             if ($retbytes) {
  13.                 $cnt += strlen($buffer);
  14.             }
  15.         }
  16.         $status = fclose($handle);
  17.         if ($retbytes && $status) {
  18.             return $cnt;
  19.         }
  20.         return $status;
  21.      }

mood
Publicité
Posté le 17-09-2006 à 23:45:15  profilanswer
 

n°1444151
theredled
● REC
Posté le 18-09-2006 à 14:59:52  profilanswer
 

:cry:
J'ai essayé, en virant tous les trucs de classe, et le code s'execute toujours dès l'affichage de la fenetre  :sweat:
 
Ca me donne donc :
 
telech.php

Code :
  1. function _readfile_chunked($filename,$retbytes=true) {
  2.   $chunksize = 1*(1024*1024); // Nombre de bytes par chunk
  3.   $buffer = '';
  4.   $cnt =0;
  5.   $handle = fopen($filename, 'rb');
  6.   if ($handle === false) {
  7.       return false;
  8.   }
  9.   while (!feof($handle)) {
  10.       $buffer = fread($handle, $chunksize);
  11.       echo $buffer;
  12.       if ($retbytes) {
  13.           $cnt += strlen($buffer);
  14.       }
  15.   }
  16.   $status = fclose($handle);
  17.   if ($retbytes && $status) {
  18.       return $cnt;
  19.   }
  20.   return $status;
  21. }
  22. session_start();
  23. $nomfichier = $_GET['fich'];
  24. $_SESSION['bou']='bam';
  25. header('Last-Modified: ' . gmdate('D, d M Y H:i:s') . ' GMT');
  26. header('Cache-Control: no-store, no-cache, must-revalidate'); // HTTP/1.1
  27. header('Cache-Control: pre-check=0, post-check=0, max-age=0'); // HTTP/1.1
  28. header('Content-Length: '.filesize($nomfichier));
  29. header("Content-Type: application/octet-stream" );
  30. header("Content-Transfer-Encoding: Binary" );
  31. header('Content-Disposition: attachment; filename="'.$nomfichier.'"');
  32. _readfile_chunked($nomfichier);
  33. $_SESSION['bou']='boum2';


 
avec toujours la page appellante :

Code :
  1. <?php
  2.       session_start();
  3.       echo $_SESSION['bou'].'<br />';
  4.   ?>
  5.   <a href="telech.php?fich=grosfichier.mp3">TELECH</a>


Message édité par theredled le 18-09-2006 à 15:02:24
n°1444500
theredled
● REC
Posté le 19-09-2006 à 10:25:18  profilanswer
 

T'en penses quoi djebel1  [:canaille]

n°1444662
Djebel1
Nul professionnel
Posté le 19-09-2006 à 15:12:48  profilanswer
 

Que je vais faire quelques tests :) Parce que pour moi je te garantis que ça marche, donc j'essaye d'identifier pourquoi ça marche chez moi, et pas chez toi ^^
Il faisait quelle taille le fichier avec lequel tu as testé ?

n°1444719
theredled
● REC
Posté le 19-09-2006 à 16:34:34  profilanswer
 

Djebel1 a écrit :

Il faisait quelle taille le fichier avec lequel tu as testé ?


Plus de 10 Mo  :)

n°1444764
flo850
moi je
Posté le 19-09-2006 à 17:08:03  profilanswer
 

tu n'atteint pas le temps d'execution maximum des scripts ?

n°1444839
theredled
● REC
Posté le 19-09-2006 à 19:00:54  profilanswer
 

flo850 a écrit :

tu n'atteint pas le temps d'execution maximum des scripts ?


euh non  :??: mais c'est vrai que sur une petite connexion la question peut se poser...


Message édité par theredled le 19-09-2006 à 19:01:25

---------------
Contes de fées en yaourt --- --- zed, souviens-toi de ma dernière lettre. --- Rate ta musique
n°1449039
MagicBuzz
Posté le 28-09-2006 à 19:20:51  profilanswer
 

Groumpf.
 
http://msdn.microsoft.com/msdnmag/ [...] =true#fig4
 
En fait c'est pareil que la solution de Djbel1... Pourtant, d'après l'article de Microsoft, ça marche. Problème de config d'Apache peut-être ?

n°1449080
KangOl
Profil : pointeur
Posté le 28-09-2006 à 20:00:41  profilanswer
 

et si vous utiliser un output_buffer ?

n°1449331
MagicBuzz
Posté le 29-09-2006 à 09:42:25  profilanswer
 

au contraire, surtout pas.
 
s'il bufferise, il sera incapable de savoir si tout a été envoyé au client. pire, il n'attendra pas du tout après avoir envoyé dans le buffer les données.

mood
Publicité
Posté le 29-09-2006 à 09:42:25  profilanswer
 

n°1449923
KangOl
Profil : pointeur
Posté le 29-09-2006 à 17:38:46  profilanswer
 

ha oui ? et comment c'est fait dans l'exemple en vb.net que tu donnes 3 réponses plus haut ?
le Response.Flush() c'est pour faire joli ?

n°1449928
MagicBuzz
Posté le 29-09-2006 à 17:43:37  profilanswer
 

le flush justement, c'est pour bloquer le prog jusqu'à ce que le buffer soit vide :o (la gestion du buffer est automatique sous IIS, et flush est le seul moyen de s'assurer qu'il est vide avant de continuer)


Message édité par MagicBuzz le 29-09-2006 à 17:44:14
n°1449929
KangOl
Profil : pointeur
Posté le 29-09-2006 à 17:51:07  profilanswer
 

de ce coté je peux pas te contredire
 
mais le flush ca donc envoyer les données au client par petits bouts donc, c'est ce qu'on voulait...
 
maintenant le truc est de savoir si un script php est prévenu quand l'utilisateur arrete le chargement d'une page (peut importe ce qu'elle contient) ...

n°1449938
MagicBuzz
Posté le 29-09-2006 à 18:05:54  profilanswer
 

le buffer est assychrone.
 
donc si le gars plante avant que tu aies fini de remplir le buffer, tu as une chance de recevoir une indication.
mais généralement, ça prend quelques milli-secondes, donc ça n'arrive pas souvent.
 
par contre, si avec des flush tu forces le buffer à fonctionner de façon "synchrone", alors oui, si le client se déconnecte au milieu tu seras capable de récupérer l'info. mais uniquement dans ce cas.
 
c'est pour ça que quand tu parlais de tenter avec un buffer, je disais non, puisque c'est justement le meilleur moyen de se retrouver avec un truc complètement assychrone et donc avoir terminé avant que la page soit envoyée au client.

n°1449941
Ricco
Retour au pays
Posté le 29-09-2006 à 18:10:28  profilanswer
 

Mais pourquoi utiliser un spécialement un output_buffer si c'est pour le flusher à chaque fois ? Autant ne pas avoir de buffer de sortie, ça fait la même chose.
 
Perso je pense que cette solution est satisfaisant. Du côté serveur on ne peux pas savoir si l'utilisateur télécharge pour le sauvegarder ou si c'est le navigateur qui la completement mis en cache de son propre chef.  
Peut-être même que l'utilisateur peut trouver le moyen de ne pas renvoyer le signal comme quoi il a bien eu le fichier et aller le chercher dans son repertoire temporaire internet.


---------------
"L'informatique n'est pas plus la science des ordinateurs que l'astronomie n'est celle des télescopes." Michael R. Fellows & Ian Parberry
n°1449959
KangOl
Profil : pointeur
Posté le 29-09-2006 à 18:56:38  profilanswer
 

pas la peine de faire autant ... http://be.php.net/manual/fr/functi [...] -abort.php

mood
Publicité
Posté le   profilanswer
 

 Page :   1  2
Page Suivante

Aller à :
Ajouter une réponse
 

Sujets relatifs
[javascript] Gestion de téléchargement aveccomment savoir si mon os est en 32 ou 64 bits?
Savoir la version d'un .classComment savoir quelles sont les jars utilisées par mon projet ?
Savoir quand le téléchargement d'un utilisateur est fini[RESOLU] forcer le telechargement
Comment savoir quel processus utilise tel fichier ?Telechargement de fichier
[script] savoir si une page web est accessible ou non 
Plus de sujets relatifs à : Comment savoir si un téléchargement s'est bien déroulé


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR