Автор Тема: file upload  (Прочитано 14877 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн NeoNox

  • Координатор
  • Глобальный модератор
  • Ветеран
  • *****
  • Сообщений: 3012
  • +0/-0
  • 0
    • Просмотр профиля
file upload
« Ответ #30 : 10 Февраля 2003, 11:14:38 »
Цитировать
Я так думаю организовать редирект до загрузки файла невозможно

Возможно.
Вечером до машины доберусь - отвечу.
The documentations is your friend

Оффлайн Wyclef

  • hello_worlder
  • Старожил
  • ****
  • Сообщений: 307
  • +0/-0
  • 2
    • Просмотр профиля
    • http://thug.narod.ru
file upload
« Ответ #31 : 11 Февраля 2003, 20:38:33 »
Жду с нетерпением :)
It\'s nice to be important, but it\'s more important to be nice!

Оффлайн NeoNox

  • Координатор
  • Глобальный модератор
  • Ветеран
  • *****
  • Сообщений: 3012
  • +0/-0
  • 0
    • Просмотр профиля
file upload
« Ответ #32 : 14 Февраля 2003, 13:37:09 »
Wyclef
Ты просто не до конца понял зачем нам нужно форкнуться.

Вот что нужно было сделать:
my $local_path $Query->param(\'upload\');

my $pid = fork();

print $Query->redirect( -url => $success_url ); #(!)

if ($pid) {

#  sleep(10);  #Это для проверки - засыпаем и в это время мы уже на success.html
                     # но файл еще не загружен

    upload_file($remote_path.\'/\'.extract_name($local_path)); #(!)
    wait;
    exit 0;
} else {
    $| = 1;
    die "Cannot fork $!" unless defined $pid;
    exit;
}
The documentations is your friend

Оффлайн Wyclef

  • hello_worlder
  • Старожил
  • ****
  • Сообщений: 307
  • +0/-0
  • 2
    • Просмотр профиля
    • http://thug.narod.ru
file upload
« Ответ #33 : 14 Февраля 2003, 17:25:42 »
Код работает идентчно...

Что-то не то... Как я понял:

if ($pid) {
   # родитель
   ...
} else {
   # потомок
   ...
}

По логике родитель должен быстро завершиться, а потомок продолжать работать? Такое возможно? Что-то я в механизме запутался... :confused:
« Последнее редактирование: 14 Февраля 2003, 17:36:21 от Wyclef »
It\'s nice to be important, but it\'s more important to be nice!

Оффлайн NeoNox

  • Координатор
  • Глобальный модератор
  • Ветеран
  • *****
  • Сообщений: 3012
  • +0/-0
  • 0
    • Просмотр профиля
file upload
« Ответ #34 : 14 Февраля 2003, 17:41:48 »
Ты sllep(10) расскоменть и все станет понятно.
Более наглядно обьяснить не могу :)
Цитировать
if ($pid) {
# родитель

Нет, эта ветка (вся) принадлежит потомку.
The documentations is your friend

Оффлайн Wyclef

  • hello_worlder
  • Старожил
  • ****
  • Сообщений: 307
  • +0/-0
  • 2
    • Просмотр профиля
    • http://thug.narod.ru
file upload
« Ответ #35 : 14 Февраля 2003, 18:03:27 »
Цитировать
Ты sllep(10) расскоменть и все станет понятно.


Я уже несколько вариантов препробовал, сначала свой код мучал, потом с твоими правками - предварительного редиректа не добился... Может суть в реализации CGI?

Да, и если честно прихожу к выводу, что моя идея с редиректом не совсем правильная и правомерная...

А fork тема интересная - как вы считаете? :)

Возможно fork просто не применим в данном (конкретном) случае...

Короче, обложился книгами, изучаю - может получится выродить что-нибудь более аргументированное...
It\'s nice to be important, but it\'s more important to be nice!

Оффлайн NeoNox

  • Координатор
  • Глобальный модератор
  • Ветеран
  • *****
  • Сообщений: 3012
  • +0/-0
  • 0
    • Просмотр профиля
file upload
« Ответ #36 : 14 Февраля 2003, 18:12:10 »
/шепотом/ Какая операционка?
The documentations is your friend

Оффлайн Wyclef

  • hello_worlder
  • Старожил
  • ****
  • Сообщений: 307
  • +0/-0
  • 2
    • Просмотр профиля
    • http://thug.narod.ru
file upload
« Ответ #37 : 14 Февраля 2003, 18:16:31 »
FreeBSD
It\'s nice to be important, but it\'s more important to be nice!

Оффлайн NeoNox

  • Координатор
  • Глобальный модератор
  • Ветеран
  • *****
  • Сообщений: 3012
  • +0/-0
  • 0
    • Просмотр профиля
file upload
« Ответ #38 : 14 Февраля 2003, 18:52:14 »
Тогда не понимаю.
Во вложениях мой вариант.
У меня он 100% работает,
поправь на свои пути и пробуй.
#!/usr/bin/perl -w


use strict;
use 
CGI qw(:standard);
use 
CGI::Carp qw(carpout fatalsToBrowser);

my $Query = new CGI;
my $remote_path = \'/home/EMU/tmp\'; #заменить на свой путь
my $success_url = \'./index.html\';  #заменить на свой путь

my $local_path = $Query->param(\'upload\');

if ($local_path){

	
	
print $Query->redirect( -url => $success_url );

	
	
my $pid = fork();

	
	
if ($pid) {

	
	
	
sleep(10);
	
	
	

	
	
	
upload_file($remote_path.\'/\'.extract_name($local_path));
	
	
	

	
	
	
wait;

	
	
	
exit 0;

	
	
} else {

	
	
	
$| = 1;

	
	
	
die "Cannot fork $!" unless defined $pid;

	
	
	
exit;

	
	
}



	
}else{

	
	
print &index();

	
}


########################################

sub upload_file {

    my $path = shift or return;

    my $bytes;

    my $buffer;

    open F, ">$path" or die "Cannot open $path for writing\\n";

    flock F, 2;

    binmode F;

    while ($bytes = read($local_path, $buffer, 4096)) {

        print F $buffer;

    }

    die "Error reading uploaded file\\n" unless defined $bytes;

    close F;

}



########################################

sub extract_name {

    my $path = shift or die "Nothing to upload\\n";

    $path = reverse $path;

    $path =~ /([^\\/:]*)/;

    $path = reverse $1;

    return $path;

}

sub index{
print header();

print qq~
 <html>
  <head>
   <title>Upload</title>
  </head>
 <body>
<form action="./test.cgi" method="post" enctype="multipart/form-data">
<input type="file" name="upload">

<input type="submit">
</form>
 </body>
 </html>
~;
}
The documentations is your friend

Оффлайн Wyclef

  • hello_worlder
  • Старожил
  • ****
  • Сообщений: 307
  • +0/-0
  • 2
    • Просмотр профиля
    • http://thug.narod.ru
file upload
« Ответ #39 : 16 Февраля 2003, 00:14:21 »
По идее должно работать, но... нет.

В IE когда нажимаю на кнопку, идет коннект, в статус-баре начинает прибавляться "синий прямоугольник" т.е. пошла закачка (у Opera пишется "Uploading file(s) to server"), на экране остается форма, только потом через n минут редиректит (когда объем отосланных данных чуть >= размеру файла).

Проверял, на паре серверов - одно и то же... Даже один free зарегил (http://wyclef.netfirms.com/cgi-bin/test.pl - здесь твой код).

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

В любом случае, спасибо за помощь!

З.Ы. Лишний повод порыться в доках никогда не помешает :)
It\'s nice to be important, but it\'s more important to be nice!

Оффлайн Mog.

  • Фанат форума
  • Ветеран
  • *****
  • Сообщений: 828
  • +0/-0
  • 0
    • Просмотр профиля
file upload
« Ответ #40 : 17 Февраля 2003, 08:08:57 »
Цитировать
По идее должно работать

Почему?
Насколько я это понимаю, сначала запрос получает сервер. А если запрос большой (т.е. в теле запроса мегабайтный файл), сервер получает его долго (размер/скорость>=время). А после получения запроса, сервер формирует  переменные окружения и запускает скрипт. И только после этого скрипт извлекает из переменных "файл", записывает его по нужному пути, на что уходит гораздо меньше времени, чем на запрос (если конечно речь идет о модемном соединении, хотя бы с одной стороны). Поэтому fork бесполезен. А редирект можно сделать запросто, при этом скрипт то продолжает работу. Т.е. можно менять местами процессы "сохранение файла" и "редирект юзера", но поменять местами "получение запроса сервером" и "работа запрашиваемого скрипта" - это вряд ли.
ИМХО
Все болезни от нервов, только сифилис от удовольствия

 

Sitemap 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28