Сохранение удаленного изображения с помощью cURL? - PullRequest
4 голосов
/ 18 мая 2010

Утро всем,

Есть несколько вопросов по этому поводу, но ни один, который действительно отвечает на мой вопрос, насколько я понимаю. В основном у меня есть скрипт GD, который имеет дело с изменением размера и кэшированием изображений на нашем сервере, но мне нужно сделать то же самое с изображениями, хранящимися на удаленном сервере.

Итак, я хочу сохранить изображение локально, затем изменить его размер и отобразить как обычно.

У меня так далеко ...

        $file_name_array = explode('/', $filename);
        $file_name_array_r = array_reverse($file_name_array);  

        $save_to = 'system/cache/remote/'.$file_name_array_r[1].'-'.$file_name_array_r[0];

        $ch = curl_init($filename);
        $fp = fopen($save_to, "wb");

        // set URL and other appropriate options
        $options = array(CURLOPT_FILE => $fp,
                         CURLOPT_HEADER => 0,
                         CURLOPT_FOLLOWLOCATION => 1,
                         CURLOPT_TIMEOUT => 60); // 1 minute timeout (should be enough)

        curl_setopt_array($ch, $options);

        curl_exec($ch);
        curl_close($ch);
        fclose($fp);

Это создает файл изображения, но не копирует его? Я упускаю суть?

Приветствия, ребята.

Ответы [ 3 ]

3 голосов
/ 29 июня 2010

Более просто, вы можете использовать file_put_contents вместо fwrite :

$file_name_array = explode('/', $filename);
$file_name_array_r = array_reverse($file_name_array);  
$save_to = 'system/cache/remote/'.$file_name_array_r[1].'-'.$file_name_array_r[0];
file_put_contents($save_to, file_get_contents($filename));

или всего в 2 строки:)

$file_name_array_r = array_reverse( explode('/', $filename) );  
file_put_contents('system/cache/remote/'.$file_name_array_r[1].'-'.$file_name_array_r[0], file_get_contents($filename));
2 голосов
/ 18 мая 2010

Ну, я разобрался! Изучив мои изображения, а не код немного ближе, выяснилось, что некоторые изображения ошибались на их стороне, а не на моей. Как только я выбрал работающее изображение, мой код тоже заработал!

Ура, как всегда, ребята:)

0 голосов
/ 18 мая 2010

Лично я не люблю использовать функции curl, которые пишут в файл. Попробуйте вместо этого:

    $file_name_array = explode('/', $filename);
    $file_name_array_r = array_reverse($file_name_array);  

    $save_to = 'system/cache/remote/'.$file_name_array_r[1].'-'.$file_name_array_r[0];

    $ch = curl_init($filename);
    $fp = fopen($save_to, "wb");

    // set URL and other appropriate options
    $options = array(CURLOPT_HEADER => 0,
                     CURLOPT_FOLLOWLOCATION => 1,
                     CURLOPT_TIMEOUT => 60,
                     CURLOPT_RETURNTRANSFER, true //Return transfer result
                     );

    curl_setopt_array($ch, $options);
    //Get the result of the request and write it into the file
    $res=curl_exec($ch);
    curl_close($ch);
    fwrite($fp,$res);
    fclose($fp);

Но вы можете использовать что-то более простое без скручивания:

$file_name_array = explode('/', $filename);
$file_name_array_r = array_reverse($file_name_array);  
$save_to = 'system/cache/remote/'.$file_name_array_r[1].'-'.$file_name_array_r[0];
$content=file_get_contents($filename); 
$fp = fopen($save_to, "wb");
fwrite($fp,$content);
fclose($fp);
...