我对此很困惑。尝试将此图像加载到浏览器中,然后将其保存到硬盘上。
http://profile.ak.fbcdn.net/hprofile-ak-snc4/41674_660962816_995_n.jpg
这是一个有效的JPEG文件,大小为11377字节。
现在尝试使用wget
或curl
下载它。仅显示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/