Блог And-rey.ru Блог And-rey.ru Блог And-rey.ru
Логин:
Регистрация Пароль:

Начало / Ограничение размера загружаемого файла в LWP (Perl)


And-rey:Ограничение размера загружаемого файла в LWP (Perl) (10.03.09 19:10)
  
Появилась задача, ограничит размер загружаемого файла при использовании LWP в Perl.
Погуглив с ходу ничего не нашел и пришлось смотреть в учебнике – и дабы заполнить пробел в гугле написать здесь.
 
Правильно было бы сообщить удаленному серверу размер файла, который мы хотим получить.
 
Perl
  1. #!/usr/bin/perl
  2.  
  3. use LWP::UserAgent;
  4.  
  5. my $max_size   = 1024;         # размер в байтах
  6. my $field_name = 'http://www'; # URL
  7.  
  8. my $ua = LWP::UserAgent->new;
  9. $ua->max_size($max_size);
  10. my $req = HTTP::Request->new('GET' => $field_name);
  11. my $res = $ua->request($req);
  12.  
  13. print $res->content;           # файл

Дальше можно ориентироваться по ответу сервера (206 Partial content), но это работает совсем нечасто. Удаленный сервер может сам не знать полный размер файла, если он, например, формируется скриптом.
 
Тогда можно сделать так. Мы сообщаем серверу, какими кусками хотим получать информацию. Считаем ее количество и в случае превышения разрываем соединение.
 
Perl
  1. #!/usr/bin/perl
  2.  
  3. use LWP::UserAgent;
  4.  
  5. my $max_size   = 1048576;      # размер в байтах
  6. my $field_name = 'http://www'; # URL
  7.  
  8. my $ua = LWP::UserAgent->new;
  9. my $req = HTTP::Request->new('GET' => $field_name);
  10. #$ua->max_size($max_size);
  11. my $res = $ua->request($req, \&callback, 1024);
  12. my $size = 0;
  13. my $res_content;
  14.  
  15. sub callback {
  16.     my($data, $response, $protocol) = @_;
  17.     $size = $size + length($data);
  18.     $res_content .= $data;
  19.     if($size > $max_size) { die; }
  20. }
  21.  
  22. print $res_content;            # файл

Здесь ориентироваться можно по специальному заголовку в ответе сервера X-Died который появится в случае разрыва соединения.
 

P.S. При использовании Perl модуля CGI  размер всей передаваемой информации (включая файл) контролируется специальной переменной.
 
Perl
  1. #!/usr/bin/perl
  2.  
  3. use CGI ':standard';
  4.  
  5. $CGI::POST_MAX = 1048576;        # размер в байтах
  6. $CGI::DISABLE_UPLOADS = 1;       # запрет загрузки файла

 


  • RE: Гость: рома (10.11.11 12:55)
  • Хм... test (17.03.09 00:58)


<Ответить>
Имя:
Тема:*
Сообщение:[b] [i] [u] [s] [sub] [sup] [left] [center] [right] [justify] [img] [url] [youtube]   [help]
*
 

 

Я сделаю свой блог — с блэкджеком и шлюхами!

2006-2012, CC-BY: Andrey A.