Передача бинарных данных на сервер POST-запросом

septera

Новичок
По сабжу, делаем для себя http-клиент на C#, как лучше передать на хостинг данные которые изначально находятся у клиента в бинарном виде, но не как файл, а как результат работы некой функции, грубо говоря находятся в ОП?
 

Фанат

oncle terrible
Команда форума
Непонятно, почему вопрос задан на форуме по РНР.
Типа, одни пхписты знают протокол НТТР?
Это лестное, конечно, предположение, но всё же, протокол не такой сложный, как кажется
И даже на шарпее можно найти знающего человека.

Но раз уж пришел, то формат примерно такой

PHP:
HTTP заголовок
HTTP заголовок
[пустая строка]
data=encoded_data
encoded_data получается с помощью urlencode - формат несложный, можно и руками написать, если готовой функции нету.
нужные заголовки можно посмотреть в спецификации или подсмотреть готовые, отправив какую-нибудь форму на сервер
 

A1x

Новичок
можно передавать тупо в теле post запроса
потом забираем - file_put_contents($destfile, file_get_contents('php://input'));

когда-то делал что-то замороченное типа перетаскиваешь мышью файл в браузер,
яваскрипт его подхватывает и передает на сервер, там пришлось использовать метод XMLHttpRequest.sendAsBinary
так вот он именно так посылает файл на сервер
 

septera

Новичок
base64, или для идиотов: join("|", unpack("C*"))
По поводу base64, вот народ ниже пишет что можно передавать напрямую, минуя перекодировку, так стоит ли тогда заморачиваться с base64? Где-то читал что так мол более стабильно передается содержимое, правда ли?
PHP:
HTTP заголовок
HTTP заголовок
[пустая строка]
data=encoded_data
encoded_data получается с помощью urlencode - формат несложный, можно и руками написать, если готовой функции нету.
нужные заголовки можно посмотреть в спецификации или подсмотреть готовые, отправив какую-нибудь форму на сервер
Наверное я не правильно выразился, мне надо двоичные данные отправить post-запросом на сервер и там корректно обработать, лучше наиболее оптимально это сделать (zip, gzip...), а urlencode - оно ведь получается из буквенно-цифрого значения вроде как :)
file_put_contents($destfile, file_get_contents('php://input'));
пишут что 'php://input' работает не всегда, все зависит от того как настроен php в виде cgi или модуля, а за XMLHttpRequest.sendAsBinary спасибо, вот все думаю попробывать потестить, да все не определюсь нормально ли это посылать данные в двоичном виде?
 

Фанат

oncle terrible
Команда форума
Ты бы, милок, сначала хотя бы стандартным способом сделал.
А потом уже капризничал.
 

septera

Новичок
Ты бы, милок, сначала хотя бы стандартным способом сделал.
А потом уже капризничал.
Многоуважаемый, а я уже по всякому сделал, если Вы думаете что для меня является загадкой как в ФФ посмотреть отправляемые заголовки и далее скопировать их в свою отправку, то зря, не так все запущенно)) Вопрос оптимальности такой отправки волнует больше, как двоичные данные передать на сервер в наиболее компактном виде и там их обработать без создания каких либо файлов чтобы не грузить файловую систему хостинга?
 

Фанат

oncle terrible
Команда форума
если Вы думаете, то зря
Я не думаю. И не читаю мысли на расстоянии.
Я могу прочесть только то, что написано словами.
я уже по всякому сделал
Это прекрасно.
Задавая вопрос, желательно всё это "по-всякому" подробно описывать.
Чтобы зря не тратить чужое время.
Итак - что конкретно было сделано? С какими результатами? Какая конкретно "неоптимальность" не даёт воспользоваться имеющимся решением?
Вопрос оптимальности такой отправки волнует больше
Насколько я могу судить, вопрос оптимальности здесь не единственный.
Куда большую заботу я вижу по вопросу совместимости и переносимости.
Какие конкретно накладываются ограничения на переносимость, и по какой причине?
без создания каких либо файлов чтобы не грузить файловую систему хостинга?
какие конкретно проблемы с файловой системой хостинга?
 

septera

