Множественная загрузка файлов на сервер. Пример загрузки файлов на сервер (upload) на языке php. Пример реализации загрузки картинок на сервер
На PHP часто нужна загрузка файлов на сервер...приятно же, если у вашего сайта есть возможность загружать файлы на сайт: картинки или другие текстовые файлы или другие форматы...поговорим в этой статье об этом...
Итак нам нужно научиться загружать файл на сервер с помощью PHP. Для этого нам нужно знать, что такие загрузки происходят с помощью простой multipart-формы , у которой имеется специальное поле для загрузки файла.
В качестве параметра enctype в такой форме нужно указывать значение multipart/form-data. Отправляется методом POST.
Как обрабатывать multipart-формы на PHP
После нажатия кнопки "Загрузать" PHP помещает файл во временную директорию и задает файлу временное имя(оно отличается от загружаемого - ниже будет видно). И сразу же создается 4 переменных глобального массива $_FILES:
- $_FILES["uploadfile"]["name"] - имя файла до его отправки на сервер (то есть оригинальное);
- $_FILES["uploadfile"]["size"] - размер принятого файла в байтах;
- $_FILES["uploadfile"]["type"] - MIME-тип принятого файла (если браузер смог его определить), например: image/gif, image/png, image/jpeg, text/html;
- $_FILES["uploadfile"]["tmp_name"] - содержит имя файла во временном каталоге, например: /tmp/php57Opq2Y;
- $_FILES["uploadfile"]["error"] - Код ошибки, которая может возникнуть при загрузке файла. Ключ ["error"] был добавлен в PHP 4.2.0.
Обратите внимание : после окончания работы скрипта загрузки файла на сервер - временный файл будет удален, поэтому необходимо скопировать этот файл из временной директории в какую-либо папку, например files при помощи функции copy() ; Не нужно применять функцию move(), так как у copy в этот момент есть 2 преимущества: временный файл самостоятельно удалиться, и если временный каталог находится на другом носителе - то выведется ошибка.
Подсказка : процесс должен начинаться по условию нажатия кнопки "Загрузить", то ест к примеру: if($_POST["submit"]){то выполняй действия}
Картинка, которая наглядно покажет 4 созданные переменные глобального массива $_FILES:
Я думаю теперь все у вас прояснилось, что куда попадает и что-где создается...и далее манипулирую этими полями, можем начать работать с этой формочкой на php
Примерно так может выглядеть сам скрипт:
if($_POST["submit"]){
@mkdir("files", 0777); // создаем папку, если ее нет то ошибки не будет, задаем права
/*echo "
";";*/
print_r($_FILES);
echo "
$uploaddir = "files/";
$uploadfile = $uploaddir.basename($_FILES["uploadfile"]["name"]);
If(copy($_FILES["uploadfile"]["tmp_name"], $uploadfile)){
echo "
Файл успешно загружен на сервер
";}else{
echo "
Не удалось загрузить файл на сервер
";exit;
}
//Данные о загруженном файле
echo "
Информация о загруженном на сервер файле:
";echo "
Оригинальное имя загруженного файла: ".$_FILES["uploadfile"]["name"]."
";echo "
Mime-тип загруженного файла: ".$_FILES["uploadfile"]["type"]."
";echo "
Размер загруженного файла в байтах: ".$_FILES["uploadfile"]["size"]."
";echo "
Временное имя файла: ".$_FILES["uploadfile"]["tmp_name"]."
";}
Вот так вот и происходит процесс загрузки файла на сервер средствами PHP.
Надеюсь было кому-либо полезно!
Multipart-формы
- Веб-итерфейсы почтовых сервисов, которые позволяют добавалять к письму приложение (attach), а для этого нужно сначала загрузить файл на сервер, и только после этого его можно добавлять к письму;
- Интерактивные фотогалереи и фотоальбомы, которые не могут существовать без механизма загрузки файлов на сервер;
- Порталы бесплатного програмного обеспечения, которые используют для обмена файлами различных программ, и.т.д.
Загрузка файла на сервер осуществляется с помощью multipart -формы, в которой есть поле загрузки файла. В качестве параметра enctype указывается значение multipart/form-data :
Вот так примерно будет выглядеть приведенная multipart-форма (вы можете попробовать с ее помощью посмотреть результат работы multipart-форм, загрузив какой-нибудь файл небольшого размера на сервер):
Multipart-формы обычно используют метод передачи POST. Как видно из предыдущего примера, данная форма имеет два поля:
- Поле выбора файла для закачки ;
- Поле указания имени файла, которое он должен будет иметь на сервере .
Обработка multipart-форм
Прежде, чем приступить к написанию скрипта обработки multipart-формы, нужно отредактировать файл конфигурации php.ini , чтобы разрешить загрузку файлов на сервер.
Конфигурационный файл PHP php.ini имеет три параметра, связанные с загрузкой файлов на сервер:
- file_uploads=On - разрешает загрузку файлов на сервер по протоколу HTTP;
- upload_tmp_dir=/tmp - устанавливает каталог для временного хранения загруженных файлов;
- upload_max_filesize=2M - устанавливает максимальный объем загружаемых файлов.
Если ваш веб-сервер работает под управлением операционной системы Linux, то нужно перезапустить сервис:
service httpd restart
Как же PHP обрабатывает multipart-формы? Получив файл, он сохраняет его во временном каталоге upload_tmp_dir , имя файла выбирается случайным образом. Затем он создает четыре переменных суперглобального массива $_FILES . Этот массив содержит информацию о загруженном файле.
Переменные, определенные для загруженных файлов, зависят от версии PHP и текущей конфигурации. Суперглобальный массив $_FILES доступен начиная с PHP 4.1.0. В случае, если конфигурационная директива register_globals установлена значением on , дополнительно будут объявлены переменные с соответствующими именами. Начиная с версии 4.2.0 значением по умолчанию для опции register_globals является off .
Содержимое массива $_FILES для нашего примера приведено ниже. Обратите внимание, что здесь предполагается использование имени uploadfile для поля выбора файла, в соответствии с приведенной выше multipart-форме. Разумеется, имя поля может быть любым.
- $_FILES["uploadfile"]["name"] - имя файла до его отправки на сервер, например, pict.gif;
- $_FILES["uploadfile"]["size"] - размер принятого файла в байтах;
- $_FILES["uploadfile"]["type"] - MIME-тип принятого файла (если браузер смог его определить), например: image/gif, image/png, image/jpeg, text/html;
- (так мы назвали поле загрузки файла) - содержит имя файла во временном каталоге, например: /tmp/phpV3b3qY;
- $_FILES["uploadfile"]["error"] - Код ошибки, которая может возникнуть при загрузке файла. Ключ ["error"] был добавлен в PHP 4.2.0. С соответствующими кодами ошибок вы можете ознакомиться
После завершения работы скрипта, временный файл будет удален. Это означает, что мы должны его скопировать в другое место до завершения работы скрипта. То есть алгоритм работы сценария загрузки файла на сервер такой:
Если кнопка "Submit" нажата, то файл уже будет загружен на сервер и его имя будут в переменной $_FILES["uploadfile"]["name"] . В этом случае скрипт должен сразу скопировать файл с именем $_FILES["uploadfile"]["tmp_name"] в какой-нибудь каталог (необходимы права на запись в этот каталог).
Копирование файла производится функцией copy() :
Используйте только функцию копирования copy() , а не перемещения, поскольку:
- Временный файл будет удален автоматически;
- Если временный каталог находится на другом носителе, будет выведено сообщение об ошибке.
Предположим, нам нужно загрузить файл в каталог uploads , который находится в корневом каталоге веб-сервера (в каталоге DocumentRoot ).
// На всякий случай создадим каталог. Если он уже создан,
// сообщение об ошибки мы не увидим, поскольку воспользуемся оператором @:
@mkdir("uploads", 0777);
// Копируем файл из /tmp в uploads
// Имя файла будет таким же, как и до отправки на сервер:
Copy($_FILES["uploadfile"]["tmp_name"],"uploads/".basename($_FILES["uploadfile"]["name"]));
В Linux все намного сложнее - нам нужно учитывать права доступа к каталогу uploads . Скорее всего в таком случае, функция mkdir() не сработает, так как у нас нет прав на запись в каталог DocumentRoot (обычно это /var/www/html или /home/httpd/html). Зарегистрируйтесь в системе как пользователь root , создайте каталог uploads и измените его владельца и права доступа следующим образом:
// Создаем каталог uploads
// Устанавливаем имя владельца apache и его группу - тоже apache:
Chown apache:apache uploads
// Разрешение записи всем (777) + установка закрепляющего бита (1):
Chmod 1777 uploads
Размер файла можно ограничить, при желании можно отредактировать файл .htaccess и ограничить доступ к каталогу uploads - указать или конкретных пользователей, которым можно обращаться к каталогу, или IP-адреса.
Вот теперь можно загружать файлы на сервер.
Пишем PHP скрипт загрузки файлов на сервер
php Оригинальное имя загруженного файла: "
// Каталог, в который мы будем принимать файл:
$
uploaddir
=
"./files/"
;
$
uploadfile
=
$
uploaddir
.
basename
($
_FILES
[
"uploadfile"
][
"name"
]);
// Копируем файл из каталога для временного хранения файлов:
if
(copy
($
_FILES
[
"uploadfile"
][
"tmp_name"
],
$
uploadfile
))
{
echo
"Файл успешно загружен на сервер
"
;
}
else
{
echo
"Ошибка! Не удалось загрузить файл на сервер!
"
;
exit
;
}
// Выводим информацию о загруженном файле:
echo
"Информация о загруженном на сервер файле:
"
;
echo
"
echo "
Mime-тип загруженного файла: "
.$ _FILES [ "uploadfile" ][ "type" ]. "" ;echo "
Размер загруженного файла в байтах: "
.$ _FILES [ "uploadfile" ][ "size" ]. "" ;echo "
Временное имя файла: "
.$ _FILES [ "uploadfile" ][ "tmp_name" ]. "" ;?>
Загрузку нескольких файлов можно реализовать используя, например, различные значения name для тега input .
Также предусмотрена возможность автоматического получения организованной в массив информации о нескольких одновременно загружаемых файлах. Для реализации такой возможности используйте тот же синтаксис отправки массива из HTML-формы, что и для множественных полей select и checkbox :
В случае, если такая форма была отправлена, массивы $_FILES["userfile"] , $_FILES["userfile"]["name"] , и $_FILES["userfile"]["size"] будут инициализированы (точно так же, как и $HTTP_POST_FILES для PHP 4.1.0 и более ранних версий). Если конфигурационная директива register_globals установлена значением on , также будут инициализированы сопутствующие глобальные переменные. Каждая из таких переменных будет представлять собой численно индексированный массив соответствующих значений для принятых файлов.
Предположим, что были загружены файлы /home/test/some.html и /home/test/file.bin . В таком случае переменная $_FILES["userfile"]["name"] будет иметь значение some.html , а переменная $_FILES["userfile"]["name"] - значение file.bin . Аналогично, переменная $_FILES["userfile"]["size"] будет содержать размер файла some.html и так далее.
Переменные $_FILES["userfile"]["name"] , $_FILES["userfile"]["tmp_name"] , $_FILES["userfile"]["size"] и $_FILES["userfile"]["type"] также будут инициализированы.
Заключение:
Как видите, организовать загрузку файлов на сервер не так сложно. Сложнее обеспечить необходимый уровень безопасности, так как загрузка файлов на сервер может использоваться злоумышленниками для атаки на сервер. О том, как обеспечить необходимый уровень безопасности, работая с Uploads , смотрите .
<<< Назад | Содержание | Вперед >>> |
Есть еще вопросы или что-то непонятно - добро пожаловать на наш | |
|
Для того чтобы сделать систему загрузки картинки или любого другого файла на сервер используется HTML-форма и PHP-скрипт обработки данных, отправленных этой формой. Именно таким способом реализованы разнообразные сервисы поддерживающие загрузку файлов на сервер. Реализуется она подобно обычной форме отправки данных на сервер .
HTML форма отправки файла
Самая простая форма загрузки файла:
В результате получим форму, содержащую поле для выбора файла и кнопку, отправляющую данные формы на сервер:
Параметр entype получает в этой форме значение multipart/form-data, что определяет, что в данной форме будет выполнена отправка бинарных данных, т.е. файла. Если это значение не указать, то по умолчанию форма будет выполняться как отправка текстовой информации.
Параметр MAX_FILE_SIZE , указанный в форме определяет максимальный размер файла, заданный в байтах. По умолчанию, этот размер определяется настройками сервера.
Для указания загружаемого файла тег должен содержать тип "file", а так же для дальнейшей работы PHP-скрипта следует указать значение "name".
Отправка данных формы выполняется тегом с типом "submit". Он отображается обычной кнопкой.
PHP код сохранения файла
Задача этого обработчика, получив данные формы, проверить ее на возможные ошибки, переместить полученный сервером временный файл в нужное место с заданным именем. Здесь же могут выполнять еще различные необходимые операции – запись информации в БД, создание уменьшенных копий изображений, сохранение изображений с добавлением авторских прав и многое другое.
В принимающем коде, данные о файле содержатся суперглобальном массиве $_FILES. Соответственно, просмотреть сведения об отправленном из формы файле, можно в $_FILES["my_file"]. Такой массив содержит следующую информацию:
После получения этой информации на сервере, файл должен быть скопирован в постоянную директорию, т.к. временный файл по завершении скрипта автоматически будет удален.
Копирование выполняется функцией copy() , параметрами которой служит имя исходного файла (для этого случая имя временного файла - $_FILES["my_file"]["tmp_name"]) и имя конечного файла.
В итоге должен получиться следующий код:
// указание директории и имени нового файла на сервере
$new_file = "/upload_files/"
.$_FILES["uploadfile"
]["name"
];
// копирование файла
if
(copy($_FILES["uploadfile"
]["tmp_name"
], $new_file)) {
echo
"Файл загружен на сервер"
;
} else
{
echo
"Ошибка при загрузке файла"
;
?>
Копирование файла, должно выполняться в существующую папку на сервере с имеющимися правами на создание в ней файлов.
В этом примере имя файла указывается тем же, как и у исходного загружаемого файла. В реале же очень часто имя задается в соответствии с собственными требованиями, чаще всего используя дату и время загрузки, что обеспечивает уникальность названия файла. Это позволяет свести хранение и обработку файлов к какому-либо единому стандарту. Здесь, конечно, появляются некоторые дополнительные задачи по хранению исходного названия в БД, если это нужно или определение расширения загружаемого файла . Но в таком случае будет меньше проблем с кодировкой названия фала, а так же цифровое название фала можно использовать для удобного формирования поддиректорий для хранения загружаемых фалов.
Функция copy() возвращает значение true, если копирование выполнено успешно и False при возникновении ошибки в процессе копирования.
При удачном завершении копирования, с загруженным на сервер файлом можно выполнять любые необходимые действия.
Сегодня сервис по загрузке файла на сервер (хостинг) встречается на всех сайтах социальных сетей, досках объявлений, сайтах знакомств и др. Суть его заключается в том, чтобы дать возможность посетителю веб ресурса опубликовать свои файлы (фото, документы) на просторах интернета.
При предоставлении данного сервиса есть один существенный минус. Дело в том, что разрешая загружать файл на свой сервер, мы как бы устанавливаем дверь, за которой необходим постоянный контроль. Так как в файле посетителя может быть не только полезная информация, но и вирусный код, который впоследствии может дать возможность злоумышленникам завладеть вашим сервером. Учитывая данный минус, необходимо тщательно проверять файлы до загрузки на сервер.
Но не буду вас запугивать, а лучше представлю вашему вниманию уже готовую функцию (PHP скрипт) для проверки и загрузки файлов на сервер. Функция 100% рабочая. Я сам использую её на своих сайтах. Данная функция написана под загрузку файлов изображений (фоток) в формате.jpg, .gif, .png. Но при желании можно внести изменения, чтобы адаптировать PHP скрипт под свои нужды.
В php скрипте реализованы две проверки:
- так как хостер ограничивает размер загружаемого файла (на момент написания данного материала у меня на хостинге стоит ограничение в 8 Mb), то проверка максимального размера необходима;
- проверка расширения файла позволяет отсеять ненужные файлы до загрузки.
Надеюсь в коде функции достаточно пояснений, чтобы разобраться с загрузкой файла на сервер. Но если возникнут вопросы, с удовольствием отвечу в комментариях.
Теперь о том, как это реализовать практически
Помещаем PHP код функции в отдельный файл: function.php и размещаем его на сервере в корневом каталоге.
И создадим html-файл в котором разместим форму для загрузки фото: index.html
upload.php - файл обработчик формы
name="button" - имя кнопки, при нажатии на которую запускается функция загрузки файла на сервер
Загрузка нескольких файлов
Теперь разберем случай, когда необходимо загрузить на сервер сразу несколько файлов.
Для этого нам понадобиться в файлах function.php upload.php и index.html сделать некоторые изменения.
Пожалуй, это все, что вам необходимо для реализации сервиса по загрузке пользовательского файла на сервер (хостинг).
Еще одна функция, которая тесно связана с загрузкой графических файлов (фоток) - это функция для изменения размеров фотки:
Наверняка, Вы часто загружали различные файлы на сайты . Например, загружали аватары на форуме , фотографии в социальных сетях, различные видеоролики на видеохостинги, просто файлы на файлообменники. И вот в этой статье Вы узнаете, как загрузить файлы на сервер в PHP . Именно через PHP в большинстве случаев это и реализуют.
Первым делом, что нужно усвоить - это то, что сама HTML-форма , в которую подставляется файл должна быть не совсем обычной, вот пример HTML-кода такой формы:
Ключевой момент здесь - это атрибут "enctype " со значением "multipart/form-data ". Без него ничего работать не будет.
", в котором мы ещё загружать файл не будем, а пройдёмся немного по различным важным моментам, которые надо обязательно учитывать, иначе может пострадать безопасность:
print_r($_FILES);
?>
В результате, Вы увидите содержимое глобального двумерного массива $_FILES :
- name - имя загружаемого файла.
- type - MIME-type загружаемого файла. Это, пожалуй, самый важный параметр для обеспечения безопасности. И всегда при приёме файлов необходимо проверять MIME-type , иначе проблем не оберётесь. В следующей статье мы поговорим об этом более детально.
- tmp_name - физический путь к временному файлу. Именно в это место и помещается файл, а уже потом мы его переносим в другое место. Фактически, файл уже загружен, а нам лишь надо его переместить в нужную папку на сервере.
- error - код ошибки. Если 0 , то ошибок нет.
- size - размер загружаемого файла. Вот это тоже частоиспользуемая опция, и её также надо проверять, чтобы ограничить размер загружаемых файлов . Безусловно, самим сервером этот размер ограничен, однако, для всяких картинок, этот размер явно завышен (как правило, он 10 МБ ).
И все эти параметры присутствуют для каждого загружаемого файла (каждые из которых представляют собой массив в двумерном массиве $_FILES ).
Теперь давайте уже закончим с загрузкой файлов на сервер в PHP , и для этого напишем такой код (""):
$uploadfile = "images/".$_FILES["somename"]["name"];
move_uploaded_file($_FILES["somename"]["tmp_name"], $uploadfile);
?>
То есть вначале мы задаём путь к загружаемому файлу на сервере. Здесь мы хотим поместить файл в директорию "images " с тем же именем, что и было раньше у файла. А функцией move_uploaded_file() мы перемещаем файл в выбранную нами директорию из его временного хранилища.
Однако, обратите внимание, это очень важно! Так использовать код ни в коем случае нельзя, иначе Вашему сайту будет угрожать серьёзная опасность! Фактически, на данный момент может быть загружено абсолютно всё, что угодно: любые исполняемые файлы, скрипты, HTML-страницы и другие весьма опасные вещи. Поэтому обязательно надо проверять загружаемые файлы на сервер очень тщательно. И вот этим мы и займёмся в следующей статье. Поскольку тема очень важная, то я советую Вам подписаться на обновления, чтобы не пропустить эту статью.