SEO  -   СТАТЬИ
СтатьиОсновы сайта → Загрузка файлов по http

Загрузка файлов по http

Иногда возникает необходимость загружать файлы на виртуальный сервер не по протоколу FTP (как это делается в большинстве случаев), а прямо через браузер по протоколу HTTP. Это может быть полезно как для администратора сервера, так и для пользователей конкретного веб-ресурса.

Пример формы ввода

Например, если необходимо сделать загрузку фотографий посетителей на сайт, можно воспользоваться именно такой технологией: посетитель выбирает файл на диске и нажимает кнопку "Загрузить". Пример формы:


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

Итак, разберемся подробно, что это за форма ввода и какие у нее есть особенности. Во-первых, формат тэга

- это обычная форма, но есть несколько условий его использования:

1. Передача параметров скрипту должна осуществляться методом POST, а не методом GET, который используется по умолчанию в том случае, если метод передачи данных (параметр method) не был определен для формы веб-мастером.

2. Необходимо четко определить content-type, с которым данные будут передаваться на сервер. Это делается с помощью параметра enctype. Итак, надо четко определить enctype. Этот параметр должен иметь значение multipart/form-data. Обычное значение enctype другое, но если в форме есть элемент ввода с типом file, нужно использовать именно этот тип данных.

Итак, тэг будет выглядеть примерно вот так :


В этом примере добавлен стандартный для большинства форм параметр action, который определяет, куда будут переданы результаты заполнения формы. В данном случае это скрипт /cgi-bin/upload.cgi. Что это за скрипт и каким он может быть, мы рассмотрим ниже. Отметим только то, что имя скрипта и место его размещения может быть произвольным. В данной статье расположение скрипта указано исключительно для примера.

Далее размещаем стандартные элементы для формы:

1. Элемент выбора файла:

Ключ type с параметром file указывает на то, что в результирующем html-документе, который увидит посетитель сервера, будет форма ввода имени файла, а рядом мы увидим кнопку, при нажатии на которую браузер откроет интерфейс интерактивного выбора файла прямо на машине пользователя.

Параметр name=myfile указывает на то, что двоичные данные, из которых состоит файл, будут переданы скрипту в параметре myfile. Именно этот параметр мы будем использовать, когда будем рассматривать процедуру принятия файла скриптом.

2. Кнопка

Для того, чтобы отобразить в html документе кнопку, при нажатии на которую начнется передача данных из формы, добавим в html-код такую строчку :

После всего этого необходимо закрыть форму тэгом

. Все, форма готова.

Скрипты для обработки принимаемых данных

Итак, пользователь выбрал файл на диске и нажал на кнопку. Теперь нам нужно принять пользовательский файл и сделать с ним что-нибудь. Для этого обычно используют скрипты на языках Perl или PHP. Мы рассмотрим оба варианта.

Пример скрипта на Perl

#!/usr/local/bin/perl

use CGI qw(param);

# Определяем путь к каталогу, где будут размещены файлы
$down = "/path/to/download/dir/";

$myfile = param('myfile');

# Получаем имя файла, которое указал пользователь
($name) = $myfile =~ m#([^\\/:]+)$#;

# Открываем файл и определяем, что работа с ним будет идти в двоичном режиме
open(OUT,">$down$name");
binmode(OUT);

# Начинаем получать данные и помещать их в файл
while (<$myfile>)
 {
   print OUT $_;
 }

# Закрываем файл и показываем сообщение об успешной загрузке
close(OUT);

print "Content-type: text/html\n\n";
print "Файл $name был успешно загружен!";

После того, как мы поместим данный скрипт в файл, положим его в каталог, из которого скрипты должны исполняться и назовем так, как указали в параметре action тэга

, нужно не забыть выставить на этот файл корректные права доступа. Обычно достаточно прав 750 (-rwxr-x---), но мы рекомендуем все же уточнить это в документации Вашего хостинг-провайдера.

Еще одна полезная возможность - устанавливать максимальный размер файла, который может быть загружен, путем определения в нужное значение специальной переменной :

$CGI::POST_MAX= 1048576; # максимальный размер в байтах

Дополнительную информацию по этой переменной можно получить в документации - perldoc CGI.

Пример скрипта на языке PHP

В php загрузка файлов осуществляется гораздо проще. Там есть встроенный модуль, который отвечает за загрузку. Можно поступить по аналогии с Perl: открывать входной поток данных, вычислять имя, получать и писать данные в двоичном режиме. Однако удобнее воспользоваться встроенным механизмом.

Как Вы помните, в нашей форме переменная, которая передает имя файла, названа myfile. Если в качестве аргумента к параметру action в форме задан php-скрипт, то в самом скрипте после передачи в него методом POST данных из формы, будут предопределены следующие переменные :

$myfile - имя (полное, с путем) временного файла, под которым были сохранены загруженные на сервер данные
$myfile_name - имя оригинального файла, под который данные были у пользователя на диске
$myfile_size - размер файла, который был загружен на сервер
$myfile_type - mime-type файла пользователя

Имея такие переменные, можно написать скрипт, обрабатывающий загрузку файла :

Такой скрипт (из одной строчки!), если Вы укажете его в action, примет файл, поместит его во временный каталог, "вычислит" оригинальное имя файла и скопирует файл в каталог /path/to/download/dir/. Следует отметить, что функция move_uploaded_file() работает только в php версии 4.x. Для php версии 3.x необходимо использовать функцию copy():

Дополнительно можно показать сообщение о том, что файл был успешно загружен, а также проконтролировать: с тем ли расширением был загружен файл, тот ли он имеет content-type, не превышает ли он максимально приемлемый размер и так далее.

move_uploaded_file - тоже встроенная функция последних версий PHP. Стоит учесть то, что файл, который PHP загружает во временный каталог, доступен только во время выполнения запроса на загрузку. После этого PHP сотрет этот файл. То есть, сразу после того, как была произведена загрузка, необходимо переместить полученный файл куда-нибудь или Вы его потеряете.

Кроме move_uploaded_file есть еще несколько полезных функций, о которых можно прочитать тут. В частности, представляет интерес функция is_uploaded_file, которая помогает обеспечить достаточный уровень безопасности при загрузке файлов.

Возможные трудности

При использовании PHP стоит предварительно убедиться, что фукнция загрузки файлов включена администратором сервера в число доступных. Если Вы имеет возможность редактировать конфигурационный файл PHP (php.ini), проверьте, установлена ли опция "file_uploads" в значение "On". Также в php.ini регулируется максимальный размер файла, который можно быть загружен по HTTP с использованием PHP - проверьте опцию "upload_max_filesize".

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

Заключение

Есть много готовых скриптов и программ на самых разных языках программирования. Но иногда хочется гибкости конструкций, не хочется связываться с чужими скриптами, разбираться в них, хочется просто скопировать в свой скрипт небольшой фрагмент и наслаждаться результатом. Этот документ также позволит желающим разобраться в сути процессов, происходящих при загрузке файлов, и понять, "как это работает".

Если Вы заметили какие-либо неточности или ошибки в размещенной информации, просим сообщить о них администрации. SIGMA Logistics