2015-03-06 1 views
0

Я пытаюсь использовать cURL для загрузки внешнего файла изображения. При использовании из командной строки cURL правильно устанавливает заголовки ответов с content-type=image/png. Однако, когда я пытаюсь использовать cURL в PHP, он возвращает content-type=text/html.cURL заголовки в командной строке показывают контент-тип как изображение/png, в PHP отображается текст/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 

РНР

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 соответственно.

Я могу себе представить, что это довольно неясный вопрос, поэтому я попытался предоставить такой же контекст, как и то, что происходит/чего я пытаюсь достичь. Любая помощь в понимании, почему это так, и что я могу сделать, чтобы решить/достичь моей цели было бы очень полезно

+0

Если вы знаете, что URL-адрес, который вы скручиваете, является изображением, и все, что вы хотите сделать, это загрузить, тогда вы можете просто использовать file_get_contents. http://php.net/manual/en/function.file-get-contents.php – khuderm

+0

@khuderm Brilliant, отлично работал - странно, как запрос cURL не работал одинаково, спасибо :) – AliBaba

+0

Добро пожаловать. Я отвечу на мой комментарий в качестве ответа, так как вы решили проблему. XD – khuderm

ответ

0

Если вы точно знаете, что получаете, то get_file_contents() намного проще.

URL-адрес может быть использован в качестве имени файла с этой функцией

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

Кроме того, полезно пройти через комментарии пользователей на php.net, как они написали много примеров и потенциальные проблемы или приемы использования этой функции.