PHP curl неправильно обрабатывает изображения - PullRequest
0 голосов
/ 29 ноября 2010

У меня есть внутренний прокси-сервер, который получает данные с моего собственного сервера и отображает их на клиенте.Я хотел, чтобы код прокси-стороны был минимальным, и думал, что просто отправка данных, полученных с сервера контента как есть, клиенту будет работать для всех типов мультимедиа.Он отлично работает для кода HTML / TEXT.Однако не для изображений.Я не могу понять, почему.

Вот код стороны прокси:

$curl_url="http//myserver.com/someimage.jpg";
//Open connection
$curl_handle = curl_init();
curl_setopt($curl_handle,CURLOPT_COOKIE,session_name()."=".session_id().";");
//Set the url, number of POST vars, POST data
curl_setopt($curl_handle, CURLOPT_URL, $curl_url);
curl_setopt($curl_handle, CURLOPT_POST, count($_POST));
curl_setopt($curl_handle, CURLOPT_POSTFIELDS, $_POST);
curl_setopt($curl_handle, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($curl_handle, CURLOPT_AUTOREFERER, TRUE);
curl_setopt($curl_handle, CURLOPT_HEADER, 0);
/// curl_setopt($curl_handle, CURLOPT_HTTPHEADER, $curl_request_headers);
/// Above is actually uncommented but omitting details for brevity. They are just 
/// HTTP headers passed by the client
curl_setopt($curl_handle, CURLOPT_ENCODING, "identity");

//Execute post
$result = curl_exec($curl_handle);

//Close connection
curl_close($curl_handle);

echo $result;

Почему выше не отображаются изображения правильно?(Разве нельзя сделать прокси похожим на фиктивный мост - чтобы он не интерпретировал результат, отправленный сервером, а просто передавал его и все равно заставлял работать для всех типов контента / медиа?).Кто-нибудь может предложить самое чистое решение?


Примечания:

1) Контент-сервер обрабатывает все файлы через скрипт php и правильно передает заголовок, используя header('Content-Type: image/jpeg');

Работает нормально, если я получаю доступ напрямую с сервера.Однако из прокси-сервера это не работает (браузер отображает двоичные данные).

2) Я не очень хорошо понимаю CURLOPT_HEADER.

Если я использую

*Браузер 1020 *

пытается загрузить сжатые данные (как для текста, так и для изображений).

Если я использую

curl_setopt($curl_handle, CURLOPT_HEADER, 0);

Браузер отображает текст/ images правильно, но не данные изображения.


Это заголовки ответа, отображаемые в Google Chrome, когда я обращаюсь к изображению в браузере через прокси-сервер (прямая ссылка).

Response Headers
Cache-Control:no-store, no-cache, must-revalidate, post-check=0, pre-check=0
Connection:Keep-Alive
Content-Encoding:gzip
Content-Length:2576
Content-Type:text/html
Date:Mon, 29 Nov 2010 18:03:52 GMT
Expires:Thu, 19 Nov 1981 08:52:00 GMT
Keep-Alive:timeout=15, max=100
Pragma:no-cache
Server:Apache/2.2.14 (Ubuntu)
Vary:Accept-Encoding
X-Powered-By:PHP/5.3.2-1ubuntu4.5

Заголовки ответа при доступе к изображению непосредственно на контент-сервере:

Accept-Ranges:bytes
Connection:Keep-Alive
Content-Length:3669
Content-Type:image/jpeg
Date:Mon, 29 Nov 2010 18:07:25 GMT
ETag:"1802b6-e55-49633c9623e40"
Keep-Alive:timeout=15, max=96
Last-Modified:Mon, 29 Nov 2010 16:44:33 GMT
Server:Apache/2.2.11 (Ubuntu) PHP/5.2.6-3ubuntu4.6 with Suhosin-Patch mod_ssl/2.2.11 OpenSSL/0.9.8g

У меня такое чувство, что это связано с тем, что тип контента GZIP через прокси-сервер.Может кто-нибудь, пожалуйста, помогите мне понять это: не являются ли изображения GZIPPed по умолчанию apache?(Я согласен, что экономия может быть меньше).Если нет, то CURL (прокси) распаковывает данные?Разве CURLOPT_ENCODING, «идентичность», не должен этому помешать?Как мне исправить?

Ответы [ 2 ]

1 голос
/ 29 ноября 2010

Вам нужно отправить правильные заголовки, используя header, чтобы сообщить браузеру правильный тип контента, в противном случае он предполагает, что это просто открытый текст.

0 голосов
/ 29 ноября 2010

Ну, вы получаете изображение в виде строки с помощью Curl, поэтому, когда вы отображаете $ result, вы печатаете данные для изображения, а не рендеринг <img src="..." />

...