8722 sujets

Développement web côté serveur, CMS

Modérateur
Bonjour,

Il me faudrait rapatrier sur mon hébergement des images se trouvant sur d'autres serveurs. La méthode simple consistant à utiliser la fonction copy() ne fonctionne pas, car allow_url_fopen est désactivé pour des questions de sécurité. Cependant, un technicien se chargeant de l'hébergement m'a proposé d'utiliser curl à la place. En faisant une rapide recherche sur le web j'ai trouvé une fonction qui pourrait se charger de réaliser cette tâche :
<?php
function save_image($img,$fullpath){
    $ch = curl_init ($img);
    // Utilisation du proxy du serveur (d'après mon technicien, il faut que je passe par là...)
    curl_setopt($ch, CURLOPT_HTTPPROXYTUNNEL,true);
    curl_setopt($ch, CURLOPT_PROXY, "192.168.65.21");
    curl_setopt($ch, CURLOPT_PROXYPORT, 8080);
    // Copie de l'image
    curl_setopt($ch, CURLOPT_HEADER, 0);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
    curl_setopt($ch, CURLOPT_BINARYTRANSFER,1);
    $rawdata=curl_exec($ch);
    curl_close ($ch);
    if(file_exists($fullpath)){
        unlink($fullpath);
    }
    $fp = fopen($fullpath,'x');
    fwrite($fp, $rawdata);
    fclose($fp);
}
save_image('http://perso.jojaba.fr/xmedia/theme/airjojaba/img/logo.png','img/test.png');
?>

Le fichier se trouve bien dans le dossier "img" mais il ne "pèse" rien (0 ko). Quand je tape l'adresse de l'image que j'ai copiée, Firefox me dit que l'image ne peut être affichée car elle contient des erreurs.
J'ai tenté la copie par curl en indiquant le chemin complet de l'image sur mon serveur,cela ne marche pas mieux...
Une idée de ce qui se passe ? (j'ai compris que fopen() crée le fichier, mais le problème vient de fwrite(), il n'y a rien écrit dans le fichier, ou plutôt, fwrite écrit du vide, je suppose que l'erreur se passe donc dans les lignes "curl", l'image n'est pas récupérée...)

Merci d'avance.
Modifié par jojaba (24 May 2013 - 13:08)
Modérateur
Bon ben, j'ai essayé sans proxy et ça fonctionne impeccablement !
Va falloir que je m'adresse au technicien. Smiley cligne

Le code qui fonctionne donc :
<?php
function save_image($img,$fullpath){
    $ch = curl_init ($img);
    curl_setopt($ch, CURLOPT_HEADER, 0);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
    curl_setopt($ch, CURLOPT_BINARYTRANSFER,1);
    $rawdata=curl_exec($ch);
    curl_close ($ch);
    if(file_exists($fullpath)){
        unlink($fullpath);
    }
    $fp = fopen($fullpath,'x');
    fwrite($fp, $rawdata);
    fclose($fp);
}
save_image('http://perso.jojaba.fr/xmedia/theme/airjojaba/img/logo.png','img/test.png');
?>
Modérateur
Ah ben le technicien vient de me répondre...
Il suffisait d'enlever la ligne
curl_setopt($ch, CURLOPT_HTTPPROXYTUNNEL,true);

Elle est prévue pour le protocole https...