我对此很困惑。尝试将此图像加载到浏览器中,然后将其保存到硬盘上。

http://profile.ak.fbcdn.net/hprofile-ak-snc4/41674_660962816_995_n.jpg

这是一个有效的JPEG文件,大小为11377字节。

现在尝试使用wgetcurl下载它。仅显示11252个字节,并且图像的右下部分丢失了。

是什么赋予了?

最佳答案

开始…

进行数据包转储后,我发现Facebook向Safari返回了与 curl 相同的Content-Length,并且content-length是错误的11252:

GET/hprofile-ak-snc4/41674_660962816_995_n.jpg HTTP/1.1
用户代理:curl/7.19.7(universal-apple-darwin10.0)libcurl/7.19.7 OpenSSL/0.9.8l zlib/1.2.3
主持人:profile.ak.fbcdn.net
接受: */*

HTTP/1.1 200 OK
内容类型:图片/jpeg
...剪...
内容长度:11252

并使用Safari:

GET/hprofile-ak-snc4/41674_660962816_995_n.jpg HTTP/1.1
主持人:profile.ak.fbcdn.net
用户代理:Mozilla/5.0(Macintosh; U; Intel Mac OS X 10_6_6; zh-cn)AppleWebKit/533.20.25(KHTML,如Gecko)版本/5.0.4 Safari/533.20.27
...剪...

HTTP/1.1 200 OK
内容类型:图片/jpeg
...剪...
内容长度:11252

因此,我猜测Facebook发送的Content-Length不正确。为了测试这一点,我将使用netcat:

$猫头
GET/hprofile-ak-snc4/41674_660962816_995_n.jpg HTTP/1.0
主持人:profile.ak.fbcdn.net
接受: */*

紧急行动
$ nc -vvv profile.ak.fbcdn.net 80输出
警告:“142.231.1.174”的反向名称查找失败
注意:profile.ak.fbcdn.net [142.231.1.165]的真实主机名是a142-231-1-165.deploy.akamaitechnologies.com
profile.ak.fbcdn.net [142.231.1.174] 80(http)打开
接收的总字节数:12k(11639)
发送的总字节数:97
$头输出
HTTP/1.0 200 OK
内容类型:图片/jpeg
...剪...
内容长度:11252

(请注意,我使用的是HTTP/1.0,因此Facebook服务器不会尝试将连接保持打开状态)

使用文本编辑器删除ouput的前10行,然后将其另存为output.jpg,我得到了完整的图像。

因此,这可以确认Facebook发送了不正确的Content-Length header (并且图像被剪切掉了,因为curl注意的是内容长度,而netcat没有注意)。

进一步挖掘,似乎Aleski是正确的-当图像以gzip压缩格式发送时,Content-Length是正确的。为了确认这一点,我在自己的Accept-Encoding: gzip文件中添加了headers。 Facebook会正确发送回gzip的响应,该响应是预期的长度,然后将其解压缩会生成正确的图像。

tl;博士:如果Content-Length不是Content-Encoding,则Facebook的gzip不正确。

关于python - 浏览器和wget加载JPEG的方式不同吗?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/5507761/

10-10 07:17