cURL headers 在命令行中显示 content-type 为 image/png,在 PHP 中显示 text/html?

cURL headers in command line show content-type as image/png, in PHP shows text/html?

我正在尝试使用 cURL 下载外部图像文件。当从命令行使用时,cURL 正确地声明响应 headers 和 content-type=image/png。但是,当我尝试在 PHP 中使用 cURL 时,它 returns content-type=text/html.

当尝试在 PHP 中使用 cURL 保存文件时,将 CURLOPT_BINARYTRANSFER 选项设置为 1,并结合 fopen/fwrite/,结果是损坏的文件。

我在其中使用的唯一 cURL 标志是 -A 来发送带有请求的用户代理,我也在 PHP 中通过调用 curl_setopt($ch, CURLOPT_USERAGENT, ...) 完成了此操作。

我唯一能想到的可能是 cURL 发送的一些后台请求 headers 没有考虑到使用标准 PHP 函数?

供参考;

CLI

curl -A "Mozilla/5.0 (Windows; U; Windows NT 5.1; de; rv:1.9.2.3) Gecko/20100401 Firefox/3.6.3" -I http://find.icaew.com/data/imgs/736c476534ddf7b249d806d9aa7b9ee8.png

PHP

private function curl($url) {
        $ch = curl_init();
        curl_setopt($ch, CURLOPT_URL, $url);
        curl_setopt($ch, CURLOPT_USERAGENT, "Mozilla/5.0 (Windows; U; Windows NT 5.1; de; rv:1.9.2.3) Gecko/20100401 Firefox/3.6.3");
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
        curl_setopt($ch, CURLOPT_BINARYTRANSFER, 1);
        curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 1);
        $response = array(
            'html' => curl_exec($ch),
            'http_code' => curl_getinfo($ch, CURLINFO_HTTP_CODE),
            'contentLength' => curl_getinfo($ch, CURLINFO_CONTENT_LENGTH_DOWNLOAD),
            'contentType' => curl_getinfo($ch, CURLINFO_CONTENT_TYPE)
        );
        curl_close($ch);
        return $response;
    }

public function parseImage() {
        $imageSrc = pq('img.firm-logo')->attr('src');
        if (!empty($imageSrc)) {
            $newFile = '/Users/firstlast/Desktop/Hashery/test01/imgdump/' . $this->currentListingId . '.png';
            $curl = $this->curl('http://find.icaew.com' . $imgSrc);
            if ($curl['http_code'] == 200) {
                if (file_exists($newFile)) unlink($newFile);
                $fp = fopen($newFile,'x');
                fwrite($fp, $curl['html']);
                fclose($fp);
                return $this->currentListingId;
            } else {
                return 0;
            }
        } else {
            return 0;
        }
    }

当我提到 content-type=text/html 时,对 $this->curl() 的调用导致返回的 $response 变量的 contentLengthcontentType 属性分别具有值 -1text/html

我可以想象这是一个相当晦涩的问题,所以我试图提供尽可能多的背景来说明我正在努力实现的目标 on/what。如果能帮助我理解为什么会这样,以及我能为 resolve/achieve 我的目标做些什么,我们将不胜感激

如果您确切地知道自己得到的是什么,那么 get_file_contents() 就简单多了。

A URL can be used as a filename with this function

http://php.net/manual/en/function.file-get-contents.php

此外,阅读 php.net 上的用户评论也很有帮助,因为他们已经编写了许多示例以及使用该功能的潜在问题或技巧。