Загрузка больших файлов на сервер через HTTP, клиентская часть

DeadMorozBLR

Новичок
Загрузка больших файлов на сервер через HTTP, клиентская часть

Есть задача с помощью скрипта загружать большие файлы (до 500МБ) через веб-форму. Zend_Http_Client, к примеру, умеет загружать файлы, но при этом хранит содержимое файлов в памяти (использует file_get_contents()), соответственно, не подходит.

Существуют ли для этого готовые решения?

P.S. серверную часть поменять нельзя (в частности, загружать файлы по FTP), т.к. это сторонний файловый хостинг.
 
fsockopen вроде позволяет по частям считывать ответ.
 
DeadMorozBLR
существуют решения на AIR, JAVA и просто десктопные приложения
 
@grigori: спасибо, но речь идет конкретно о готовой реализации HTTP-клиента на PHP, способного загружать большие файлы по методу POST в потоковом режиме.

Zend_Http_Client — это самое близкое к тому, что я имею ввиду, за исключением того, что он загружает содержимое файла в оперативную память.
 
Спасибо, поставил. Первый ответ по существу!

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

Попробую Zend_Http_Client с адаптером curl или просто curl, чтобы замного не переписывать, а дальше Ваше решение попробую.
 
PHP вроде как ориентирован на отдачу данных. Приёмом 500 меговых (охренеть) занимается протокол FTP!
 
еще один :)
про прием файлов тут речи не идет :)

да и фтп ваш устарел уже много лет назад
 
Автор оригинала: DeadMorozBLR
Попробую Zend_Http_Client с адаптером curl...
Не поможет, Zend'овские гении всё равно грузят все файлы целиком в память.

Так что рекомендуется либо голый Curl, либо HTTP_Request2 с адаптером Socket. HTTP_Request2 с адаптером Curl может иметь проблемы из-за бага в PHP'шном Curl'e.
 
HTTP_Request2 с адаптером Socket прокатил. Однако есть проблема с таймаутом ответа сервера: после загрузки большого файла сервер, видимо, пытается куда-то его скопировать и задерживает ответ на некоторое время. При этом получаем исключение
Код:
HTTP_Request2_Exception: Request timed out after 0 second(s)
, что само по себе странно. Увеличение таймаута в конфигурации запроса, кажется, решает проблему.
 
Автор оригинала: DeadMorozBLR
HTTP_Request2 с адаптером Socket прокатил. Однако есть проблема с таймаутом ответа сервера: после загрузки большого файла сервер, видимо, пытается куда-то его скопировать и задерживает ответ на некоторое время. При этом получаем исключение
Код:
HTTP_Request2_Exception: Request timed out after 0 second(s)
, что само по себе странно. Увеличение таймаута в конфигурации запроса, кажется, решает проблему.
По ходу PHP сам какой-то таймаут ставит, а в адаптере таймаут проверяется при помощи stream_get_meta_data() даже если сами мы его не указывали... Да, надо бы по крайней мере сообщение об ошибке поправить.
 
За одно стоило бы переименовать поле $timeout адаптера во что-нибудь типа $timeout_timestamp, то есть временная метка, по достижении которой запрос считается просроченным. Иначе получается путаница с одноименным параметром конфигурации.
 
Автор оригинала: Sad Spirit
По ходу PHP сам какой-то таймаут ставит, а в адаптере таймаут проверяется при помощи stream_get_meta_data() даже если сами мы его не указывали... Да, надо бы по крайней мере сообщение об ошибке поправить.
Для будущих поколений, пользующихся поиском: в PHP есть (стопицотый) конфигурационный параметр default_socket_timeout, по умолчанию равный 60 секундам.
 
Сверху