@Kerm

При загрузке изображения через Curl теряется информация об изображении?

Здравствуйте, есть скрипт:

Данный скрипт берет из txt файла ссылки на изображения и скачивает их в папку, изображения скачиваются и даже открываются на компьютере, проблема появилась, когда я их решил открыть через браузер, они не открываются, я полез в их свойства (свойства файла) и там нет информации об изображении вообще не какой, типа размеров, точек на дюйм, глубины цвета, вообще не чего, я думаю что mime-type не сохраняется, возможно я ошибаюсь. Можете помочь мне, глянуть код, где я ошибся?

<?php
declare(strict_types=1);
error_reporting(E_ALL);
ini_set('display_errors','1');


function grab_image($url, $saveto){
    if (file_exists($saveto)){
        unlink($saveto);
    }

    $fp = fopen($saveto, 'w+b');
    if (false === $fp) {
        throw new RuntimeException ( 'fopen() failed.   last error: ' . return_var_dump ( error_get_last () ) );
    }

    $ch = curl_init($url);
    if (false === $ch) {
        throw new RuntimeException ( 'curl_init() failed.   last error: ' . return_var_dump ( error_get_last () ) );
    }

    ecurl_setopt($ch, CURLOPT_URL, $url);
    ecurl_setopt($ch, CURLOPT_FILE, $fp);
    ecurl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
    ecurl_setopt($ch, CURLOPT_BINARYTRANSFER, 1);
    ecurl_setopt($ch, CURLOPT_TIMEOUT, 30);
    ecurl_setopt($ch, CURLOPT_VERBOSE, 1);
    ecurl_setopt($ch, CURLOPT_STDERR, $fp);

    ecurl_exec($ch);
    curl_close($ch);

    fclose($fp);
}

$file = file_get_contents('images.txt');
$images = explode("\n", $file);
$i = 0;

foreach ($images as $image) {
    $i++;

    $image = str_replace(" ","%20", trim($image));

    echo "image number: " .$i. "<br>";

    $fileName = explode('/', $image);
    end($fileName);
    $key = key($fileName);

    $fp = 'images/'.$fileName[$key];
    grab_image($image, $fp);
}

function ecurl_setopt ( /*resource*/$ch , int $option , /*mixed*/ $value ):bool{
    $ret=curl_setopt($ch,$option,$value);
    if($ret!==true){
        //option should be obvious by stack trace
        throw new RuntimeException ( 'curl_setopt() failed. curl_errno: ' . return_var_dump ( curl_errno ($ch) ).'. curl_error: '.curl_error($ch) );
    }
    return true;
}
function ecurl_exec ( /*resource*/$ch)/*:mixed depending on CURLOPT_RETURNTRANSFER*/{
    $ret=curl_exec($ch);
    if($ret===false){
        throw new RuntimeException ( 'curl_exec() failed. curl_errno: ' . return_var_dump ( curl_errno ($ch) ).'. curl_error: '.curl_error($ch) );
    }
    return $ret;
}


function return_var_dump(/*...*/){
    $args = func_get_args ();
    ob_start ();
    call_user_func_array ( 'var_dump', $args );
    return ob_get_clean ();
}
  • Вопрос задан
  • 55 просмотров
Решения вопроса 1
nokimaro
@nokimaro Куратор тега PHP
UPD: уберите CURLOPT_VERBOSE. Так как иначе verbose данные пишутся в файл и он конечно портится
ecurl_setopt($ch, CURLOPT_VERBOSE, 1);

вывод ошибок CURLOPT_STDERR тоже не стоит направлять в $fp.

Чисто по функционалу не вижу проблем в коде.
Для более точной диагностики проблемы с файлом можно сравнить их содержимое на бинарном уровне
1. скачиваете файл браузером
2. скачиваете файл curl

сравниваете содержимое через через любую diff-тулзу которая умеет сравнивать бинарные данные, например https://www.fairdell.com/hexcmp/

будет понятно, "побился" ли файл при передаче через curl и если побился то где, в начале где идут magick bytes или может быть в конце так как не дозаписался.
А может быть у вас вообще при передаче возникли ошибки которые тоже записались в этот файл, так как указано
ecurl_setopt($ch, CURLOPT_STDERR, $fp);

Если при скачивании файла из браузера и при скачивании через curl их содержимое одинаковое, то проблема скорее в самом исходном файле.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы