Модераторы: korob2001, ginnie

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Загрузка файлов с клиентского компа 
:(
    Опции темы
kostofffan
Дата 20.5.2005, 09:30 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











Доброго времени суток всем!
Подскажите, как можно загрузить файлы с клиентского компа на сервер? К примеру, картинку 'C:\some_dir\picture.jpg'
Заранее спасибо!
  Вверх
korob2001
Дата 20.5.2005, 14:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2871
Регистрация: 29.12.2002

Репутация: 13
Всего: 61



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

#!/usr/bin/perl -w
use strict;
use CGI;

my $cgi = new CGI;

# Путь к каталогу, куда грузим файлы
my $dir = "/home/localhost/www/photos";

sub show_form {
    print $cgi->start_html;
    print $cgi->start_multipart_form();
    print $cgi->filefield( -name => 'file' );
    print $cgi->br;
    print $cgi->submit( -name => 'send', -value => 'Отправить' );
    print $cgi->end_form();
    print $cgi->end_html;
}

sub upload_file {
    my $file = shift;
    my $file_new;
    # Пропускаем толко файлы jpp, bmp, gif, png
    if ( $file !~ /\/|\\(\w+\.(?:gif|jpg|png|bmp))$/i ) {
        print $cgi->start_html( -title => 'Fatal error' );
        print $cgi->start_center();
        print $cgi->h1( {-style => 'color: #cc0000' }, 'Fatal Error<br>Загружать можно только графику');
        print $cgi->end_center();
        print $cgi->end_html();
        exit(0);
    } else {
        $file_new = $1;
    }

    local *F;
    my $buff;
    open( F, "> $dir/$file_new" ) or die $!;
      binmode F;
      binmode $file;
      print F $buff while ( read( $file, $buff, 1024 ) );
    close( F );
}

print $cgi->header( -charset => 'Windows-1251' );
if ( $cgi->param('send') ) {
     upload_file( $cgi->param('file') );
     show_form;
} else {
     show_form;
}

Удачи.

Это сообщение отредактировал(а) korob2001 - 20.5.2005, 14:34


--------------------
"Время проходит", - привыкли говорить вы по неверному пониманию. 
"Время стоит - проходите вы".
PM MAIL WWW ICQ MSN   Вверх
kostofffan
Дата 23.5.2005, 13:28 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











korob2001, спасибо тебе! Всё понятно.
Я вообще-то уже натыкался на вот этот read(), используемый для загрузки. Просто не был уверен, что его можно использовать именно в данной проблеме.
В общем, сенкс!
  Вверх
kostofffan
Дата 11.6.2005, 17:33 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











Появилась проблемка с загрузкой!
Вот такая прога:
Код

#!/usr/bin/perl -w

use CGI qw(param());

print "Content-Type: text/html\n\n";
&upload_file(param('f'));
sub upload_file {
    my $file = shift;
    my $file_new;
    # Пропускаем толко файлы jpp, bmp, gif, png
#    if ( $file !~ /\/|\\(\w+\.(?:gif|jpg|png|bmp))$/i ) {
#    die 'saf';
#    } else {
        $file_new = 'pic.jpg';
#    }

    local *F;
    my $buff;
    open( F, "> $file_new" ) or die $!;
      binmode F;
      binmode $file;
      print F $buff while ( read( $file, $buff, 1024 ) );
    close( F );
}



Попробовал её под Apache на своём компе (ОС - винда 98). Рисунок не хочет грузится. Путь задаётся из поля: <input type=file name=f>
Может не так задаётся имя файла. По ходу, $file принимает значение типа "C:\pic.jpg".
Подскажите, в чём бок!!!
  Вверх
korob2001
Дата 11.6.2005, 19:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2871
Регистрация: 29.12.2002

Репутация: 13
Всего: 61



Проблема скорее всего в теге <form>, правда ты его не привё здесь. Вобщем проверь если ты выводил тег <form> HTML тегами, то он должен выглядеть примерно так:
Код

<form enctype='multipart/form-data' ...другие атрибуты>

Если выводишь форму с помощью CGI.pm, то просто вместо метода start_form() используй, start_multipart_form()

Удачи.


--------------------
"Время проходит", - привыкли говорить вы по неверному пониманию. 
"Время стоит - проходите вы".
PM MAIL WWW ICQ MSN   Вверх
kostofffan
Дата 12.6.2005, 11:18 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











Я так понял, что здесь самым главным является именно enctype='multipart/form-data'. Я этот атрибут не выводил...
  Вверх
korob2001
Дата 12.6.2005, 11:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2871
Регистрация: 29.12.2002

Репутация: 13
Всего: 61



Если форма будет загружать файлы с клиентского компа, то его нужно указывать всегда. По умолчанию этот атрибут: application/x-www-form-urlencoded


--------------------
"Время проходит", - привыкли говорить вы по неверному пониманию. 
"Время стоит - проходите вы".
PM MAIL WWW ICQ MSN   Вверх
Nika
Дата 16.5.2006, 18:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 50
Регистрация: 19.9.2005
Где: Красноярск

Репутация: нет
Всего: нет



Здравствуйте. Я прочитала статьи из вашего форума на тему зугрузки файлов на сервер.
Код

 my $file = $atf; #это файл который надо загрузить на сервер
       my $file_new=$path;  #путь с именем файла, который долже создаться на сервере
       local *F;
       my $buff;
       open(F, ">$file_new") or die print_err('can not open');
       binmode F;
       binmode $file;
       print F $buff while ( read($file,$buff,1024));
       close(F);  


Файл создается на сервере, вот только 0 байт. Почему? Где я чего не понимаю и не так делаю?  smile 

 
PM MAIL WWW ICQ MSN   Вверх
korob2001
Дата 17.5.2006, 15:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2871
Регистрация: 29.12.2002

Репутация: 13
Всего: 61



Код
my $file = $atf; #это файл который надо загрузить на сервер

Проблема скорее всего в том, что ты теряешь дескриптор файла. Попробуй сделать это присвоение таким образом:
Код
*file = *atr

Либо передавай ссылку на $atr, если это подпрограмма. 
Так же обрати внимание на отрибут enctype, тега <form>:
Цитата

enctype='multipart/form-data'

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

Это сообщение отредактировал(а) korob2001 - 17.5.2006, 15:10


--------------------
"Время проходит", - привыкли говорить вы по неверному пониманию. 
"Время стоит - проходите вы".
PM MAIL WWW ICQ MSN   Вверх
sharq
Дата 17.5.2006, 15:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Perl Liker
**


Профиль
Группа: Участник
Сообщений: 841
Регистрация: 13.12.2004
Где: Ростов-на-Дону

Репутация: 2
Всего: 28



$file должен быть открытым файловым дескрипоторм.

Добавлено @ 15:56 
Что содержит в себе $atf? 


--------------------
[color=gray]There's More Than One Way To Do It[/color]
PM MAIL WWW ICQ Skype   Вверх
Nika
Дата 17.5.2006, 18:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 50
Регистрация: 19.9.2005
Где: Красноярск

Репутация: нет
Всего: нет



$atf- это  имя файла, которое я получила с помощью <INPUT type="file" name="atfile">
Я делала без модуля CGI, так что функцией upload  воспользоваться не удасться... smile Сейчас попробую вышеуказанные советы. Спасибо smile 
PM MAIL WWW ICQ MSN   Вверх
Nika
Дата 17.5.2006, 18:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 50
Регистрация: 19.9.2005
Где: Красноярск

Репутация: нет
Всего: нет



Ага, я наткнулась на те же грабли. Не указала    enctype='multipart/form-data'. Косяк.  Вот только не знаю, как это 
xx7YNMS251WFtLgcHCUxdQW8L7iBqQEnLJJhdmjilGveZZGqmjmN9IV Content-Disposition: form-data; name="from" g g g ------------xx7YNMS251WFtLgcHCUxdQW8L7iBqQEnLJJhdmjilGveZZGqmjmN9IV Content-Disposition: form-data; name="to" [email protected] ------------xx7YNMS251WFtLgcHCUxdQW8L7iBqQEnLJJhdmjilGveZZGqmjmN9IV Content-Disposition: form-data; name="subject" dfghdh ------------xx7YNMS251WFtLgcHCUxdQW8L7iBqQEnLJJhdmjilGveZZGqmjmN9IV Content-Disposition: form-data; name="atfile"; filename="mysqlaccess.log" Content-Type: text/x-log ------------xx7YNMS251WFtLgcHCUxdQW8L7iBqQEnLJJhdmjilGveZZGqmjmN9IV Content-Disposition: form-data; name="attach" прикрепить ------------xx7YNMS251WFtLgcHCUxdQW8L7iBqQEnLJJhdmjilGveZZGqmjmN9IV Content-Disposition: form-data; name="text" dfhdfhdhdh ------------xx7YNMS251WFtLgcHCUxdQW8L7iBqQEnLJJhdmjilGveZZGqmjmN9IV-- 
обрабатывать, но придумаю.    
А может у кого есть процедурка, которая помогает получить имена и значения передаваемых параметров?  smile  
PM MAIL WWW ICQ MSN   Вверх
korob2001
Дата 17.5.2006, 20:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2871
Регистрация: 29.12.2002

Репутация: 13
Всего: 61



Модуль CGI:
Код

use CGI qw(param);
my $param1 = param('first');
my $param2 = param('second');
 


--------------------
"Время проходит", - привыкли говорить вы по неверному пониманию. 
"Время стоит - проходите вы".
PM MAIL WWW ICQ MSN   Вверх
Nika
Дата 18.5.2006, 08:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 50
Регистрация: 19.9.2005
Где: Красноярск

Репутация: нет
Всего: нет



что-то не получаетя....
Код

print "Content-Type: text/html; charset=windows-1251\n\n";
print "<HTML><HEAD><TITLE>Почтовая служба: новое письмо</TITLE>";
print "</HEAD>";
print "<BODY  bgcolor=#9992a4 link=#403841 alink=#403841 vlink=#403841 text=#403841>";
print "<CENTER><H1>Новое письмо</H1></CENTER><FORM enctype=\"multipart/form-data\" action=\"newmail.cgi?sid=$sid\">";
print "<table border=1 align=center bgcolor=#d1ccd2><tr><td>$error";
print "<table border=0><TR><td>От кого:</td><TD>$from</TD></TR>";
print "<INPUT type=\"hidden\" name=\"from\" value=\"$from\" size=20>";
print "<TR><td>Кому:</td><TD><INPUT type=\"text\" name=\"to\" value=\"$to\" size=60></TD></TR>";
print "<TR><td>Тема:</td><TD><INPUT type=\"text\" name=\"subject\"  value=\"$subject\" size=60></TD></TR>";
print "<TR><td>Файл:</td><TD><INPUT type=\"file\" name=\"atfile\" size=44>";
print "<INPUT type=\"submit\" name=\"attach\" value=\"прикрепить\" size=20></TD></TR></TABLE>";
for($i=0;$i<@_;$i++){
@namefile=split('/',@_[$i]);
$j=@namefile-1;
print "<INPUT TYPE=\"checkbox\" NAME=\"fol_del\" VALUE=\"@_[$i]\"  CHECKED>@namefile[$j]<BR>";}
print "<TEXTAREA NAME=\"text\" WRAP=\"virtual\" COLS=80 ROWS=15>$body</TEXTAREA><P></P>";
print "<INPUT type=\"submit\" name=\"sendmail\" value=\"отправить\" size=20>";
print "<INPUT type=\"submit\" name=\"savemail\" value=\"сохранить\" size=20>";
print "<INPUT type=\"submit\" name=\"back\" value=\"вернуться к папкам\" size=20>";
print "</td></tr></FORM></BODY></HTML>";   


Это страница.
Код

if($ENV{'REQUEST_METHOD'} eq 'GET'){$query=$ENV{'QUERY_STRING'};}
elsif($ENV{'REQUEST_METHOD'} eq 'POST')
 {sysread(STDIN,$query,$ENV{'CONTENT_LENGTH'});}


$query=
------------9Yo4YOYQ0fXyslVMftYbEM7TSidDL9aUgOXEm5emjAkbvDva6T9KqFl Content-Disposition: form-data; name="from" g g g ------------9Yo4YOYQ0fXyslVMftYbEM7TSidDL9aUgOXEm5emjAkbvDva6T9KqFl Content-Disposition: form-data; name="to" Veronika ------------9Yo4YOYQ0fXyslVMftYbEM7TSidDL9aUgOXEm5emjAkbvDva6T9KqFl Content-Disposition: form-data; name="subject" RE: dfgdgd ------------9Yo4YOYQ0fXyslVMftYbEM7TSidDL9aUgOXEm5emjAkbvDva6T9KqFl Content-Disposition: form-data; name="atfile"; filename="" ------------9Yo4YOYQ0fXyslVMftYbEM7TSidDL9aUgOXEm5emjAkbvDva6T9KqFl Content-Disposition: form-data; name="attach" прикрепить ------------9Yo4YOYQ0fXyslVMftYbEM7TSidDL9aUgOXEm5emjAkbvDva6T9KqFl Content-Disposition: form-data; name="text" Вы писали Tue, 16 May 2006 12:13:48 +0400 : Жуки@Mail.ru - маленькие герои в мире большого спорта! http://r.mail.ru/cln3055/zhuki.mail.ru/ ------------9Yo4YOYQ0fXyslVMftYbEM7TSidDL9aUgOXEm5emjAkbvDva6T9KqFl-- 


$sendmail=param('sendmail');
  $attach=param('attach');
  $savemail=param('savemail');
  $back=param('back');
  $reply=param('reply');
  $resend=param('resend');
  $sid=param('sid');

а эти переменные пустые. P.s. модуль я подключила.
Может, это от того что форму я печатаю "ручками", т.е. не с помощью модуля CGI?

 
PM MAIL WWW ICQ MSN   Вверх
Nika
Дата 18.5.2006, 16:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 50
Регистрация: 19.9.2005
Где: Красноярск

Репутация: нет
Всего: нет



я нашла ошибку. Не надо было делать так
Код

if($ENV{'REQUEST_METHOD'} eq 'GET'){$query=$ENV{'QUERY_STRING'};}
elsif($ENV{'REQUEST_METHOD'} eq 'POST')
 {sysread(STDIN,$query,$ENV{'CONTENT_LENGTH'});}

до того, как сделала
$sendmail=param('sendmail');
 Вот и все  smile  
PM MAIL WWW ICQ MSN   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Perl: CGI программирование"
korob2001
sharq
  • В этом разделе обсуждаются вопросы относящиеся только к CGI программированию
  • Если ваш вопрос не относится к системному или CGI программированию, задавайте его в общем разделе
  • Если ваш вопрос относится к системному программированию, задавайте его здесь
  • Интерпретатор Perl можно скачать здесь ActiveState, O'REILLY, The source for Perl
  • Справочное руководство "Установка perl-модулей", качать здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, korob2001, sharq.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Perl: разработка для Web | Следующая тема »


 




[ Время генерации скрипта: 0.0988 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.