Заголовки cURL в командной строке показывают тип контента как image / png, в PHP показывает text / html?

0

Я пытаюсь использовать 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 соответственно.

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

  • 0
    если вы знаете, что URL-адрес, который вы используете, является изображением, и все, что вам нужно сделать, это загрузить, то вы можете просто использовать file_get_contents. php.net/manual/en/function.file-get-contents.php
  • 0
    @khuderm Блестящий, отлично работал - странно, как запрос cURL не работал так же, спасибо :)
Показать ещё 1 комментарий
Теги:
curl
fopen
fwrite

1 ответ

0
Лучший ответ

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

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

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

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

Ещё вопросы

Сообщество Overcoder
Наверх
Меню