PHP回显jpeg图像失败,但将相同的图像写入文件效果很好。为什么?

时间:2010-10-04 10:48:02

标签: php image curl jpeg

我在PHP中有一个函数调用curl来检索图像。当我将其打印到文件并在浏览器中检查时,图像看起来很棒。当我使用curl结果的“echo”作为我的PHP脚本的返回值时,浏览器会显示损坏的图像图标(请参阅该图标的示例:http://www.artifacting.com/blog/wp-content/uploads/2007/01/error_icon.gif)。

$ch = curl_init(); 
$options = array(
  CURLOPT_CONNECTTIMEOUT => 120,
  CURLOPT_TIMEOUT        => 120,
  CURLOPT_HTTP_VERSION   => CURL_HTTP_VERSION_1_1,
  CURLOPT_FRESH_CONNECT  => 1,
  CURLOPT_HEADER         => 0,
  CURLOPT_USERAGENT      => "Mozilla/4.0 (compatible; MSIE 5.01; Windows NT 5.0)",
  CURLOPT_FOLLOWLOCATION => true,
  CURLOPT_HTTPPROXYTUNNEL => 1,
  CURLOPT_POST            => 1,
  CURLOPT_RETURNTRANSFER  => 1,
  CURLOPT_BINARYTRANSFER  => 1,
);

curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt_array($ch, $options);
curl_setopt($ch, CURLOPT_POSTFIELDS, $param_list);

// The http response code is 200, and the body length is 50kb.  
$body = curl_exec($curl_params);

// This produces a file containing an image that looks good when viewed in a browser.
$bodyFile = @fopen("img.jpg", "w");
fprintf($bodyFile, "%s", $body. "\n");
fclose($bodyFile);

// This does not render in the browser.  Instead I see the broken image icon.
$contentType = "image/jpeg";
header('Content-type: ' . $contentType);  
echo $body;

有什么想法吗?救命啊!

3 个答案:

答案 0 :(得分:2)

请确保您设置正确的cURL参数。

这个例子适用于我:

<?php 
$ch = curl_init ("http://www.google.com/images/logos/ps_logo2.png");
curl_setopt($ch, CURLOPT_HEADER, 0);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_BINARYTRANSFER,1);
$image=curl_exec($ch);
curl_close ($ch);
header("Content-Type: image/png");
echo $image;
?>

答案 1 :(得分:2)

答案取决于“破碎”的含义。如果图像的上半部分出现但下半部分没有出现,那么要么你的缓存中有一个糟糕的版本来自一个丢弃的数据包(空缓存,刷新,再试一次),或者脚本被过早地切断使用资源太多或运行时间过长。如果清空缓存无法解决问题,请检查php.ini设置,看看是否增加脚本的生存时间或最大内存可以解决问题。

如果图像是一堆无意义的ASCII,则在代码中的这一点之前回显某些东西或发送一个标题。最常见的原因是在页面顶部的<?php之前只有一个空行。如果是这种情况,请确保在<?php之前没有单个字节(甚至是不可打印的!)。

如果图像肯定是图像文件,但它是静态的,灰色框,随机颜色等 - 那么这就是内容类型的问题。尝试将JPG图像解析为PNG有时会产生灰色框或其他随机“失败”图像。

答案 2 :(得分:1)

事实证明我有另一个PHP文件正在写出一个额外的换行符。在“?&gt;”之后该文件末尾有换行符线。