【问题标题】:PNG file saved using CURL is corrupt使用 CURL 保存的 PNG 文件已损坏
【发布时间】:2013-04-11 02:26:49
【问题描述】:

我正在使用来自SO thread 的以下代码,但输出的文件是损坏的 PNG 文件。我无法在任何图像编辑器中查看它。我想抓取的图片可以在this direct link找到。

<?php
function getimg($url) {         
        $headers[] = 'Accept: image/gif, image/png, image/x-bitmap, image/jpeg, image/pjpeg';   
        $headers[] = 'Connection: Keep-Alive';         
        $headers[] = 'Content-type: application/x-www-form-urlencoded;charset=UTF-8';         
        $user_agent = 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.31 (KHTML, like Gecko) Chrome/26.0.1410.64 Safari/537.31';         
        $process = curl_init($url);         
        curl_setopt($process, CURLOPT_HTTPHEADER, $headers);         
        curl_setopt($process, CURLOPT_HEADER, 0);         
        curl_setopt($process, CURLOPT_USERAGENT, $user_agent);         
        curl_setopt($process, CURLOPT_TIMEOUT, 30);         
        curl_setopt($process, CURLOPT_RETURNTRANSFER, 1);         
        curl_setopt($process, CURLOPT_FOLLOWLOCATION, 1);         
        $return = curl_exec($process);         
        curl_close($process);         
        return $return;     
    } 

    $imgurl = 'http://download.videos.framebase.io/5a94a14f-aca6-4fb0-abd3-f880966358ab/6bf94ebb-4712-4895-9c85-fb8d4a19d50c/8f8b778f-6335-4351-82e7-6f50fd7fdd06/1351620000000-000020/thumbs/00001.png'; 
    if(file_exists($imgsave)){continue;} 
    $image = getimg($imgurl); 
    file_put_contents($imgsave,$image); 
?>

我错过了什么?是我正在使用的标题吗?是文件吗?我尝试在浏览器中手动保存文件,并且使用我的图像编辑器加载得很好。

任何想法将不胜感激,谢谢! -- 24x7

编辑: 我知道我将其标记为已解决,但再三考虑,我仍然无法查看服务器正在保存的 PNG。以下是迄今为止的建议:

<?php
            function grab_image($url){
                echo $url;
                  $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);
                  $saveto = 'recent-image.png';
                  if(file_exists($saveto)){
                      unlink($saveto);
                  }

                  $fp = fopen($saveto,'x');
                  fwrite($fp, $raw);
                  fclose($fp);
                }   

    grab_image("http://download.videos.framebase.io/2acd363b-ab1f-4305-8f1c-c1eaa6ebcc2a/abb6a3b7-414c-461b-a84c-56032060575d/e3682943-6959-456d-89db-8cd96647ddd4/1351620000000-000020/thumbs/00001.png");
?>

我一遍又一遍地运行脚本,但没有成功,再次感谢任何帮助。这是它输出的 PNG 的sample。提前致谢。

【问题讨论】:

  • 很好奇,除了需要设置 $imgsave 之外,您的代码对我来说运行良好。你能把这个损坏的 PNG 放在某个地方进行检查吗?
  • 您的代码对我来说很好用。请原谅这个明显的问题,但是您是否在每次测试脚本时都删除了目标文件?由于您的代码测试目标文件,如果您不是每次都删除本地文件,getimg() 只会在您第一次运行脚本时运行。
  • 感谢您的回复,我每次运行脚本时都会手动删除文件,只是出于测试目的。您可以在这里找到损坏的样本,on my personal server 告诉我您的想法,谢谢!
  • 这是一个表示访问被拒绝的 XML 文件。
  • 嗯,我真的不知道...这可能是我设置的标题...不过感谢您的帮助!

标签: php image curl png


【解决方案1】:

你可以使用正常的功能,比如

function grab_image($url,$saveto){
    $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);
     $saveto = "D:/test.png";
    if(file_exists($saveto)){
        unlink($saveto);
    }

$fp = fopen($saveto,'x');
fwrite($fp, $raw);
fclose($fp);

}

grab_image('http://download.videos.framebase.io/5a94a14f-aca6-4fb0-abd3-f880966358ab/6bf94ebb-4712-4895-9c85-fb8d4a19d50c/8f8b778f-6335-4351-82e7-6f50fd7fdd06/1351620000000-000020/thumbs/00001.png','');

并确保在 php.ini 中启用 allow_url_fopen ..

【讨论】:

    猜你喜欢
    • 2014-10-24
    • 1970-01-01
    • 1970-01-01
    • 2023-03-24
    • 1970-01-01
    • 1970-01-01
    • 2011-09-11
    • 2018-07-12
    • 1970-01-01
    相关资源
    最近更新 更多