[RESOLU] Téléchargement de fichiers

Eléphanteau du PHP | 19 Messages

09 juil. 2019, 13:53

Bonjour,

J'essaie vainement d'écrire un programme capable de déclencher le téléchargement d'un fichier à partir d'un site.
Dans le répertoire du site j'ai l'arborescence suivante :
site/PHOTOS/PARIS
Dans le dossier PARIS, j'ai toutes les photos.
Dans le dossier PHOTOS, je place un fichier essai.php susceptible de faire le téléchargement sur l'ordinateur distant.
Lorsque je crée un fichier ZIP avec ZipArchive celui-ci se crée dans le dossier PHOTOS mais ne se télécharge pas sur l'ordinateur client (c'est pourtant ce que je veux faire).
les headers que j'écris sont :
header('Content-Type: application/octetstream');
header('Content-Disposition: attachment;filename="PARIS.zip"');
header("Pragma: no-cache");
header("Cache-Control: must-revalidate, post-check=0, pre-check=0, public");
header("Expires: 0");
Rien à faire, le fichier ne se télécharge pas sur l'ordinateur client.

Quelqu'un peut-il m'aider svp ?
Merci d'avance.

Avatar du membre
Administrateur PHPfrance
Administrateur PHPfrance | 9782 Messages

09 juil. 2019, 16:08

Bonjour,

Le content-type est erroné :
https://developer.mozilla.org/fr/docs/W ... MIME_types

Après il faut que tu lance la console réseau de ton navigateur (Ctrl+Maj+i dans Firefox ou Chrome) et que tu regardes ce qui est renvoyé par le serveur lors de ta requête. Les entêtes sont elles bonnes, y a-t-il bien le contenu du fichier zip renvoyé ?
Quand tout le reste a échoué, lisez le mode d'emploi...

Eléphanteau du PHP | 19 Messages

09 juil. 2019, 17:00

Merci de ta réponse.
Effectivement le Content-Type était erroné.
mais j'ai un problème de headers auxquels je ne comprends pas grand chose.
Voici le fichier essai3.php qui essaye de lire l'archive PARIS.zip
<?php
session_start();
?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">

<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="fr" lang="fr">
<head>
	<title>essai lecture Archive jpg</title>
</head>

<body>

<?php

      $zip = new ZipArchive(); 
      // On ouvre l’archive.
      if($zip->open('Paris.zip') == TRUE)
      {	// On crée l’archive.
      	if($zip->open('PARIS.zip', ZipArchive::CREATE) == TRUE)
      	{
       	 	//echo '&quot;PARIS.zip&quot; ouvert'.'<br>';
        	$zip->addFile('PARIS/20190629_172048.jpg');
			$zip->addFile('PARIS/20190629_172932.jpg');
			$zip->addFile('PARIS/20190629_173004.jpg');
			$zip->addFile('PARIS/20190629_182846.jpg');
			$zip->addFile('PARIS/20190630_101741.jpg');
			$zip->addFile('PARIS/20190630_132039.jpg');

        	$zip->close();
        
        	//echo '&quot;PARIS.zip&quot; fermé'.'<br>';
        
		  	header('Content-Type: application/octet-stream');
        	header('Content-Disposition: attachment;filename="PARIS.zip"');
        	header("Pragma: no-cache");
        	header("Cache-Control: must-revalidate, post-check=0, pre-check=0, public");
        	header("Expires: 0");
	  	
	  	}
      }else{
        echo 'Impossible d&#039;ouvrir &quot;Zip.zip&quot;';
      } 
?>
J'obtiens à chaque ligne de ligne 33 à ligne 37 :
Warning: Cannot modify header information - headers already sent by (output started at /customers/5/4/0/mon_ site.fr/httpd.www/CIF/PHOTOS/essai3.php:4) in /customers/5/4/0/mon_site.fr/httpd.www/CIF/PHOTOS/essai3.php on line 33
Une petite explication m'aiderait bien à comprendre les headers !....
Je pense que c'est là où il faut chercher ?

Eléphanteau du PHP | 19 Messages

09 juil. 2019, 17:06

OK, je viens de trouver.
J'ai supprimé les lignes vides qui aéraient mon script, et ça marche.
Excusez-moi du dérangement, c'est bien ma faute.

Merci à tous.
MC

Eléphanteau du PHP | 19 Messages

09 juil. 2019, 17:28

Il me reste quand même un problème :
Le fichier PARIS.zip est créé dans le répertoire du serveur.
Lorsque les headers sont envoyés, le navigateur (Firefox) demande bien si l'on veut enregistrer et le téléchargement a lieu.
Seulement, il n'y a aucun octet transféré !...
J'ai essayé header('Content-Type: application/zip'), mais ça fait pareil que header('Content-Type: application/octet-stream');
Par contre mon fichier d'archive est bon puisque si je le télécharge par glisser-déposer il se télécharge bien.
Merci de m'aider.

Avatar du membre
Administrateur PHPfrance
Administrateur PHPfrance | 9782 Messages

10 juil. 2019, 22:57

Si tu as la popup de téléchargement mais aucun octet transféré c'est que ton script PHP envoie bien les headers mais pas les données ensuite.
Quand tout le reste a échoué, lisez le mode d'emploi...