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

时间:2015-03-06 23:02:25

标签: php curl fopen fwrite

我正在尝试使用cURL下载外部图像文件。从命令行使用时,cURL会使用content-type=image/png正确指出响应标头。但是,当我尝试在PHP中使用cURL时,它会返回content-type=text/html

尝试使用PHP中的cURL保存文件时,CURLOPT_BINARYTRANSFER选项设置为1,与fopen/fwrite/一起使用,结果是文件损坏。

我正在使用的唯一cURL标志是-A向用户代理发送请求,我也是通过调用curl_setopt($ch, CURLOPT_USERAGENT, ...)在PHP中完成的。

我能想到的唯一可能导致这种情况的可能是cURL发送的一些后台请求标头,这些标头不使用标准的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()的调用会导致返回的contentLength变量的contentType$response属性具有值{分别为{1}}和-1

我可以想象这是一个相当模糊的问题,所以我试图提供与正在发生的事情/我正在努力实现的目标相同的背景。任何帮助理解为什么会这样,以及我可以做些什么来解决/实现我的目标将非常感激

1 个答案:

答案 0 :(得分:0)

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

  

URL可以用作具有此功能的文件名

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

此外,在php.net上查看用户评论是有帮助的,因为他们已经编写了许多示例以及使用该函数的潜在问题或技巧。