Récupérer ZIP sur serveur 1 pour décompresser sur serveur 2

Petit nouveau ! | 4 Messages

25 oct. 2013, 09:39

Bonjour,

- La française des jeux fournit un fichier ZIP téléchargeable ici :
https://media.fdj.fr/generated/game/lot ... u_loto.zip
Ce ZIP de 42 Ko contient un seul fichier CSV (100 Ko) qui contient tous les tirages du loto depuis 2008.

- J'aimerai récupérer ce zip du serveur FDJ avec le PHP puis le décompresser dans un dossier de mon hébergement (afin de pouvoir le parcourir, le traiter et afficher des statistiques depuis mon poste via javascript).

- Si je met le zip à la main via FTP dans mon répertoire racine ma fonction marche et je récupère bien le CSV dans un sous dossier.
PAR CONTRE ,si je vais chercher le Zip à distance ça ne marche pas.

Quelqu'un pourrait me donner une idée de ce qu'il se passe ?

voici mon code :
<?php
function unzip($file, $path='', $effacer_zip=false)
{/*Méthode qui permet de décompresser un fichier zip $file dans un répertoire de destination $path
  et qui retourne un tableau contenant la liste des fichiers extraits
  Si $effacer_zip est égal à true, on efface le fichier zip d'origine $file*/
	$tab_liste_fichiers = array(); //Initialisation
	$zip = zip_open($file);
	if ($zip)
	{
		while ($zip_entry = zip_read($zip)) //Pour chaque fichier contenu dans le fichier zip
		{
			if (zip_entry_filesize($zip_entry) > 0)
			{
				$complete_path = $path.dirname(zip_entry_name($zip_entry));
				/*On supprime les éventuels caractères spéciaux et majuscules*/
				$nom_fichier = zip_entry_name($zip_entry);
				$nom_fichier = strtr($nom_fichier,"ÀÁÂÃÄÅàáâãäåÒÓÔÕÖØòóôõöøÈÉÊËèéêëÇçÌÍÎÏìíîïÙÚÛÜùúûüÿÑñ","AAAAAAaaaaaaOOOOOOooooooEEEEeeeeCcIIIIiiiiUUUUuuuuyNn");
				$nom_fichier = strtolower($nom_fichier);
				$nom_fichier = ereg_replace('[^a-zA-Z0-9.]','-',$nom_fichier);
				/*On ajoute le nom du fichier dans le tableau*/
				array_push($tab_liste_fichiers,$nom_fichier);
				$complete_name = $path.$nom_fichier; //Nom et chemin de destination
				if(!file_exists($complete_path))
				{
					$tmp = '';
					foreach(explode('/',$complete_path) AS $k)
					{
						$tmp .= $k.'/';
						if(!file_exists($tmp))
						{ mkdir($tmp, 0755); }
					}
				}
				/*On extrait le fichier*/
				if (zip_entry_open($zip, $zip_entry, "r"))
				{
					$fd = fopen($complete_name, 'w');
					fwrite($fd, zip_entry_read($zip_entry, zip_entry_filesize($zip_entry)));
					fclose($fd);
					zip_entry_close($zip_entry);
				}
			}
		}
		zip_close($zip);
		/*On efface éventuellement le fichier zip d'origine*/
		if ($effacer_zip === true)
		unlink($file);
	}
	return $tab_liste_fichiers;
}	
/**********************************************************/
$liste = array();
$liste = unzip('https://media.fdj.fr/generated/game/loto/nouveau_loto.zip','zips/');
echo 'Le fichier zip contenait '.count($liste).' fichier(s) :<br />';
foreach ($liste as $nom_fichier)
{
	echo $nom_fichier.'<br />';
}
?>
Modifié en dernier par Ykar le 25 oct. 2013, 10:07, modifié 1 fois.

ViPHP
ViPHP | 2577 Messages

25 oct. 2013, 09:56

Il est possible que php ne soit pas paramétré pour ouvrir des fichiers distants.
Une recherche pour trouver un message d'erreur pourrait être intéressante pour aider à comprendre pourquoi ca ne marche pas.

Petit nouveau ! | 4 Messages

25 oct. 2013, 10:00

J'ai une erreur 11 sur le zip_open. (error open)

J'ai bien l'autorisation d'ouvrir des fichiers, phpinfo : allow_url_fopen On

ViPHP
xTG
ViPHP | 7331 Messages

25 oct. 2013, 10:11

Il n'est pas marqué dans la doc que cette fonction accepte les urls distantes.
C'est écrit pour chaque fonction quand c'est autorisé.

Donc je dirais que c'est ce qui pêche.
Télécharges le fichier sur ton serveur2 en tant que fichier temporaire. :)

ViPHP
ViPHP | 2577 Messages

25 oct. 2013, 10:24

#define ZIP_ER_OPEN 11 /* S Can't open file */
A mon avis, voir allow_url_fopen dans php.ini pour permettre l'ouverture de fichiers distant.

Edit : sous réserve que ce soit possible comme le souligne xTG