IMHO.WS

IMHO.WS (https://www.imho.ws/index.php)
-   Веб-программирование (https://www.imho.ws/forumdisplay.php?f=29)
-   -   Проблемы с загрузкой файлов (https://www.imho.ws/showthread.php?t=122273)

GoodS 07.08.2007 12:36

Проблемы с загрузкой файлов
 
Нужно сделать так чтобы пользователь не мог закачать файл больше чем установлено различными настройками сервера, в частности php: upload_max_filesize, post_max_size.

Форма закачки имеет стандартный вид:

Код:

<form enctype="multipart/form-data" action="_URL_" method="post">
<input type="hidden" name="MAX_FILE_SIZE" value="1000">
Send this file: <input name="userfile" type="file">
<input type="submit" value="Send File">
</form>

значение MAX_FILE_SIZE я устанавливаю равным минимальному из upload_max_filesize, post_max_size.

Так вот, проблема в следующем:
Если размер файла больше чем значение поля MAX_FILE_SIZE в хтмл форме, то сначала файл грузится на сервер, при этом появляется предупреждение:
Код:

Warning: POST Content-Length of 8387342 bytes exceeds the limit of 5242880 bytes in Unknown on line 0
То есть первым проверяется размер пост запроса, а потом уже сравнивается значение поля MAX_FILE_SIZE и размера файла.

Я конечно понимаю что с точки зрения хттп протокола это правильно, но что? браузеры не смотрят чтоли значение этого поля?

Можно ли как нибудь сделать так чтобы на стороне клиента проверялся размер файла?

Saruman 07.08.2007 13:08

Цитата:

Сообщение от GoodS (Сообщение 1444406)
Можно ли как нибудь сделать так чтобы на стороне клиента проверялся размер файла?

Нельзя. MAX_FILE_SIZE - придумка пхп-девелоперов, и, насколько мне известно, ни один из браузеров её не поддерживает. Кроме того, полагаться на данный лимит всё равно нельзя - я всегда могу модифицировать полученный от сервера HTML и убрать данный параметр, либо же вообще сам создать POST-запрос и отправить на сервер то, что мне нужно. Если нужен точный контроль - он должен производиться на сервере.

GoodS 07.08.2007 15:42

Saruman, ты меня не понял. Мне нужно сделать так чтобы при закачке файла 100 мегабайт сообщение о том что лимит - 99, выскакивало до того как пользователь потратит кучу времени на его закачку!!! На серевере у меня все под контролем!!!!!!!

Saruman 07.08.2007 17:03

ок, сформулирую по другому - нет кросс-браузерного способа на стороне клиента контролировать размер закачиваемого файла. Javascript не предоставляет подобных возможностей, это возможно посредством ActiveX - но, ессно, результат будет IE-only (пример кода), либо же делать на флеше файл-аплоадер.

Если же тебе нужно кросс-браузерное решение - то его можно реализовать только на стороне сервера. В частности, при обнаружении параметра MAX_FILE_SIZE пхп проверяет переданный объём POST-запроса (из хедера content-length) на предмет превышения этого параметра, и если запрос (=закачиваемый файл) больше - то СРАЗУ выдаёт ошибку, не дожидаясь закачки всего файла, что тебе и нужно, как я понял. Ессно, для этого поле с MAX_FILE_SIZE должно идти до тела закачиваемого файла.

GoodS 07.08.2007 21:48

Мне нужно чтобы закачка вообще не начиналась когда файл слишком большой...
И ошибку превишение Content-Length'ом лимита пхп почему то выдвет после того как закачает файл на сервер!
Те насколько я понял нереально сделать так как я хочу?

Saruman 08.08.2007 00:38

Цитата:

Сообщение от GoodS (Сообщение 1444592)
Мне нужно чтобы закачка вообще не начиналась когда файл слишком большой...

ActiveX, Flash. Чистым HTML/Javascript - невозможно.

Hubbitus 09.09.2007 19:40

Кстати, я тоже какое-то время назад столкнулся с этим, и для меня было удивительно и не понятно такое положение дел.


Saruman, понятно что на сервере все проверяется уже реально, и не для проверок это хотелось бы сделать, чтобы защититься от тех пользователей, которые будут сами формировать POST-запросы, а именно и только для удобства самого пользователя - тоесть чтобы не заставлять его ждать (тратить трафик, деньги) загрузки файла, который я (мой сервер) в итоге не примет!

Я понимаю что несекьюрно давать доступ к каким-либо операциям с файловой системой на JavaScript, или на запись в value <input type=file>, как это есть, все понимаю. Но почему нельзя тот же размер, вместе с именем файла, сделать для JavaScript доступным, для выбранного файла пользователя, вместе с его именем (не в Опере только. В ней мне так и не удалось получить имя, в остальных без проблем)?

Кстати, на счёт варианта, для IE и FireFox можно сделать на JavaScript разные реализации проверки, но при этом для FF надо будет скрипт подписывать, а для IE это будет использовать встроенный для таких целей ActiveX элемент для доступа к файловой системе пользователя. И в том и в другом случае, пользователю будет выдано предупреждение и запрос на разрешение небезопасной операции.


Часовой пояс GMT +4, время: 03:11.

Powered by vBulletin® Version 3.8.5
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.