我在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;
有什么想法吗?救命啊!
答案 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;”之后该文件末尾有换行符线。