Завантаження файлів на сервер і посилка e-mail з вкладеннями, Perl, Програмування, статті

Одним з найпопулярніших питань у всіляких форумах є питання «Як завантажити файл на сервер?». Але ж насправді це не так складно, як здається на перший погляд. І щоб не було зовсім легко – нехай скрипт, який наведено нижче ще й посилає цей файл по пошті, у вигляді вкладення.

Для використання скрипта потрібно встановити 2 модуля: MIME::Lite і CGI

Другий швидше за все у вас є, а перший необхідно завантажити.

Приступимо до розбору лістингу:

Рядки з першої по третю не роблять нічого дуже важливого. Перша – стандартне початок будь-якого скрипта, друга і третя – за смаком.

5-12 рядки – конфігурація скрипта:

Рядок 7,8,9 – параметри письма (відповідно від кого, до кого і тема)

Рядок 10 – значення INCLUDE_META, яке якщо дорівнює 1, то в лист включається ще одне вкладення з різною службовою інформацією: про завантаженому файлі, змінних оточення і т.д.

Рядок 14 – підключення модуля CGI.pm. Тут не використовується об’єктно-орієнтований інтерфейс, а просто імпортуються всі функції.

16 рядок – отримання переданих браузером параметрів, якщо вони є. Якщо в процесі закачування файлу виникне помилка, то скрипт відразу перерве свою роботу і повідомить про помилку (cgi_error ()). При перевірці в Perl 5.0 під Windows я зіткнувся з помилкою – облаяли мене за те, що функції cgi_error () немає. Довелося сходити на CPAN.org і взяти нову версію CGI.pm (в моєму випадку це була версія 2.74)

Рядки з 22 по 37 виводять форму для завантаження файлу. Форма оголошується як multipart, в HTML-вигляді це виглядає так: enctype = “multipart / form-data”. Рядок 29 – спеціальне поле для завантаження файлу, в браузері воно відображається з кнопочкою «Обзор» (або “Browse”) справа.

Рядки 30 і 31 пропонують користувачеві визначити, як буде передаватися файл – як текст (mime-тип: quoted-printable) або як бінарники (тип: base64)

Форма закінчилася – почався розбір параметрів. Якщо скрипт викликається перший раз – то тут його робота закінчиться, а якщо користувач натискає кнопку Upload – то далі йде обробка:

Рядок 40 – підключення модуля MIME :: Lite

Рядок 41 і 42 – отримання файла, який користувач завантажив та інформації про нього в змінні $ file і $ info. $ File в залежності від контексту – і файл, і рядок.

Рядки 43-45 створюють об’єкт-лист $ msg. Йому присвоюються поля «від кого», «кому» і «тема» – адже лист повинен кудись прийти.

Якщо включений конфігураційний параметр INCLUDE_META – рядки з 46 по 56 створюють перше вкладення в лист, що містить службову інформацію. Якщо раптом у цій службової інформації будуть російські літери – то краще Encoding поміняти на 8bit.

Рядки 57-65 виконують основну роботу – створюють вкладення-файл, закачаний користувачем. 58-60 рядки – вибір типу вкладення, в залежності від того, який був вказаний в формі.

Ну і останні рядки скрипта – з 66 по 74 – відправляють повідомлення поштою. Тут використовується метод send_by_smtp (), він більш універсальний, однак використовує модуль Net :: SMTP. Можна також використовувати send_by_sendmail () (тоді sendmail буде шукатися в / usr / lib /, що можна поміняти, передавши параметр Sendmail => …, докладніше дивіться в модулі MIME :: Lite)

А якщо при передачі відбулася помилка при відправці листа – то скрипт просто видасть користувачеві на сторінку все що повинен був відправити поштою.

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

Лістинг:


        =1=     #!/usr/bin/perl -w
=2= use strict;
=3= $|++;
=4=
=5= ## configuration
=6=
=7= my $FROM = ‘webmaster@your.site’;
=8= my $TO = ‘upload@your.site’;
=9= my $SUBJECT = ‘File upload’;
=10= my $INCLUDE_META = 1;
=11=
=12= ## end configuration
=13=
=14= use CGI qw(:all);
=15=
=16= my @params = param();
=17= if (my $error = cgi_error()) {
=18= print header(-status => $error);
=19= exit 0;
=20= }
=21=
=22= print
=23= header,
=24= start_html("Upload"),
=25= h1("Upload"),
=26= hr,
=27= start_multipart_form,
=28= table(Tr(td(p(‘upload:’)),
=29= td(filefield(‘uploaded_file’))),
=30= Tr(td(p(’email as type:’)),
=31= td(radio_group(‘type’, [qw(binary text)]))),
=35= Tr(td({ -colspan => 2 }, submit))),
=36= end_multipart_form,
=37= hr;
=38=
=39= if (@params) {
=40= require MIME::Lite;
=41= if (my $file = upload(‘uploaded_file’)) {
=42= my $info = uploadInfo($file) or die "info?";
=43= my $msg = MIME::Lite->new
=44= (Type => ‘multipart/mixed’,
=45= From => $FROM, To => $TO, Subject => $SUBJECT);
=46= if ($INCLUDE_META) {
=47= $msg->attach
=48= (Type => ‘TEXT’, Encoding => ‘7bit’,
=49= Data => [
=50= "Upload info:\n",
=51= (map { "$_ => $info->{$_}\n" } sort keys %$info),
=52= "ENV:\n",
=53= (map { "$_ => $ENV{$_}\n" } sort keys %ENV),
=54= ],
=55= );
=56= }
=57= $msg->attach
=58= ((param(‘type’) eq ‘text’ ?
=59= (Type => ‘TEXT’, Encoding => ‘quoted-printable’) :
=60= (Type => ‘BINARY’, Encoding => ‘base64’)),
=64= (FH => $file)),
=65= );
=66= if ($msg->send_by_smtp(‘localhost’)) {
=67= print p("Upload sent by email.");
=68= } else {
=69= print
=70= p("An error occurred… here’s what would have been sent:"),
=71= pre($msg->as_string);
=72= }
=73= }
=74= }
=75= print end_html;

Схожі статті:


Сподобалася стаття? Ви можете залишити відгук або підписатися на RSS , щоб автоматично отримувати інформацію про нові статтях.

Коментарів поки що немає.

Ваш отзыв

Поділ на параграфи відбувається автоматично, адреса електронної пошти ніколи не буде опублікований, допустимий HTML: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

*

*