Как получить размер файла в Perl перед обработкой запроса на загрузку? - PullRequest
3 голосов
/ 26 апреля 2010

Я хочу получить размер файла. Я делаю это:

my $filename=$query->param("upload_file");
my $filesize = (-s $filename);
print "Size: $filesize ";`

Все же это не работает. Обратите внимание, что я не загружал файл. Я хочу проверить его размер перед загрузкой. Таким образом, ограничить его до 1 МБ.

Ответы [ 8 ]

5 голосов
/ 26 апреля 2010

Вы не можете узнать размер чего-либо перед загрузкой. Но вы можете проверить заголовок запроса Content-Length, отправленный браузером, если он есть. Затем вы можете решить, хотите ли вы в это верить. Обратите внимание, что Content-Length будет длиной всего потока запросов, включая другие поля формы, а не только самой загрузки файла. Но этого достаточно для того, чтобы получить примерную цифру для соответствующих клиентов.

Поскольку вы, похоже, работаете под обычным CGI, вы должны получить длину тела запроса в $ENV{CONTENT_LENGTH}.

3 голосов
/ 26 апреля 2010

Также хочу проверить работоспособность, возможно, уже имея максимальный пост (от perldoc CGI ):

$CGI::POST_MAX

Если задано неотрицательное целое число, эта переменная ограничивает размер POSTings, в байтах. Если CGI.pm обнаруживает POST, превышающий потолок, он немедленно выйдет с сообщением об ошибке. Это значение повлияет как на обычные POST и составные POST, что означает, что он ограничивает максимальный размер загрузка файлов также. Вы должны установить это на достаточно высокое значение, такое как 1 мегабайт.

2 голосов
/ 14 февраля 2013

Загруженный файл сохраняется в папке tmp на сервере при отправке формы, проверьте размер файла там.

Укажите значение для поля $.

my $upload_filehandle = $query->upload($field);
my $tmpfilename = $query->tmpFileName($upload_filehandle);
my $file_size = (-s $tmpfilename);
1 голос
/ 30 апреля 2010

Спасибо всем за ваши ответы; Я только что узнал, почему $filesize = (-s $filename); раньше не работал, это связано с тем, что я проверял размер файла при отправке запроса Ajax, а не при повторной отправке страницы. Я исправил это, чтобы отправить страницу, и это сработало. Благодаря.

1 голос
/ 26 апреля 2010

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

Хорошим примером для начала является YUI Uploader . Много здесь: Какой лучший загрузчик файлов JavaScript / Flash?

Очевидно, что вы захотите проверить и на стороне сервера, но к тому времени, когда пользователь начнет отправлять запрос на сервер, вы уже израсходуете свои циклы ЦП и пропускную способность.

1 голос
/ 26 апреля 2010

Это не имеет ничего общего с Perl.

Вы пытаетесь прочитать размер файла файла на компьютере пользователя с помощью команд, которые читают файлы на вашем сервере, чего вы не можете сделать с помощью Perl.

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

Лучше всего позволить пользователю начать загрузку и прервать его, если файл слишком большой.

0 голосов
/ 28 ноября 2011

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

0 голосов
/ 26 апреля 2010

Посмотрите документацию по perl для статистики файлов -X - perldoc.perl.org и stat-perldoc.perl.org . Кроме того, вы можете посмотреть на этот скрипт загрузки , который делает то же самое, что вы пытаетесь сделать.

...