Probleme readfile / header (fichier corrompu)

Répondre


Cette question est un moyen d’empêcher des soumissions automatisées de formulaires par des robots.
Smileys
:D :) :( :o :shock: :? 8-) :lol: :x :P :oops: :cry: :evil: :twisted: :roll: :wink: :!: :?: :idea: :arrow: :| :mrgreen: =D> #-o =P~ :^o :non: :priere: 8-|
Voir plus de smileys
  Revue du sujet
 

  Étendre la vue Revue du sujet : Probleme readfile / header (fichier corrompu)

Re: Probleme readfile / header (fichier corrompu)

par moogli » 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 ;)



@+

Re: Probleme readfile / header (fichier corrompu)

par Roumpf » 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 !

Re: Probleme readfile / header (fichier corrompu)

par Pitet » 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

Probleme readfile / header (fichier corrompu)

par Roumpf » 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: