在PHP中使用CURL下载的某些图像已损坏

在PHP中使用CURL下载的某些图像已损坏,php,curl,Php,Curl,我在PHP中使用CURL从CSV文件的URL下载图像,但如果一行中有多个图像,则下载的图像中的一些图像已损坏,并且该图像的大小为0字节。 示例:- 如果CSV文件是这样的,那么第二个文件总是损坏的 Image 1, "https://d2qx4k6xgs9iri.cloudfront.net/ProductImages/ce363947-f23a-46d6-b106-1201cdca37f0.jpg, https://homepages.cae.wisc.edu/~ece533/images/a

我在PHP中使用CURL从CSV文件的URL下载图像,但如果一行中有多个图像,则下载的图像中的一些图像已损坏,并且该图像的大小为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);
}

我认为问题很可能是在协议之前的url中有空格-使用
trim
删除空格会有所帮助。我没有使用curl进行测试,而是简单地使用了
file\u get\u 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 );
其中,
$cacert
在别处定义,但本质上,在我的系统上是
c:\wwwroot\cacert.pem
~您可以从

我运行了以下代码,而不是上面的代码:

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 );

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);
}
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 );