Php - Récupérez et hébergez automatiquement les images utilisées dans vos articles
ARCHIVE
Il m'arrive, assez souvent je dosi dire, d'utiliser des images dans mes articles. Rien d'exceptionnel me direz vous. Par flemmardise ( :s ), j'ai pris la mauvaise habitude de ne pas télécharger ces images, mais de faire un lien (<img src=) directement vers l'image source. Pratique et rapide pour moi, mais peu sympathique pour l'hébergeur d'origine des images, duquel je "vole" plus ou moins la bande passante sans que cela ne lui apporte rien. Par soucis de "sympathie" (et de correction élémentaire), après avoir lu "De l'utilisation abusive des images des autres et du vol de bande passante" (http://linuxfr.org/2010/09/20/27398.html), j'ai eu soudain conscience que ce comportement n'étais "pas bien".
Vu le nombre d'articles qui utilisent des images hébergées ailleurs, je me voyais mal télécharger chaque image, puis modifier l'article pour remplacer les images, cela me prendrait plus d'une journée, et ma mauvaise conscience ne vaut pas cette dépense de temps et d'énergie. J'ai donc mis en place un script qui extrait les adresses d'images de mes articles, les télécharge si cela n'a pas déjà été fait, et les stocke sur les serveur avant de ne remplacer le lien dans l'article.
Par exemple, pour mon article sur les raccourcis twitter, l'image images/articles/Decouvrez-les-raccourcis-clavier-nouveau-Twitter-1.jpg devient http://gregoire-penverne.fr/images/articles/Decouvrez-les-raccourcis-clavier-nouveau-Twitter-1.jpg.
Deux intérêts, donc : respect de la bande passante d'autrui, et, du coup, optimisation du nom des images pour le référencement (car "Decouvrez-les-raccourcis-clavier-nouveau-Twitter-1.jpg" est plus intéressant que "Twitter-Ninja" ... ).
Premièrement, la fonction qui extrait toutes les images de vos articles :
function extract_images($str){
// On supprime les retours à la ligne
$str=preg_replace("/( | | )/", " ", $str);
// On recherche les images, via une regex:
$pattern = "!<img(.*)src=\"(.*)\"(.*)/>!Ui";
preg_match_all($pattern, $str, $out);
$img=array();
foreach($out[2] as $img_array){
$img[] = $img_array;
}
return $img;
}
Ensuite, la fonctione qui va remplacer vos liens images par de nouveaux liens images (se référant à votre site)
// $str est le texte source (de votre article par exemple)
// $name est le titre de votre article, qui deviendra le nom de l'image, incrementé en fonction du nombre d'images
function replace_images($str, $name){
// On utilise la fonction ecrite précédemment
$a=extract_images($str);
// on prépare notre incrémentation
$i=0;
// On parcourt le tableau renvoyé par extrat_image
foreach($a as $img){
$i++;
// On sélectionne une extension à donner au fichier
// pour les mimetype, le navigateur se débrouillera avec.
if(eregi('jpg', $img))$img_dest = 'images/articles/'.$t.'-'.$i.'.jpg';
else if (eregi('png', $img))$img_dest = 'images/articles/'.$t.'-'.$i.'.png';
else if (eregi('gif', $img))$img_dest ='images/articles/'.$t.'-'.$i.'.gif';
// Si l'image n' pas déjà été téléchargée, on la télécharge, et la stocke.
if(!is_file(absolu.$img_dest)){
// On télécharge l'image
$f=file_get_contents($img);
// On crée notre fichier de destination
touch(absolu.$img_dest);
// On insère le contenu downloadé dans le fichier de destination
$fp=fopen(absolu.$img_dest, 'w+');
fputs($fp, $f);
fclose($fp);
}
// On remplace dans $str l'ancien chemin vers l'image par le nouveau
$str=eregi_replace($img_src, 'http://votre_domaine.fr/'.$img_dest, $str);
}
// Et on retourne notre nouveau $str
return $str;
}
Par soucis de respect de la bande passante des autres, ce système simple ne vous coûte quasiment rien (en terme de temps) à mettre en place sur votre site, et vous permet de ne pas enquiquiner tout le monde ^^