Force Download gros fichier [RESOLU] - PHP - Programmation
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 :
|
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
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 !
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é
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
Marsh Posté le 12-04-2006 à 18:47:02
Ca pue le timing : ca vient encore de se couper a 4mn et 57s
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....
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.
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