Probleme readfile / header (fichier corrompu)
Posté : 26 déc. 2013, 17:59
Bonjour !
J'utilise ce script pour permettre le téléchargement d'un zip volumineux (issu du manuel) mais il me fournit une erreur au moment d'ouvrir le zip dans windows "unexpected end of archive", ou en français "fin du fichier inattendue"
J'arrive bien à ouvrir le zip, a voir les fichiers, mais toujours l'erreur apparait pour l'extraction/lecture du contenu.. bref le fichier est corrompu.
Quelques infos :
- Si le fichier est téléchargé par l'adresse absolue (site.com/file.zip), pas de soucis, c'est donc un problème de headers ?
- Le fichier corrompu peut être réparé par le programme winrar,
- Je n'avais pas de problème sans le script, mais obligé de l'utiliser vu la taille des zip à créer.
Avez vous une idée du problème ?

J'utilise ce script pour permettre le téléchargement d'un zip volumineux (issu du manuel) mais il me fournit une erreur au moment d'ouvrir le zip dans windows "unexpected end of archive", ou en français "fin du fichier inattendue"
Quelques infos :
- Si le fichier est téléchargé par l'adresse absolue (site.com/file.zip), pas de soucis, c'est donc un problème de headers ?
- Le fichier corrompu peut être réparé par le programme winrar,
- Je n'avais pas de problème sans le script, mais obligé de l'utiliser vu la taille des zip à créer.
Avez vous une idée du problème ?
//on crée un zip
$zip = new ZipArchive();
if($zip->open($file.'.zip', ZipArchive::CREATE)){
while($zip->addFile(
//... ajout des fichiers
}
$zip->close();
}
//Headers
header('Content-type: application/zip');
header('Content-Length: ' . filesize($file.'.zip'));
header('Content-Description: File Transfer');
header('Content-Transfer-Encoding: binary');
header('Expires: 0');
header('Cache-Control: must-revalidate');
header('Pragma: public');
header('Content-Disposition: attachment; filename="Photos - Olouf.fr.zip"');
// Fonction readfile amelioree
readfile_chunked($file.'.zip',$retbytes=true);
function readfile_chunked($filename,$retbytes=true) {
$chunksize = 1*(1024*1024); // how many bytes per chunk
$buffer = '';
$cnt =0;
$handle = fopen($filename, 'rb');
if ($handle === false) {
return false;
}
while (!feof($handle)) {
$buffer = fread($handle, $chunksize);
echo $buffer;
ob_flush();
flush();
if ($retbytes) {
$cnt += strlen($buffer);
}
}
$status = fclose($handle);
if ($retbytes && $status) {
return $cnt; // return num. bytes delivered like readfile() does.
}
return $status;
}
Merci