|
HTTP POST средствами php
|
| Автор |
Сообщение |
girafenok Два пингвиненка


Зарегистрирован: 17.11.2007 Сообщения: 333
11827 
|
Добавлено: Пн, 08 Дек, 2008 20:10 Заголовок сообщения: HTTP POST средствами php |
|
|
Требуется отправить бинарный файл (картинку) http post запросом на языке php.
В принципе сам запрос проблем не вызывает и с текстовыми данными работает правильно, но когда вместо текста пытаюсь отправить изображение, то возвращается ошибка "содержимое не является изображением".
Исходный код следующий:
| Код: | $post = file_get_contents($filename);
$fp = fsockopen("$host",80);
$headers = "POST /post.php HTTP/1.1\r\n"
."Host: $host\r\n"
."Content-type: image/jpeg\r\n"
."Content-length: ".strlen($post)."\r\n\r\n";
fwrite($fp,$headers.$post);
$resp='';
while(!feof($fp)){$resp.=fread($fp,1024);}
fclose($fp); |
Проблема состоит в том, что при загрузке файла file_get_contents (как и другими командами) содержимое интерпретируется как строка, как сделать так чтобы оно интерпретировалось как binary.
Благдарность выразится в размере 1000 монет . |
|
| Вернуться к началу |
|
 |
madhamster Согнул ложку


Зарегистрирован: 09.10.2006 Сообщения: 902
432 
|
Добавлено: Пн, 08 Дек, 2008 20:30 Заголовок сообщения: |
|
|
Проблема современной молодёжи. Никогда не дочитываю до конца.
Флаг аля аргумент FILE_BINARY для кого придумали? _________________ NextStage - live music competition |
|
| Вернуться к началу |
|
 |
Веденин Красные глаза


Зарегистрирован: 17.05.2007 Сообщения: 2066 Откуда: Самара 11733 
|
Добавлено: Пн, 08 Дек, 2008 20:30 Заголовок сообщения: |
|
|
Есть два формата отправки POST запроса
1) application/x-www-form-urlencoded - отправка строки
2) multipart/form-data - отправка файлов
Вы используете формат первого запроса (хотя по моему тип указываете второго), вам нужно использовать формат вида:
| Код: | $post = "POST http://www.site.ru/postnews.html HTTP/1.0\r\n
Host: www.site.ru\r\n
Referer: http://www.site.ru/news.html\r\n
Cookie: income=1\r\n
Content-Type: multipart/form-data; boundary=1BEF0A57BE110FD467A\r\n
Content-Length: "strlen($post).'\r\n
\r\n
--1BEF0A57BE110FD467A\r\n
Content-Disposition: form-data; name="img_file"; filename="img.jpg"\r\n
Content-Type: application/octet-stream\r\n
Content-Transfer-Encoding: binary\r\n
\r\n'.$post.'\r\n--1BEF0A57BE110FD467A--\r\n';
|
Подробнее http://www.codenet.ru/webmast/php/HTTP-POST.php _________________ Написание конвекторов, парсеров, интеграции нескольких сайтов (в личку)
Тематические поисковые системы Рунета: Танцевальная, программиста, поиск книг |
|
| Вернуться к началу |
|
 |
girafenok Два пингвиненка


Зарегистрирован: 17.11.2007 Сообщения: 333
11827 
|
Добавлено: Пн, 08 Дек, 2008 20:34 Заголовок сообщения: |
|
|
| madhamster писал(а): | | Проблема современной молодёжи. |
Весьма польщен.
| madhamster писал(а): |
Флаг аля аргумент FILE_BINARY для кого придумали? |
Можно ли конкретный пример или сслыку на описание аргумента FILE_BINARY? |
|
| Вернуться к началу |
|
 |
girafenok Два пингвиненка


Зарегистрирован: 17.11.2007 Сообщения: 333
11827 
|
Добавлено: Пн, 08 Дек, 2008 21:03 Заголовок сообщения: |
|
|
| Веденин писал(а): | Есть два формата отправки POST запроса
1) application/x-www-form-urlencoded - отправка строки
2) multipart/form-data - отправка файлов
|
Данные два алгоритма используются для кодирования запросов на основе html-форм. Так как html-формы у меня нет, то Content-Type могу указать любой, тот, который мне нужно. В данном случае указываю image/jpeg.
Вопрос остался открытым. |
|
| Вернуться к началу |
|
 |