Новичок
Итак - что конкретно было сделано? С какими результатами? Какая конкретно "неоптимальность" не даёт воспользоваться имеющимся решением? Какие конкретно накладываются ограничения на переносимость, и по какой причине? какие конкретно проблемы с файловой системой хостинга?
Сделали передачу файла стандартным методом, пример:
Content-Type: multipart/form-data; boundary=---------------------------23281168279961
Content-Length: 1413
-----------------------------23281168279961
Content-Disposition: form-data; name="files"; filename="xml.zip"
Content-Type: application/octet-stream

... zip-архив
-----------------------------23281168279961--
В итоге мы получаем стандартную обработку файла на сервере. О результатах сложно судить, но то что создаются файлы и затрагивается файловая система дает право судить что метод крайне не приемлемый для нас, т.к. нам требуется передавать по одному пакету(файлу) бинарных данных в секунду на хостинг, средний размер не зазипованного пакета 200 КБ, при этом хостинг не затачивается специально под задачу и представляет собой среднестатестический пакет услуг хостера, скажем за 3000-4000 рублей в год.
Далее мы пробывали переводить бинарные данные в base64 и передавать их также через POST, получается объем больше, но не трогается фалойвая система. Также сложно судить о производительности, поскольку объем то по факту увеличился и передача содержимого на сервер идет дольше.
На этом мы остановились, по сколько появилась неопределенность каким путем дальше идти. Кто-то пишет в инете что можно даже как-то включить gzip-расжатие на сервере при передаче уже в сжатом виде данных, вообщем неопределеность есть.
Насчет переносимости и совместимости могу сказать что скрипт принимающий данные на сервере желательно чтобы работал везде, а там как получится)
 

Фанат

oncle terrible
Команда форума
Спасибо.
вот это уже похоже на конкретный вопрос.

И, тем не менее,
"среднестатистический пакет услуг хостинга" и "терабайт входящего трафика (при условии единственного клиента )" - это несколько взаимоисключающие параграфы.
 

septera

Новичок
Спасибо.
вот это уже похоже на конкретный вопрос.
И, тем не менее,
"среднестатистический пакет услуг хостинга" и "терабайт входящего трафика (при условии единственного клиента )" - это несколько взаимоисключающие параграфы.
Да не за что, я рад что мне вообще пытаются помочь. Насчет объема трафика, он будет таким не каждую секунду в течении всего дня, а всего лишь минут 5 в течении часа, но возможно и больше. Как сказал мой знакомый, не на год ведь делаем, поэтому хотелось бы подойти к этому вопросу с научной точки зрения. На хабре постить возможности нету, поэтому ищу помощи у Вас.
 

cDLEON

Онанист РНРСlub
пишут что 'php://input' работает не всегда, все зависит от того как настроен php в виде cgi или модуля, а за XMLHttpRequest.sendAsBinary спасибо, вот все думаю попробывать потестить, да все не определюсь нормально ли это посылать данные в двоичном виде?
Можно ссылку ? 2012 год на дворе, вы действительно видели хостинги с PHP as CGI ?
 

fixxxer

К.О.
Партнер клуба
На среднестатистический хостинг отправить такие объемы не получится, max post size никто ради вас менять не будет.

Решение - отправлять по частям.
 

septera

Новичок
Можно ссылку ? 2012 год на дворе, вы действительно видели хостинги с PHP as CGI ?
Да, конечно можно: timeweb.ru
На среднестатистический хостинг отправить такие объемы не получится, max post size никто ради вас менять не будет.
Решение - отправлять по частям.
С того же timeweb скопировал строку из phpinfo (самый дешевый тариф): post_max_size 1000M
Пусть даже 8M будет, нам больше и не нужно, по условию до 1МБ файлы отправляются, далее идет их дробление.
 

fixxxer

К.О.
Партнер клуба
А, точно. У меня глаз за "терабайты трафика" зацепился. 200к это вообще не проблема обработать любым способом. Нечего тут даже париться про base64 или ФС. Ерунда.
 

Dovg

Продвинутый новичок
Мы не из таких, хотим оптимальный путь придумать
Космолет строите?

Сделайте прототип по любому пути. Если после реализации будут явно видны некоторые проблемы, то можно будет переделать.
 

Фанат

oncle terrible
Команда форума
fixxxer
ну, это я насчитал терабайт. как раз за месяц при 200к в секунду набегает :)
 
Сверху