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

  FORUM HardWare.fr
  Programmation
  PHP

  [RESOLU]Force Download gros fichier

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

[RESOLU]Force Download gros fichier

n°1345351
orlith
Posté le 12-04-2006 à 18:00:16  profilanswer
 

Bonjour
 
J'essaie de mettre en place un script PHP qui permet de télécharger des fichiers de plus de 20Mo.
Voici le script :
 
<?php
 @ob_end_clean();  
 @ini_set("zlib.output_compression", "Off" );
 $filename = $_GET["str"];
 
 function dl_file_resume($file){
   if (!is_file($file)) { die("<b>404 File not found!</b>" ); }
   $len = filesize($file);
   $filename = basename($file);
   $file_extension = strtolower(substr(strrchr($filename,"." ),1));
   switch( $file_extension ) {
    case "exe": $ctype="application/octet-stream"; break;
    case "zip": $ctype="application/zip"; break;
    case "mp3": $ctype="audio/mpeg"; break;
    case "mpg":$ctype="video/mpeg"; break;
    case "avi": $ctype="video/x-msvideo"; break;
    case "zip": $ctype="application/zip"; break;
    case "doc": $ctype="application/msword"; break;
    case "xls": $ctype="application/vnd.ms-excel"; break;
    case "ppt": $ctype="application/vnd.ms-powerpoint"; break;
     case "php":
     case "htm":
     case "html":
     case "txt": die("<b>Cannot be used for ". $file_extension ." files!</b>" ); break;
     default: $ctype="application/force-download";
   }
   header("Cache-Control:" );
   header("Cache-Control: must-revalidate, pre-check=0, post-check=0, max-age=0" );  
   header("Content-Description: File Transfer" );
   
   header("Content-Transfer-Encoding: none" );  
   header("Content-Type: $ctype" );
 header("Content-Disposition: attachment; filename=\"".basename($filename)."\";" );
header("Accept-Ranges: bytes" );
  $size=filesize($file);
   if(isset($_SERVER['HTTP_RANGE'])) {
 list($a, $range)=explode("=",$_SERVER['HTTP_RANGE']);
 str_replace($range, "-", $range);
 $size2=$size-1;
 $new_length=$size2-$range;
 header("HTTP/1.1 206 Partial Content" );
 header("Content-Length: $new_length" );
 header("Content-Range: bytes $range$size2/$size" );
} else {
 $size2=$size-1;
 header("Content-Range: bytes 0-$size2/$size" );
 header("Content-Length: ".$size2);
}
 
 
if ($file = fopen($file, 'rb')) {
   while(!feof($file) and (connection_status()==0)) {
 set_time_limit(9000);
 print(fread($file, 1024*8));
 flush();
   }
   fclose($file);
  }
  return((connection_status()==0) and !connection_aborted());
 
}
   exit;
     
}  
if (dl_file_resume($filename)){
die ("file transfer failed" );  
} else {  
}
?>
 
J'appelle le telechargement par : http://toto.fr/index.php?srt=Monnomdefichier.ppt
 
 
Le probleme est quoi que je fasse, quoi que j'ecrive le fichier se télécharge mais jamais en entier. Il se coupe aleatoirement 13Mo, 12, 14Mo...
 
Une idée ? un script magique ?
 
Merci d'avance.


Message édité par orlith le 13-04-2006 à 15:24:57
mood
Publicité
Posté le 12-04-2006 à 18:00:16  profilanswer
 

n°1345359
chaced
Posté le 12-04-2006 à 18:10:01  profilanswer
 

essai de remplacer la séquence fopen / fread par readfile, je l'utilise et ça marche bien.
 

Code :
  1. function readfile_chunked($filename,$retbytes=true)
  2.   {
  3.    $chunksize = 1*(1024*1024); // how many bytes per chunk
  4.    $buffer = '';
  5.    $cnt =0;
  6.    // $handle = fopen($filename, 'rb');
  7.    $handle = fopen($filename, 'rb');
  8.    if ($handle === false)
  9.    {
  10.      return false;
  11.    }
  12.    while (!feof($handle))
  13.    {
  14.      $buffer = fread($handle, $chunksize);
  15.      echo $buffer;
  16.      flush();
  17.      if ($retbytes)
  18.      {
  19.        $cnt += strlen($buffer);
  20.      }
  21.    }
  22.    $status = fclose($handle);
  23.    if ($retbytes && $status)
  24.    {
  25.      return $cnt; // return num. bytes delivered like readfile() does.
  26.    }
  27.    return $status;
  28.   }


---------------
CPU-Z | Timespy | Mes bd
n°1345369
orlith
Posté le 12-04-2006 à 18:25:46  profilanswer
 

Bonjour
 
Je viens de modifier mon script en ajoutant le tien, mais c'est pareil, la il vient de "terminer" le fichier au bout de 2Mo

n°1345372
orlith
Posté le 12-04-2006 à 18:27:23  profilanswer
 

Etrangement je viens de le relancer, et c'est encore au bout de 2Mo qu'il se termine.
Louche !

n°1345373
chaced
Posté le 12-04-2006 à 18:28:45  profilanswer
 

2Mo ?
 
Ouvre ton php.ini et change la ligne :
upload_max_filesize = 2M


---------------
CPU-Z | Timespy | Mes bd
n°1345375
cinocks
Posté le 12-04-2006 à 18:30:27  profilanswer
 

vu l'exemple c'est l'utilisateur qui telecharge un fichier sur un serveur. Et non un upload de la part de l'utilisateur. Donc le upload_max_filesize ne me parait pas approprié


---------------
MZP est de retour
n°1345377
chaced
Posté le 12-04-2006 à 18:31:27  profilanswer
 

tu as bien utilisé la fonction readfile_chunked ? pas la fonction readfile de php qui coupe a 2Mo ?


---------------
CPU-Z | Timespy | Mes bd
n°1345383
orlith
Posté le 12-04-2006 à 18:35:47  profilanswer
 

voila mon script :
<?php
 @ob_end_clean();  
    @ini_set("zlib.output_compression", "Off" );
 $filename = $_GET["str"];
 
function readfile_chunked($filename,$retbytes=true)
{    
   $len = filesize($filename);
   $filename = basename($filename);
   $file_extension = strtolower(substr(strrchr($filename,"." ),1));
 
   switch( $file_extension ) {
    case "exe": $ctype="application/octet-stream"; break;
    case "zip": $ctype="application/zip"; break;
    case "mp3": $ctype="audio/mpeg"; break;
    case "mpg":$ctype="video/mpeg"; break;
    case "avi": $ctype="video/x-msvideo"; break;
 case "zip": $ctype="application/zip"; break;
    case "doc": $ctype="application/msword"; break;
    case "xls": $ctype="application/vnd.ms-excel"; break;
    case "ppt": $ctype="application/vnd.ms-powerpoint"; break;
    case "php":
    case "htm":
    case "html":
    case "txt": die("<b>Cannot be used for ". $file_extension ." files!</b>" ); break;
    default: $ctype="application/force-download";
 }
 header("Cache-Control:" );
 header("Cache-Control: must-revalidate, pre-check=0, post-check=0, max-age=0" );  
 header("Content-Description: File Transfer" );
   
 header("Content-Transfer-Encoding: none" );  
 header("Content-Type: $ctype" );
 header("Content-Disposition: attachment; filename=\"".basename($filename)."\";" );
 header("Accept-Ranges: bytes" );
 header("Content-length: ".filesize($filename));    
$chunksize = 1*(1024*1024); // how many bytes per chunk    
$buffer = '';    
$cnt =0;    
// $handle = fopen($filename, 'rb');    
$handle = fopen($filename, 'rb');    
if ($handle === false)    
{      
return false;    
}    
while (!feof($handle))    
{      
set_time_limit(9000);  
$buffer = fread($handle, $chunksize);      
echo $buffer;      
flush();      
if ($retbytes)      
{        
$cnt += strlen($buffer);      
}    
}    
$status = fclose($handle);    
if ($retbytes && $status)    
{      
return $cnt;  
// return num. bytes delivered like readfile() does.    
}    
return $status;  
}  
 
 
if (readfile_chunked($filename)){
die ("file transfer failed" );  
// either the file transfer was incomplete  
// or the file was not found  
} else {  
// the download was a success  
// log, or do whatever else  
}
 
?>
 
 
Je viens de rajouter le set_time_limit et la il va plus loin que les 2Mo
Il vient de planter a 5mn de doanload et 14Mo/ 20Mo


Message édité par orlith le 12-04-2006 à 18:37:04
n°1345385
orlith
Posté le 12-04-2006 à 18:47:02  profilanswer
 

Ca pue le timing : ca vient encore de se couper a 4mn et 57s

n°1346153
orlith
Posté le 13-04-2006 à 15:24:25  profilanswer
 

Pour votre info :
 
le probleme venait de l'installation (automatique) de PHP5 qui par defaut s'installait en mode CGI.
Apres l'avoir desinstallé et reinstallé manuellement(avec le .ZIP et non le .EXE) en mode ISAPI, je n'ai plus de coupure durant le téléchargement.
 
Encore faut il le savoir....

mood
Publicité
Posté le 13-04-2006 à 15:24:25  profilanswer
 

n°1346212
chaced
Posté le 13-04-2006 à 16:16:36  profilanswer
 

D'un coté, encore fallait il savoir que tu utilisais IIS :D


---------------
CPU-Z | Timespy | Mes bd
n°1346321
orlith
Posté le 13-04-2006 à 17:38:19  profilanswer
 

Oups en effet je ne l'avais pas précisé.
 
Qu'utilisez vous ? Tomcat ? IIS ?
 
Merci de votre aide en tout cas.

n°1346437
chaced
Posté le 13-04-2006 à 20:17:24  profilanswer
 

Apache 1 sous linux :)


---------------
CPU-Z | Timespy | Mes bd

Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  PHP

  [RESOLU]Force Download gros fichier

 

Sujets relatifs
html et fichier texteerreur (de débutant) dans un batch windows [Résolu]
[résolu]Probléme de comparaison de checkbox[perl] ouverture de fichier d'extension particuliere.
[Résolu] Relation entre table sans intégrité référentielleLecture de fichier
[RESOLU]submit une textarea ??[RESOLU] Rechercher dans un fichier texte
[Resolu] probleme sur un script 
Plus de sujets relatifs à : [RESOLU]Force Download gros fichier


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