PHP curl无法正确处理图像

PHP curl无法正确处理图像,php,curl,gd,libcurl,Php,Curl,Gd,Libcurl,我有一个内部代理,它从我自己的服务器获取数据并显示给客户端。我想尽量减少代理端代码,并认为只要将从content server获取的数据原样发送到客户端,就可以适用于所有媒体类型。对于HTML/文本代码来说,它工作得很好。但是,不适用于图像。我不明白为什么 以下是代理端代码: $curl_url="http//myserver.com/someimage.jpg"; //Open connection $curl_handle = curl_init(); curl_setopt($curl_h

我有一个内部代理,它从我自己的服务器获取数据并显示给客户端。我想尽量减少代理端代码,并认为只要将从content server获取的数据原样发送到客户端,就可以适用于所有媒体类型。对于HTML/文本代码来说,它工作得很好。但是,不适用于图像。我不明白为什么

以下是代理端代码:

$curl_url="http//myserver.com/someimage.jpg";
//Open connection
$curl_handle = curl_init();
curl_setopt($curl_handle,CURLOPT_COOKIE,session_name()."=".session_id().";");
//Set the url, number of POST vars, POST data
curl_setopt($curl_handle, CURLOPT_URL, $curl_url);
curl_setopt($curl_handle, CURLOPT_POST, count($_POST));
curl_setopt($curl_handle, CURLOPT_POSTFIELDS, $_POST);
curl_setopt($curl_handle, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($curl_handle, CURLOPT_AUTOREFERER, TRUE);
curl_setopt($curl_handle, CURLOPT_HEADER, 0);
/// curl_setopt($curl_handle, CURLOPT_HTTPHEADER, $curl_request_headers);
/// Above is actually uncommented but omitting details for brevity. They are just 
/// HTTP headers passed by the client
curl_setopt($curl_handle, CURLOPT_ENCODING, "identity");

//Execute post
$result = curl_exec($curl_handle);

//Close connection
curl_close($curl_handle);

echo $result;
为什么上面没有正确显示图像?(难道不可能使代理像一个虚拟网桥一样-它不解释服务器发送的结果,而只是将其传递,并且仍然使其适用于所有内容/媒体类型吗?)。有人能推荐最干净的解决方案吗


注:

1) content server通过php脚本处理所有文件,并使用
标题('Content-Type:image/jpeg')

如果我直接从服务器访问,它可以正常工作。但是,从代理来看,它不起作用(浏览器显示二进制数据)

(二) 我也不太明白你的意思

如果我使用

curl\u setopt($curl\u句柄,CURLOPT\u头,1)

浏览器尝试下载gzip数据(用于文本和图像)

如果我使用

curl\u setopt($curl\u句柄,CURLOPT\u头,0)

浏览器正确显示文本/图像,但不显示图像数据


当我通过代理(直接链接)访问浏览器中的图像时,这些是Google Chrome显示的响应标题


直接在content server上访问图像时的响应标题:

Accept-Ranges:bytes
Connection:Keep-Alive
Content-Length:3669
Content-Type:image/jpeg
Date:Mon, 29 Nov 2010 18:07:25 GMT
ETag:"1802b6-e55-49633c9623e40"
Keep-Alive:timeout=15, max=96
Last-Modified:Mon, 29 Nov 2010 16:44:33 GMT
Server:Apache/2.2.11 (Ubuntu) PHP/5.2.6-3ubuntu4.6 with Suhosin-Patch mod_ssl/2.2.11 OpenSSL/0.9.8g

我感觉这是由于通过代理的内容类型是GZIP。有人能帮我理解这一点吗:图像不是默认由apache压缩的吗?(我同意节省可能会更少)。如果不是,那么CURL(代理)是否正在压缩数据?“身份”难道不应该阻止它吗?如何修复?

好吧,您通过Curl将图像作为字符串获取,因此当您回显$result时,您正在打印图像的数据,而不是呈现
您需要使用
标题发送正确的标题,以告知浏览器正确的内容类型,否则它会假定它只是纯文本。

如果我直接在浏览器中访问http//myserver.com/someimage.jpg,我的服务器会将二进制数据返回浏览器(否)。(实际上,当遇到文件时,浏览器会发出文件请求);(图像通过服务器上的PHP提供)。如果我直接从服务器访问,它可以正常工作。但是,通过上述代理,它不起作用。另外,请看我在问题中添加的注释。好的,那么,这是如何设置的?我假设您的HTML输出有类似于
,或者什么?它是显示二进制输出,还是只是一个空白页面?哎呀,刚才看到你已经提到了。我不是很确定,但是使用Firebug中的网络面板查看正在发送/接收的头。
CURLOPT_头
控制响应头是否包含在
$result
中。将此设置为1可能会使您的生活更轻松,因为您不必担心自己发送正确的内容类型。@JP19好的,您的代理响应标题有“Content-type:text/html”。这就是问题所在。可能是Apache的MIME类型搞砸了,不过我对这方面的知识不太了解。斯宾塞的持续评论帮助我解决了这个问题。当CURLOPT_HEADER=1时,我没有正确解析头;当CURLOPT_HEADER=0时,我甚至没有尝试将正确的头返回给客户端。
Accept-Ranges:bytes
Connection:Keep-Alive
Content-Length:3669
Content-Type:image/jpeg
Date:Mon, 29 Nov 2010 18:07:25 GMT
ETag:"1802b6-e55-49633c9623e40"
Keep-Alive:timeout=15, max=96
Last-Modified:Mon, 29 Nov 2010 16:44:33 GMT
Server:Apache/2.2.11 (Ubuntu) PHP/5.2.6-3ubuntu4.6 with Suhosin-Patch mod_ssl/2.2.11 OpenSSL/0.9.8g