Я пытаюсь использовать cURL для загрузки внешнего файла изображения. При использовании из командной строки cURL корректно устанавливает заголовки ответов с content-type=image/png
. Когда я пытаюсь использовать cURL в PHP, он возвращает content-type=text/html
.
При попытке сохранить файл с использованием cURL в PHP с параметром CURLOPT_BINARYTRANSFER
установленным в 1, в сочетании с fopen/fwrite/
, результатом является поврежденный файл.
Единственными флагами cURL, которые я использую, являются -A
для отправки пользовательского агента с запросом, который я также сделал на PHP, вызывая curl_setopt($ch, CURLOPT_USERAGENT,...)
.
Единственное, что я могу думать об этом, это, возможно, некоторые заголовки фоновых запросов, отправленные 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
и text/html
соответственно.
Я могу себе представить, что это довольно неясный вопрос, поэтому я попытался предоставить такой же контекст, как и то, что происходит/чего я пытаюсь достичь. Любая помощь в понимании, почему это так, и что я могу сделать для решения/достижения моей цели, будет очень признателен
Если вы точно знаете, что получаете, то get_file_contents()
намного проще.
URL-адрес может использоваться как имя файла с этой функцией
http://php.net/manual/en/function.file-get-contents.php
Кроме того, полезно прочесть комментарии пользователей на php.net, поскольку они написали много примеров и потенциальных проблем или приемов использования этой функции.