2010-04-26 3 views
2

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

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

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

+0

Вы загружаете файл из браузера или из командной строки? – zaf

+0

нет в браузере. – Luci

+0

В ответах, похоже, есть путаница. Вы хотите проверить размер файла до того, как клиент выполнит HTTP-запрос, или вы хотите проверить HTTP-запрос, прежде чем принимать решение о его дальнейшей обработке? Я чувствую, что вам, по крайней мере, придется делать последнее, если клиент не делает этого правильно. –

ответ

5

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

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

+0

Из 'CGI.pm':' if (($ POST_MAX> 0) && ($ content_length> $ POST_MAX)) {$ self-> cgi_error ("413 Request entity too large"); последний МЕТОД; } ' –

+0

$ ENV {CONTENT_LENGTH}, кажется, читает размещенный размер ввода, но он не включает размер файла. Я попробовал, и он вернул значения меньше размера файла. – Luci

-3

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

+0

Он хочет проверить размер файла ** перед ** загрузкой – Nifle

+0

Да, я хочу проверить файл перед загрузкой. Любая помощь? – Luci

+0

почему отрицание? Лучше добавить комментарий, чтобы люди знали причину. – Space

2

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

$CGI::POST_MAX

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

+0

Он хочет проверить размер файла ** перед загрузкой **. – Nifle

+2

@Nifle и я хочу путешествовать во времени. –

+0

@ Синан - разве вы уже не закончили свой модуль Time :: Machine? – DVK

1

Это не имеет никакого отношения к Perl.

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

Это что-то, что нужно сделать в браузере, и ненадолго глядя на these questions, это либо очень сложно, либо невозможно.

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

+0

Вы имеете в виду при чтении файла? – Luci

1

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

Хорошим началом является YUI Uploader. Больше здесь: What is the best multiple file JavaScript/Flash file uploader?

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

0

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

0

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

2

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

Поставьте значение для $ field.

my $upload_filehandle = $query->upload($field); 
my $tmpfilename = $query->tmpFileName($upload_filehandle); 
my $file_size = (-s $tmpfilename);