我正在尝试使用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
。
我可以想象这是一个相当模糊的问题,所以我试图提供与正在发生的事情/我正在努力实现的目标相同的背景。任何帮助理解为什么会这样,以及我可以做些什么来解决/实现我的目标将非常感激
答案 0 :(得分:0)
如果您确切知道自己得到了什么,那么get_file_contents()
就会简单得多。
URL可以用作具有此功能的文件名
http://php.net/manual/en/function.file-get-contents.php
此外,在php.net上查看用户评论是有帮助的,因为他们已经编写了许多示例以及使用该函数的潜在问题或技巧。