if (not sysopen FILE, "$dir/$1", O_EXCL | O_CREAT | O_WRONLY, 0444) { print "Location: oshibka.shtml\\n\\n"; } else{ binmode FILE; # включить binmode для Windows print FILE while (<$banner>); # и скопировать данные в файл close FILE;
1. Я так понимаю в 3 Кб входит и логин с паролем. Как сделать чтобы они не учитывались. 2. Если файл больше 3 Кб скрипт вообще ошибку сразу дает и никакого oshibka.shtml.
Чего делать?
Название: Чертова закачка
Отправлено: AnnA от 29 Сентября 2005, 18:58:38
1. не передавать их методом POST ;) 2. напишите например так:
Название: Чертова закачка
Отправлено: Biggelow от 30 Сентября 2005, 10:22:17
Что значит не методом POST?
Теперь стал закачивать все подряд по размеру gif и jpeg :(
Название: Чертова закачка
Отправлено: AnnA от 30 Сентября 2005, 11:26:56
значит, что, когда отправляется форма методом пост - она отправляется ВСЯ, т.е. и логин/пароль в том числе. все пришедшее и подпадает под конструкцию $CGI::POST_MAX = 1024*3; т.о. если Вы отправите свои логин/пароль скажем в урле (;) что, как Вы сами понимаете, крайне нежелательно), то эти значения не будут учитываться при вычислении длины запроса $CGI::POST_MAX. Можно сохранять логин пароль например во временный файл, а имя файла "отлавливать" скриптом через url_param, тогда логин/пароль
Цитировать
Biggelow: Я так понимаю в 3 Кб входит и логин с паролем. Как сделать чтобы они не учитывались.
не будут учитываться.
Цитировать
Biggelow: Теперь стал закачивать все подряд по размеру gif и jpeg
исессна. считается хорошим тоном после редиректа выходить из скрипта. т.е. конструкция вида
Цитировать
print "Location: oshibka.shtml\\n\\n";
должна заканчиваться командой exit; у вас же получается, что вы отправили броузер на какую-то страницу, а скрипт продолжает себе работать. :) === ;) надеюсь - понятно объяснила.
Название: Чертова закачка
Отправлено: Biggelow от 30 Сентября 2005, 12:58:28
Переделал так:
#!/usr/bin/perl
$SIG{ALRM} = sub { die "$0 timed out" }; # эти 2 строки не работают под alarm 900; # Windows, но они необязательны
use Fcntl; use CGI qw(param); use CGI qw (:standard); # читайте "perldoc CGI" use CGI::Carp qw (fatalsToBrowser); # вывод ошибок к browser-у
my $login = param (\'login\'); my $pass = param (\'pass\');
my $banner = param (\'banner\'); my $dir = \'u:/home/www/banners\';
if (not sysopen FILE, "$dir/$1", O_EXCL | O_CREAT | O_WRONLY, 0444 or $CGI::POST_MAX > $ddt) { print "Location: admin.cgi?action=addbanner&&login=$login&&pass=$pass&&estfileilirazmer\\n\\n"; exit; } else{ binmode FILE; # включить binmode для Windows print FILE while (<$banner>); # и скопировать данные в файл close FILE;
Я Вас наверное уже достал, но все равно скрипт закачивает все подряд картинки.
Название: Чертова закачка
Отправлено: AnnA от 30 Сентября 2005, 13:54:21
ну блин. ;) в вашем примере откуда, на ваш взгляд, берется $CGI::POST_MAX, которая сравнивается с $ddt? Должно-то оно браться из формы, отправленной методом пост. а этот пример кода не работает с формой. :) тогда уже натравите stat на свой $filename="3232ff.jpg"; и сравнивайте полученое значение в байтах с $ddt. но это ведь не то, чего вам хочется. верно? каким-то образом нам нужно узнать размер файла до того, как мы его закачали.
if (not sysopen FILE, "$dir/$1", O_EXCL | O_CREAT | O_WRONLY, 0444 or $CGI::POST_MAX > $ddt) заменить на ее первоначальное состояние: if (not sysopen FILE, "$DIR/$1", O_EXCL | O_CREAT | O_WRONLY, 0444) это ошибочная конструкция была. ;) -- проблему того, что $CGI::POST_MAX "it will immediately exit with an error message" в той же документации предложено решать так: $uploaded_file = param(\'upload\'); if (!$uploaded_file && cgi_error()) { print header(-status=>cgi_error()); exit 0; } возможно еще кто-то поделится своими мыслями. :)
Название: Чертова закачка
Отправлено: Psixolog от 27 Октября 2005, 06:13:44
#!/usr/bin/perl $|=1; use strict; use CGI qw (param); use Fcntl;
my $filename; my $FL; my $PATH;
$FL = param("uploadfile");
# полный физ. путь к папке для загрузки файлов # cо слешем / в конце. # папка должна иметь права доступа "на запись" для всех пользователей.
$PATH = "upload/";
print "Content-type: text/html\\n\\n"; print (\'
\');
if ($FL) { $FL =~ /[\\\\\\/:]([^\\\\\\/:]+)$/; $filename = $1; open(DATA, ">".$PATH.$filename); binmode (DATA); print DATA while (<$FL>); close (DATA); print (\'\'); print (\'