8796 sujets

Développement web côté serveur, CMS

Bonjour à tous ! Smiley smile


J'ai un léger problème quant au téléchargement d'un fichier. En fait, il s'agit d'un petit script qui tire parti de la classe PCLZip en vue de permettre l'archivage des images d'une galerie photos afin de pouvoir la télécharger sans se taper le processus d'enregistrement fichier par fichier.

J'ai donc :

 <?php
	header('Content-Type: application/octet-stream');
	header("Content-Disposition: attachment; filename=".$_GET['folder'].".zip");
	header('Content-Transfer-Encoding: binary');
	
	require_once('pclzip.lib.php');
	$archive = new PclZip($_GET['folder'].'.zip');
	$v_dir = dirname(__FILE__)."/albums/".$_GET['folder']; // or dirname(__FILE__);
	$v_remove = $v_dir;
	$v_list = $archive->create($v_dir, PCLZIP_OPT_REMOVE_PATH, $v_remove);
	if ($v_list == 0) {
		die("Error : ".$archive->errorInfo(true));
	}
	
	readfile($_GET['folder'].".zip");
	
	// flush();
	// unlink($_GET['folder'].".zip");
?> 


En local, tout se passe très bien. Le fichier zip est correctement transmis (peu importe le navigateur), et à l'ouverture il n'est pas corrompu. Le problème se situe une fois le code transporté sur mon serveur. Lors d'un clic sur le lien de téléchargement, le zip est bien créé, mais readfile() me pond une page blanche bourrée de code, un peu comme si j'avais ouvert le zip au notepad. :o En résulte un crash pur et simple du navigateur. Smiley ohwell

Je me demandais quelle pouvait être la cause du problème ?


Merci d'avance. Smiley smile
Modifié par SolykZ (20 May 2009 - 17:08)
Bonsoir, et merci de ton intervention ! Smiley smile


Hum...lequel ? Celui-ci ne suffit-il pas ?

	header('Content-Type: application/octet-stream');
Je viens à présent de tester ceux-ci :

	header("Content-Type: application/octet-stream");
	header("Content-Type: application/zip");
	header("Content-Disposition: inline; filename=".$_GET["folder"].".zip");
	// header("Content-Disposition: attachment; filename=".$_GET["folder"].".zip");
	header("Content-Transfer-Encoding: binary");


Sans succès. Et j'ai l'impression que le problème vient de readfile(). :-o
Bonsoir ! Smiley smile


Merci de ton intervention. Smiley cligne

A vrai dire non, je n'ai pas cherché de ce côté, puisque si j'ai bien suivi (à vrai dire je pense avoir dépassé le stade de débutant en PHP mais je suis malgré tout très loin de tout savoir donc le plus clair du temps je passe d'abord par php.net) file_get_contents(); sert à insérer un fichier dans une string ? :o

A moins qu'il me faille créer un flux ? A vrai dire j'ai plus vraiment d'idée sur la procédure. Celle que "je vois partout" ne semble pas adaptée à mon cas. :-s

J'ai contacté mon hébergeur, dans le doute, et celui-ci me répond que je dois déclarer le type MIME du fichier ZIP dans un header. J'en parle ci-haut, il me semble que j'ai fait le tour. Il me propose également de rediriger vers le ZIP une fois celui-ci créé, mais outre le fait que ça ne me semble pas très propre, je perds le moyen de le supprimer du serveur une fois qu'il a été envoyé au client. Car l'idée ici est justement d'éviter d'avoir toute une flopée de fichiers ZIP stockés sur le serveur, auquel cas j'aurais tout fait "en dur". Smiley smile
Modifié par SolykZ (21 May 2009 - 19:43)
Pour ce qui est du remplacement de readfile tu pourrais faire
echo file_get_contents($_GET['folder'].".zip");
Sinon j'ai vu sur le site de PclZip que tu pouvais activer un mode trace pour vérifier que tout se passe bien.

PS : après avoir fait un test chez moi je suis obligé de mettre
header('Content-Type: application/zip');

Modifié par Heyoan (22 May 2009 - 13:43)
Bonjour ! Smiley smile


Eh bien finalement j'ai demandé à mon hébergeur l'ouverture d'un espace de stockage au débit, qui contient déjà la totalité des fichiers ZIP. Après tout, ceux-ci n'étant pas amenés à être modifiés, je crois que c'est toujours le plus simple. Smiley cligne

Sinon pour le tracing, vis-à-vis de la création du ZIP tout se déroule bien, tant localement qu'une fois sur serveur. C'est la transmission au navigateur qui se voulait être un véritable carnage. :-s


M'enfin, merci pour ta patience. Smiley smile