[RESOLU]Force Download gros fichier

Force Download gros fichier [RESOLU] - PHP - Programmation

Marsh Posté le 12-04-2006 à 18:00:16    

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
Reply

Marsh Posté le 12-04-2006 à 18:00:16   

Reply

Marsh Posté le 12-04-2006 à 18:10:01    

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
Reply

Marsh Posté le 12-04-2006 à 18:25:46    

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

Reply

Marsh Posté le 12-04-2006 à 18:27:23    

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

Reply

Marsh Posté le 12-04-2006 à 18:28:45    

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


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

Marsh Posté le 12-04-2006 à 18:30:27    

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
Reply

Marsh Posté le 12-04-2006 à 18:31:27    

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


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

Marsh Posté le 12-04-2006 à 18:35:47    

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
Reply

Marsh Posté le 12-04-2006 à 18:47:02    

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

Reply

Marsh Posté le 13-04-2006 à 15:24:25    

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....

Reply

Marsh Posté le 13-04-2006 à 15:24:25   

Reply

Marsh Posté le 13-04-2006 à 16:16:36    

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


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

Marsh Posté le 13-04-2006 à 17:38:19    

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

Reply

Marsh Posté le 13-04-2006 à 20:17:24    

Apache 1 sous linux :)


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

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed