MAJ automatique icones

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 : MAJ automatique icones

Re: MAJ automatique icones

par Bo$$ Bravo » 23 mars 2012, 07:43

Tout fonctionne, un grand merci pour ton aide ;)

Quand je regarde, finalement c'est très simple ^^ mais bon, il suffit de prendre un peu de recul comme à chaque fois :P

Bravo =D> =D> =D>

Merci et Bonne journée ;)

Re: MAJ automatique icones

par sadeq » 23 mars 2012, 01:56

En fait c'est la fonction
$fp = fopen($file, "w"); 
qui enregistre le fichier icone téléchargé et non pas CURL (CURL ne s'occupe que de la communication http avec le serveur et transmet les données téléchargées à $fp qui est le fichier ouvert par fopen. cf. les lignes que tu as relatées)
Donc si tu veux donner un chemin d'accès au fichier d'enregistrement c'est simple, tu n'as rien à modifier dans la fonction CURL de téléchargement, il suffit de modifier le nom du fichier donné dans la variable $nomFichierAEnregistrer qui se trouve dans notre script rechercheFichier.php un peu comme ça:
...
$nomFichierAEnregistrer = 'icones/'.$fichierRecherche; #ici, vous pouvez donner le nom du fichier que vous voulez enregistrer

...
Par contre le dossier 'icones/' doit exister car la fonction fopen() doit pouvoir créer le fichier demandé dans le dossier existant et si le dossier 'icones/' n'existe pas elle crash.

Voila.

Re: MAJ automatique icones

par Bo$$ Bravo » 22 mars 2012, 20:54

J'ai fini de tester tout cela, j'ai apporté 2-3 modifs pour bien adapter à mon script global. Tout fonctionne ! Merci beaucoup =D>

Juste un réglage que je n'arrive pas à peaufiner, c'est l'url où s'enregistrera l’icône. J'aimerai que l'icône ne s'enregistre pas là où le fichier curl.php et rechercherFichiers.php sont localisés, mais dans un dossier icônes, ce dernier étant localisé au même endroit que les deux fichiers php.

Je suppose qu'il faut modifier une de ces trois lignes, mais je ne m'y connais pas trop en cURL, et j'ai pas réussi a trouver trop d'infos.
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()";
Merci ;)

Re: MAJ automatique icones

par sadeq » 19 mars 2012, 15:55

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. :wink:

Re: MAJ automatique icones

par sadeq » 19 mars 2012, 10:27

Je veux dire par "téléchargement MIME" le fait d'envoyer un contenu comme une pièce-jointe où le récepteur effectue une sorte d'upload de la pièce pour l'enregistrer chez lui.

La méthode idéale dans ton cas puisque le client qui recevra le fichier et le serveur qui l’enverra sont purement deux programmes et non deux utilisateurs via un navigateur, est d'utiliser les fonction PHP qui permettent de lire des flux HTTP comme les URL fopen ou CURL.

Re: MAJ automatique icones

par Bo$$ Bravo » 19 mars 2012, 07:50

C'était un peu l'idée que je me faisait au début, mais le soucis survenait quand je devait transférer l'icône de mon site au site lambda, tu parle de téléchargement MIME, tu pourrait détailler un peu plus stp ?

Merci Beaucoup ;)

Bonne journée.

Re: MAJ automatique icones

par sadeq » 18 mars 2012, 23:48

Ah bah, si les sites lambda ne sont pas les tiennes alors là ça se complique car le problème est que le script doit avoir le droit d'accès en lecture et écriture pour écrire sa demande d'icône manquante. De ce fait, cette solution est non viable.

Dans ce cas, je te propose une seconde solution sans FTP qui considère ton site principal comme un serveur d'icônes et les sites lambda comme des sites clients qui demandent des icônes. Le script serveur reste donc uniquement sur ton site principal et des scripts clients se mettront sur les sites lambda distants.

Voici l'architecture:

1. Script serveur d'icône : serveurIcones.php
========================================
  • a. à la demande d'un site lambda qui envoi une requête HTTP de type GET demandant un fichier icône donné comme ça: http://tonsite.com/serveurIcones.php?fi ... rechercher
    b. recherche du fichier $_GET['fichier'] dans le dossier '/icones' se trouvant sur le serveur,
    c. si trouvé : renvoi le fichier trouvé par téléchargement MIME.
    d. si non trouvé écrire un événement "icône manquante" portant le nom $_GET['fichier'] dans le fichier texte servant de journal de notification des icônes recherchées et non trouvées.
2. Script client demandant une icône : clientIcones.php
=================================================
C'est ce script qui normalement contacte le script serveur quand il aura besoin d'une icône en envoyant une requête HTTP de la forme: http://tonsite.com/serveurIcones.php?fi ... rechercher
Il recevra en guise de réponse à cet appel HTTP soit rien soit l'icône demandée sous forme de contenu téléchargé et dans ce cas il doit écrire ce fichier dans le dossier "/icones" de son site.

L'avantage de cette solution est que chaque script exécute les opérations sur les fichiers (recherche, écriture) sur un dossier local et donc aucun problème de sécurité.

Voilà.

Re: MAJ automatique icones

par Bo$$ Bravo » 18 mars 2012, 23:24

Ok, donc il faut bien que je fasse un autre login et un autre password pour ce script non ? je vais pas mettre mes identifiants sur un script que je vais distribuer :lol:
Et là, OVH me coince je pense. Ou alors je n'ai pas compris le fonctionnement.

Cdt.

Re: MAJ automatique icones

par sadeq » 18 mars 2012, 22:35

