Voici une solution avec CURL exigeant que l'extension php_curl soit activée dans la config PHP.
La première fonction sera celle qui interroge une URL et enregistre le contenu renvoyé par la réponse HTTP de cette URL dans un fichier local. La voici dans ce script :
curl.php
<?php
/*
Script trouvé sur le site http://www.php.net/manual/fr/curl.examples.php - contribution de : jlee8df at gmail dot com 30-May-2008 01:47) que j'ai légèrement adapté pour qu'il n'enregistre pas les fichiers vides non trouvés sur le serveur en utilisant $fileInfo.
*/
# Download from URL to FILE
function cURLcheckBasicFunctions()
{
if( !function_exists("curl_init") &&
!function_exists("curl_setopt") &&
!function_exists("curl_exec") &&
!function_exists("curl_close") ) return false;
else return true;
}
/*
* Returns string status information.
* Can be changed to int or bool return types.
*/
function cURLdownload($url, $file)
{
if( !cURLcheckBasicFunctions() ) return "UNAVAILABLE: cURL Basic Functions";
$ch = curl_init();
if($ch)
{
$fp = fopen($file, "w");
if($fp)
{
if( !curl_setopt($ch, CURLOPT_URL, $url) )
{
fclose($fp); // to match fopen()
curl_close($ch); // to match curl_init()
return "FAIL: curl_setopt(CURLOPT_URL)";
}
if( !curl_setopt($ch, CURLOPT_FILE, $fp) ) return "FAIL: curl_setopt(CURLOPT_FILE)";
if( !curl_setopt($ch, CURLOPT_HEADER, 0) ) return "FAIL: curl_setopt(CURLOPT_HEADER)";
if( !curl_exec($ch) ) return "FAIL: curl_exec()";
$fileInfo = curl_getinfo($ch);
curl_close($ch);
fclose($fp);
# return success if downloaded file is not empty else delete it
if (isset($fileInfo['size_download']) && $fileInfo['size_download']>0){
return "SUCCESS: $file is downloaded from [$url]";
}
else {
unlink($file);
return "FAIL: $file is not found in this location [$url]";
}
}
else return "FAIL: fopen()";
}
else return "FAIL: curl_init()";
}
# TEST OF FUNCTION Download from URL to FILE
#echo cURLdownload("http://www.google.fr", "CURL_example.txt");
?>
Dans notre cas cette fonction sera utilisée par le client lambda qui envoi une demande de recherche d'un fichier (icone) sur un serveur d'icones (qu'on va écrire). Voici le script qui fait cette recherche via la fonction curl.
rechercheFichier.php:
<?php
# recherche d'un fichier donné
if (! isset($_GET['fichier'])) { exit(); }
# fonction curl de téléchargement d'une url dans un fichier local
require_once("curl.php");
# Paramètres de la fonction curl
$fichierRecherche = $_GET['fichier'];
$URL = "http://localhost/echangeFichiers/serveur/serveurFichiers.php?fichier=".$fichierRecherche;
$nomFichierAEnregistrer = $fichierRecherche; #ici, vous pouvez donner le nom du fichier que vous voulez enregistrer
# exécution de la recherche/téléchargement
echo cURLdownload($URL, $nomFichierAEnregistrer);
#si $fichierRecherche est trouvé dans le site $URL, il sera téléchargé et enregistré dans le fichier $nomFichierAEnregistrer
?>
$URL dans ce script correspond donc au script :
serveurFichiers.php qui reçoit le paramètre "fichier" par GET (?fichier=".$fichierRecherche)
Le serveur de fichier est programmé pour rechercher l'existance du fichier donné $fichier dans un dossier précis puis renvoi son contenu par téléchargement MIME (header+content-type) au client demandeur sinon il écrit un événement dans le fichier journal local pour signaler l'absence du fichier (file_put_contents)
Voici le script serveur :
serveurFichiers.php
<?php
if (isset($_GET['fichier'])){
# traiter le fichier demandé
$file = "icones/".$_GET['fichier'];
# si le fichier existe alors le transmettre à l'affichage par téléchargement
if (file_exists($file)){
# télécharger fichier
if(ini_get('zlib.output_compression')) ini_set('zlib.output_compression', 'Off'); #pas de compression
if(isset($_SERVER["HTTP_USER_AGENT"]) && strstr($_SERVER["HTTP_USER_AGENT"],"MSIE")==false) { #Pour IE
header("Content-Type: application/force-download");
header('Content-Description: File Transfer');
}
readfile($file);
exit;
# fin de téléchargement
}
else {
# écrire un événement "fichier manquant" dans le journal
$eventList = file_exists("journal.txt") ? file_get_contents("journal.txt") ."\r\n" : "";
$eventList .= "Date: " .date("d/m/Y H:i:s"). " - Fichier manquant: " . $file;
file_put_contents("journal.txt", $eventList);
}
}
?>
Pour tester ces scripts j'ai créé un dossier principal nommé "echangeFichiers" dans lequel j'ai placé 2 dossiers : "serveur" et "client".
Le dossier "serveur" doit contenir les éléments suivants:
1. un dossier "icones" contenant quelques icônes comme "icone1.ico", "icone2.ico" ...
2. le script "serveurFichiers.php"
Le dossier "client" doit contenir les éléments suivants:
1. le script "curl.php"
2. le script "rechercheFichier.php" qui fait un require_once() du fichier curl.php car il utilise sa fonction curl.
Pour exécuter un test il suffit d'appeler le script "rechercheFichier.php" du dossier client comme ça par exemple:
http://localhost/echangeFichiers/client ... icone3.ico
Et voila.