madhamster Согнул ложку


Зарегистрирован: 09.10.2006 Сообщения: 902
432 
|
Добавлено: Пн, 08 Дек, 2008 21:22 Заголовок сообщения: |
|
|
Ну вот ты писал:
| Цитата: | | Проблема состоит в том, что при загрузке файла file_get_contents (как и другими командами) содержимое интерпретируется как строка, как сделать так чтобы оно интерпретировалось как binary. |
Да пардон я сам молодой и не читаю до конца...
FILE_BINARY появился начиная с 6 версии пхп))
Так что тебе тогда подойдёт чтение с помощью fopen где в качестве 2 аргумента передашь rb
| Код: |
$fd = fopen($filename, 'rb');
$post = fread($fd, filesize($filename));
fclose($fd);
$fp = fsockopen("$host",80);
$headers = "POST /post.php HTTP/1.1\r\n"
."Host: $host\r\n"
."Content-type: image/jpeg\r\n"
."Content-length: ".strlen($post)."\r\n\r\n";
fwrite($fp,$headers.$post);
$resp='';
while(!feof($fp)){$resp.=fread($fp,1024);}
fclose($fp);
|
_________________ NextStage - live music competition |
|
| Вернуться к началу |
|
 |
girafenok Два пингвиненка


Зарегистрирован: 17.11.2007 Сообщения: 333
11827 
|
Добавлено: Пн, 08 Дек, 2008 21:38 Заголовок сообщения: |
|
|
Сейчас попробовал еще раз fopen/fread - не работает.
fread тоже возвращает содержимое файла в виде бинарной строки (все-таки строка).
Вопрос как преобразовать сию строку к виду, годному для передачи по http.
Сутки пытаюсь понять, много чего перечитал, мозги кипят, а воз и ныне там. |
|
| Вернуться к началу |
|
 |
[LP]LordPro.teus Призрак Лорда


Зарегистрирован: 26.07.2007 Сообщения: 5092
42282 
|
Добавлено: Пн, 08 Дек, 2008 21:58 Заголовок сообщения: |
|
|
girafenok
что-то вроде urlencode()? _________________

До выхода LiteDiary 0.3.0: парам-пам-пам-пам! Она уже здесь! |
|
| Вернуться к началу |
|
 |
girafenok Два пингвиненка


Зарегистрирован: 17.11.2007 Сообщения: 333
11827 
|
Добавлено: Пн, 08 Дек, 2008 22:22 Заголовок сообщения: |
|
|
[LP]LordPro.teus
Не, не работает, rawurlencode() тоже не помогает. |
|
| Вернуться к началу |
|
 |
[LP]LordPro.teus Призрак Лорда


Зарегистрирован: 26.07.2007 Сообщения: 5092
42282 
|
Добавлено: Пн, 08 Дек, 2008 22:29 Заголовок сообщения: |
|
|
girafenok
а ручная замена превратно трактуемых символов?.. _________________

До выхода LiteDiary 0.3.0: парам-пам-пам-пам! Она уже здесь! |
|
| Вернуться к началу |
|
 |
girafenok Два пингвиненка


Зарегистрирован: 17.11.2007 Сообщения: 333
11827 
|
Добавлено: Вт, 09 Дек, 2008 00:13 Заголовок сообщения: |
|
|
[LP]LordPro.teus
думаю, что лучше, чем интерпретатор php я с этим делом не справлюсь
К тому же функция fwrite все равно проинтерпретирует выводимую информацию как строку.
В общем нашел еще одну функцию stream_copy_to_stream, однако и с ней не работает. |
|
| Вернуться к началу |
|
 |
lazutov while (1==1);


Зарегистрирован: 30.04.2007 Сообщения: 3840
111220 
|
|
| Вернуться к началу |
|
 |
girafenok Два пингвиненка


Зарегистрирован: 17.11.2007 Сообщения: 333
11827 
|
Добавлено: Вт, 09 Дек, 2008 21:01 Заголовок сообщения: |
|
|
lazutov
К сожалению я не контролирую принимающую сторону. Это сервис с REST API.
В общем, похоже, что проблема либо в моих заголовках, либо на стороне сервиса.
file_get_contents работает корректно на бинарных данных.
Всем откликнувшимся - по 100 монеток за участие  |
|
| Вернуться к началу |
|
 |
|