0

我正在尝试从网页中检索图像,到目前为止它一直运行良好,除了我正在查看的网站之一将图像提供为Content-Type: text/html,导致我的脚本将其拒绝为不是真实图像。

这是我用来确定内容类型的代码片段:

$accepted_mime = array('image/gif', 'image/jpeg', 'image/jpg', 'image/png');    
$headers = get_headers($image);

// Find the Content-Type header
$num_headers = sizeOf($headers);
for($x=0;$x<$num_headers;$x++) {
    preg_match('/^Content-Type: (.+)$/', $headers[$x], $mime_type);
    if (isset($mime_type[1]) && in_array($mime_type[1], $accepted_mime)) {
        return true;
    }
}

对于我尝试过的网站,它们会正确返回(例如 , 等结果image/gifimage/png,但mpaa.org似乎使用 type 来提供它们的图像text/html。这是正常的吗?

我添加了一个print_r来查看 get_headers` 返回的头数组:

Array
(
    [0] => http://www.mpaa.org/templates/images/header_mpaa_logo.gif
    [1] => Array
        (
            [0] => HTTP/1.1 200 OK
            [1] => Server: nginx/1.2.0
            [2] => Date: Sat, 17 Nov 2012 17:19:06 GMT
            [3] => Content-Type: text/html
            [4] => Connection: close
            [5] => P3P: CP="NON DSP COR ADMa OUR IND UNI COM NAV INT"
            [6] => Cache-Control: no-cache, no-store, must-revalidate
            [7] => Pragma: no-cache
        )

)

我可以轻松地将其添加text/html到我接受的内容类型列表中,但这绝对不是理想的解决方案;)有谁知道为什么 mpaa.org 用这个来提供他们的图像Content-Type?这样做是常规做法吗(可能使用旧网站/服务器)?

谢谢 :)

4

2 回答 2

2

精彩的 MPAA 使用用户代理嗅探或检查 cookie 来确定您的浏览器是否支持 JavaScript。由于您没有指定用户代理字符串或发送 cookie,因此他们假定您没有 JavaScript 并返回一个说明该内容的页面,而不是原始图像。

如果您使用浏览器加载它,您会注意到您确实得到image/gif了 ,以及您所追求的图像: http ://www.mpaa.org/templates/images/header_mpaa_logo.gif

如果您使用 cURL 或 Fiddler 或其他一些奇怪的用户代理字符串发出相同的请求:

本网站需要启用 JavaScript 和 Cookie。请更改您的浏览器设置或升级您的浏览器。

于 2012-11-17T18:58:31.583 回答
0

不要依赖标题。它们可以轻松更改,并且正如您现在遇到的那样,它们并不可靠。

我会这样做:

  • 下载图片
  • 检查图像是否是图像(通过使用 getimagesize 或类似的东西)
于 2012-11-17T18:56:58.407 回答