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

我在PHP中有一个函数,它调用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;

有任何想法吗?救命!

解决方法:

答案取决于您所说的“破”.如果图像的上半部分出现了,但下半部分没有出现,则说明缓存中的数据包有错误的版本(空缓存,刷新,重试)或脚本被过早地切断了使用资源过多或运行时间过长.如果清空缓存不能解决问题,请检查php.ini设置,看看是否增加脚本的生存时间或最大内存可以解决该问题.

如果图像是一堆毫无意义的ASCII码,则在代码中的这一点之前,您已回显了某些内容或发送了标头.最常见的看不见的原因是在页面顶部的<?php之前有一个空行.如果是这种情况,请确保在<?php之前没有单个字节(甚至不可打印!). 如果图像绝对是图像文件,但它是静态的,灰色框,随机的颜色等,则这是内容类型的问题.尝试将JPG图像解析为PNG有时会产生一个灰色框或其他随机的“失败”图像.

上一篇:nginx中root与alias关键字的区别


下一篇:从C#中的memorystream保存为jpeg