Отловить ContentLenth
Задача в следующем:
Есть форма отправки файла. Необходимо узнать размер файла при начале загрузки (ДО загрузки не получается, вернее получается посредством JavaScript
var node = document.getElementById('file');
node.files[0].fileSize
Но валидный он не во всех браузерах..)
Поэтому идея такова: отловить ContentLenth в отправленном заголовке клиентом. Но как??
Как, если при сабмите файл грузится, и php не выполнится пока он не загрузится полностью?
Слышал что это можно сделать через Perl (CGI), но я его совершенно не знаю. Если да, можно ли пример? Буду ооочень благодарен, так как голову ломаю уже долго.
P.S. Варианты SWFUpload не предлагать :)
Я бы покапал в сторону FileReader и HTML5.
Как пример: http://www.codenet.ru/webmast/js/html5-ajax-partial-upload/
Но полностью кроссбраузерного решения тут нет.
Можно еще посмотреть Google Gears. В относительно старых браузерах может помочь.
Потому что для всех браузеров не напишешь решения, тем более это геморно.. Как читают content length на сервере? Ведь при загрузке например на youtube есть прогресс-бар, как узнать сколько уже загружено я представляю, но для этого прогресс-бара надо ведь знать сколько 100%, т.е. размер файла. Как?
А ничего, что nginx отдаст файл на бэкэнд уже после полной загрузки файла (т.е. когда прогресс-бар не актуален)?
Потому что для всех браузеров не напишешь решения, тем более это геморно.. Как читают content length на сервере? Ведь при загрузке например на youtube есть прогресс-бар, как узнать сколько уже загружено я представляю, но для этого прогресс-бара надо ведь знать сколько 100%, т.е. размер файла. Как?
Кроссбраузерно только флеш. Соответственно на клиенте требуется лишь его поддержка.
Потому что для всех браузеров не напишешь решения, тем более это геморно.. Как читают content length на сервере? Ведь при загрузке например на youtube есть прогресс-бар, как узнать сколько уже загружено я представляю, но для этого прогресс-бара надо ведь знать сколько 100%, т.е. размер файла. Как?
Вообще замечу следующее. Нормальный браузер при upload шлет заголовок Content-Length, соотвественно веб сервер еще до того, как получит все тело запроса может узнать размер файла. Но браузер может его и не посылать, что HTTP спецехой разрешается делать (как разруливать ситуацию описано в п. 4.4 спецухи), но в этом случае ни о каком прогресс-баре речи идти не может.
Если исходить из того, что клиент данные о длине отправляет, то вопрос больше в серверных мехазмах. Поэтому рекомендую посмотреть в сторону HttpUploadProgressModule. Он хоть и не в ходит в официальную поставку, однако же работает.
ОК, есть ещё NginxHttpUploadProgressModule, который самим сервером без передачи к бэкенду отдаёт ответ (в виде XMLа)..
есть ещё silverlight и статья на тему
Ну ссылку на этот модуль я привел постом выше ;) причем на официальную страницу.
В общем в целом я к тому, что без клиентской стороны тут не обойтись, минимум JS.