Gravatar URL 混淆问题

3

我在使用Gravatars时遇到了一些问题:

当我请求以下内容时:

http://gravatar.com/avatar/8a17d0d0d8bdf6a8d527bbc943a17cf8.jpg?s=64&d=identicon

火狐浏览器会自豪地显示以下内容:
http://files.quickmediasolutions.com/gravatar_p.png

......表明该文件是PNG图像。

这让我感到困惑-我以为Gravatars是JPEG图像。看起来它们可以是任何一种格式。如何在不先下载的情况下确定给定图像是PNG还是JPEG?


注意:有些人报告说Gravatar只返回PNG图像。请解释一下:

http://files.quickmediasolutions.com/gravatar_p2.png

http://gravatar.com/avatar/03cd042b82ac85b2c5fe0757a94e0413?s=64&d=identicon
2个回答

1
如果 Gravatar 图标在您访问它们的服务器上有准确的 MIME 类型,请检查它们。JPEG 应该是 image/jpeg,PNG 应该是 image/png
如果没有......

http://en.wikipedia.org/wiki/Portable_Network_Graphics#File_header

一个PNG文件以8字节的签名开头。十六进制字节值为89 50 4E 47 0D 0A 1A 0A;十进制值为137 80 78 71 13 10 26 10。
因此,只需检查文件开头的八个字节;如果是PNG,则这些字节中将具有所述值,否则不会。只需下载文件,可能将其暂时存储在某个地方(考虑到它不应该太大),并根据标头包含的内容进行不同的处理。如果最初保存为错误类型,则始终可以更改文件扩展名,然后使用PHP的图形库。(或者您不能这样做吗?)
另外,我最喜欢的PNG标头的一点:
50 4E 47 在ASCII中,这些字母代表PNG,如果在文本编辑器中查看,则可以轻松识别格式。

是的。但JPEG文件中不是有'JFIF'吗?无论如何,谢谢。 - Nathan Osman
@George:不一定(尽管通常它们确实有JFIF头部)。http://en.wikipedia.org/wiki/JPEG#JPEG_files 只是PNG头部首先浮现在我的脑海中。 - JAB
根据我的经验,gravatar.com 上的 Content-Type 标头是可靠的,因此您可以在不下载整个图像的情况下确定它:只需发送 HTTP HEAD 请求,例如:curl --head 'http://gravatar.com/avatar/03cd042b82ac85b2c5fe0757a94e0413?s=1' 或者 curl --head 'http://gravatar.com/avatar/6dd5fae7d8f0c38b515a19a6ca4ca41d?s=1' - ecmanaut
@ecmanaut:在我写这个答案的时候,我对HTT协议的工作方式不是很了解,所以感谢您做出了那个注释(虽然现在对George来说可能有点太晚了)。有趣的是,在我刚上的网络课中,我们实际上从未利用过HEAD方法或在网络类中处理MIME类型... - JAB

0

结束标签是JPG,但字符串被服务器解释并发送相应的图像。在这种情况下是PNG。


所有的Gravatars都是PNG图像吗?如果不是,我如何在个别情况下确定它是哪种格式? - Nathan Osman
@George,是的,它们都作为PNG文件发送。 - Josh K
@George: 我原以为它们都被发送为PNG格式。我猜有些是,有些不是。我猜不同类型的Gravatar会决定发送的类型。 - Josh K
@Josh:我该如何确定我得到的是哪一个?我正在使用PHP的GD库进行处理,所以我必须事先知道。 - Nathan Osman

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接