Ce script sera sur le site lambda distant car c'est lui qui doit initier la recherche puisqu'il est le seul concerné. Ton site se comportera comme un serveur d'icônes, c'est au autres site lambda distants de lancer chacun sa propre recherche et éventuellement écrire le fameux message (sous forme de fichier txt) d’icône manquante.

Voici le script complet:
<?php
# Rechercher un fichier dans un dossier par FTP
################################################

# paramètres de connexion FTP
$ftp_server = "xxxxxxxxxxxxxxx";
$login = "xxxxxxxxxxxxxxx";
$password = "xxxxxxxxxxxxx";
$dossierRecherche = "/icones";
$nomFichierRecherche = "/icones/icone1.ico";

# se connecter au serveur FTP
$connect = ftp_connect($ftp_server) or die("Impossible de trouver le serveur $ftp_server"); 

# ouvrir une session utilisateur
ftp_login($connect, $login, $password)or die("Connexion impossible en tant que $login");


# Recherche dans le dossier
$trouve = false;
$contenuDossier = ftp_nlist($connect, $dossierRecherche);
if (is_array($contenuDossier)) foreach($contenuDossier as $fichier)
{
	if (trim(strtolower($fichier)) == trim(strtolower($nomFichierRecherche))) 
	{
		# fichier trouvé
		$trouve = true;
		break; # arreter la recherche
	}
}

# si non trouve ecriture d'un evenement icone manquante dans un fichier FTP
if ($trouve == false)
{
	$file = 'icone_manquante'.date("Y-m-d-H-i-s").'.txt'; #nom daté
	file_put_contents($file, "Icône manquante: $nomFichierRecherche");
	$fp = fopen($file, 'r');
	ftp_fput($connect, $file, $fp, FTP_ASCII);
	fclose($fp);
}

# fermeture de la connexion
ftp_close($connect);

# resultat de la recherche
if ($trouve == true) echo "le fichier $nomFichierRecherche existe bien"; 
else echo "le fichier $nomFichierRecherche n'existe pas";

?>

Re: MAJ automatique icones

par Bo$$ Bravo » 18 mars 2012, 22:30

Ce script sera sur mon site ? ou le site lambda distant ?

Re: MAJ automatique icones

par sadeq » 18 mars 2012, 22:18

C'est une solution a laquelle j'avais pensé, mais je ne peut créer un deuxième login, je suis en hébergement mutualisé Perso et je n'ai pas le Multi-FTP.
Et pourquoi as-tu besoin d'un multi-FTP puisque le programme (qu'on est en train de développer) sera exécuté par tous les sites lambda qui chercheront des icônes sur ton site principal (biblio d'icônes) et qu'il y moins de chances que ces sites lambda feront la recherche simultanément d'autant plus que la durée de la recherche sera vraiment rapide. ou alors je n'ai pas encore bien compris ton système.

Re: MAJ automatique icones

par Bo$$ Bravo » 18 mars 2012, 21:21

C'est une solution a laquelle j'avais pensé, mais je ne peut créer un deuxième login, je suis en hébergement mutualisé Perso et je n'ai pas le Multi-FTP.

Re: MAJ automatique icones

par sadeq » 18 mars 2012, 20:02

Bonjour,

Voici donc une piste qui peut t'intéresser. Sachant que les accès vont se faire sur des dossiers distants, il ne faut pas compter sur les fonction PHP de manipulation de dossiers comme glob(), scandir() ou readdir() car elles ne peuvent pas faire d'accès distant. Et puisque de toutes façons l'accès distant est sécurisé sur les sites, il faut donc se rabattre sur la solution idéale : L'ACCES FTP par PHP.

Voici donc une solution qui te permet de commencer :
L'objectif de cette solution est de parcourir un dossier nommé "/icones" se trouvant sur un site distant accédé par une connexion FTP pour chercher un nom de fichier donné nommé ($nomfichierRecherche).

Pour t'aider à réaliser ce programme je te propose le code suivant qui permet d'ouvrir une connexion FTP puis lister le dossier "/icones".
<?php
# Lister le contenu d'un dossier par FTP
################################################

# paramètres de connexion FTP
$ftp_server = "xxxxxxxxxxxxxxx"; # nom FTP du serveur ciblé
$login = "xxxxxxxxxxxxxxx"; # login de l'utilisateur ayant un droit d'accès
$password = "xxxxxxxxxxxxxxxx"; #mot de passe

# se connecter au serveur FTP
$connect = ftp_connect($ftp_server) or die("Impossible de trouver le serveur $ftp_server"); 

# ouvrir une session d'utilisateur
ftp_login($connect, $login, $password)or die("Connexion impossible en tant que $login");

# Récupération du contenu d'un dossier
$contenuDossier = ftp_nlist($connect, '/icones');
echo '<h1>Liste</h1><ul>';
if (is_array($contenuDossier)) foreach($contenuDossier as $fichier)
{
	echo '<p>'.$fichier.'</p>'; # affiche le contenu trouvé
}
else 
{
	echo '<p>Vide</p>'; # si contenu vide
}
echo '</ul>';

# fermeture de la connexion
ftp_close($connect);
?>
Voila, fait ça et verra plutard.

Re: MAJ automatique icones

par Bo$$ Bravo » 17 mars 2012, 13:37

Merci beaucoup.

Re: MAJ automatique icones

par sadeq » 17 mars 2012, 13:16

Bon, j'ai finalement compris ce que tu veux faire et c'est assez simple, seulement je suis pas dispo maintenant, je te posterai une réponse détaillée dans le soir.