Probleme readfile / header (fichier corrompu)

Petit nouveau ! | 2 Messages

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 ?
//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 :wink:

Pitet
Invité n'ayant pas de compte PHPfrance

03 janv. 2014, 13:18

Salut,

Le problème vient peut-être des limites par défaut de php concernant la mémoire disponible et/ou le temps d’exécution d'un script :
- http://php.net/manual/fr/ini.core.php#ini.memory-limit
- http://www.php.net/manual/fr/info.confi ... ution-time

Si ton script dépasse la limite de mémoire allouée ou de temps d'exécution, celui va s'arrêter brutalement, ce qui pourrait expliquer que ton fichier zip soit corrompu car pas complètement téléchargé.

Bonne journée

Petit nouveau ! | 2 Messages

25 janv. 2014, 20:23

Hello, merci pour tes informations.
En réalité le fichier qui se télécharge est complet, il fait bien la taille attendue (par ex 200MO), le buffer dans le scrit est réinitialisé pour justement passer outre ce probleme d'allocation de la mémoire, et cela est problématique également pour les tout petits fichiers.

Si je répare le fichier avec win rar par exemple, pas de problème, j'en conclus que c'est juste la finalisation de la création du fichier qui pose probleme, donc les headers, non ? :|

En tous cas je suis preneur d'autres idées et infos !
Merci !

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 8758 Messages

27 janv. 2014, 18:33

salut,

ouvre le fichier avec notepad ++ (ou n'importe quel équivalent sauf word et notepad ;) ) et regarde s'il n'y aurait une séquence qui parle en fin de ficher (genre du texte qui pour toi a un air de déjà vue et te dirais que ça n'a rien a foutre ici :)


tu peux aussi fournir le script complet histoire de voir si cela vient de la (ainsi que les éventuels enchaînement d'appel (require / include) pour que l'on puisse voir si cela n'aurais pas une incidence sur la chose ;)



@+
Il en faut peu pour être heureux ......