Некоторые загруженные изображения повреждены при использовании CURL в PHP - PullRequest
0 голосов
/ 12 февраля 2019

Я использую CURL в PHP для загрузки изображений с URL-адресов из CSV-файла, но если в одной строке содержится более одного изображения, некоторые загруженные изображения повреждены, а размер этого изображения равен 0 байт.Пример: - Если файл CSV подобен этому, тогда второй файл всегда поврежден.

Image 1, "https://d2qx4k6xgs9iri.cloudfront.net/ProductImages/ce363947-f23a-46d6-b106-1201cdca37f0.jpg, https://homepages.cae.wisc.edu/~ece533/images/airplane.png"

Но если я удалил первое или второе изображение, то изображение успешно сохранено.Пример:

Image 2, https://homepages.cae.wisc.edu/~ece533/images/arctichare.png

Вот мой код, который читает файл CSV

    $file = fopen($file, "r");
    while (!feof($file)) {
        $data = fgetcsv($file);
        $images = $data[1];
        $images = explode(',', $images); //exploding images by ,
        foreach ($images as $image) {
            $milliseconds = md5(round(microtime(true) * 1000)) . '.jpg';
            $imagename = saveImage($image, $milliseconds);
        }
}

Ниже saveImage функция

function saveImage($url,$image_name){

echo $url.'<br/>'; //URL is correct and have image. I have checked it manually
$ch = curl_init ($url);
    curl_setopt($ch, CURLOPT_HEADER, 0);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
    curl_setopt($ch, CURLOPT_BINARYTRANSFER,1);
    $raw=curl_exec($ch);
    curl_close ($ch);

    $fp = fopen('assets/products/large/' . $image_name,'x');
    fwrite($fp, $raw);
    fclose($fp);
}

Точный пример для файла CSV, которыйЯ использую

Images 1, "https://d2qx4k6xgs9iri.cloudfront.net/ProductImages/ce363947-f23a-46d6-b106-1201cdca37f0.jpg, https://homepages.cae.wisc.edu/~ece533/images/airplane.png"
Images 2, https://homepages.cae.wisc.edu/~ece533/images/arctichare.png
Images 3, "https://homepages.cae.wisc.edu/~ece533/images/fruits.png, https://homepages.cae.wisc.edu/~ece533/images/girl.png"
Images 4, "https://homepages.cae.wisc.edu/~ece533/images/goldhill.bmp, https://homepages.cae.wisc.edu/~ece533/images/tulips.png"

1 Ответ

0 голосов
/ 12 февраля 2019

Я думаю, что проблема может заключаться в том, что в протоколе есть место перед протоколом - использование trim для удаления пробела поможет.Вместо того, чтобы использовать curl для тестирования, я просто использовал file_get_contents, и он загрузил все файлы ОК.

$dir = 'c:/temp/downloads/';

$file=__DIR__ . DIRECTORY_SEPARATOR . 'img.csv';
$file=fopen( $file, 'r' );


while( !feof( $file ) ){
    $line = fgetcsv( $file );
    if( !empty( $line[1] ) ){
        $urls = explode( ',', $line[1] );

        foreach( $urls as $url ){
            $url=trim( $url );

            $bytes = file_put_contents( $dir . basename( $url ), file_get_contents( $url ) );
            printf('Saved %s - size: %sKb<br />',basename( $url ),$bytes / 1024 );
        }
    }
}
fclose( $file );

Функция curl также нуждается в небольшой настройке - поскольку URL-адреса превышают SSL, вам действительно необходимо добавить дополнительные параметры в запрос curl.Я изменил функцию следующим образом:

function saveImage( $url, $image_path ){
    global $cacert;
    $fp = fopen( $image_path, 'w+' );

    $ch = curl_init( $url );
    curl_setopt($ch, CURLOPT_HEADER, 0 );
    curl_setopt($ch, CURLOPT_TIMEOUT, 10 );
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true );
    curl_setopt($ch, CURLOPT_BINARYTRANSFER, true );
    curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true );
    curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, true );
    curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 2 );
    curl_setopt($ch, CURLOPT_CAINFO, $cacert );
    curl_setopt($ch, CURLOPT_ENCODING, '' );
    curl_setopt($ch, CURLOPT_FILE, $fp );

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

Где $cacert определено в другом месте, но по сути, в моей системе это c:\wwwroot\cacert.pem ~, вы можете скачать копию с здесь - curl.haxx.se

Я запустил этот код, а не выше, как показано ниже:

while( !feof( $file ) ){
    $line = fgetcsv( $file );
    if( !empty( $line[1] ) ){
        $urls = explode( ',', $line[1] );

        foreach( $urls as $url ){
            $url=trim( $url );
            saveImage( $url, $dir . basename( $url ) );
        }
    }
}
fclose( $file );

screenshot showing downloaded images

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...