Статьи Программирование в PHP

Загрузка файла на сервер в PHP (upload)

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

HTML форма отправки файла

Самая простая форма загрузки файла:

<form method="post" action="upload.php" enctype="multipart/form-data">
<input type="hidden" name="MAX_FILE_SIZE" value="2000000" />
<input type="file" name=" my_file ">
<input type="submit" value="Загрузить файл">
</form>

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

Параметр entype получает в этой форме значение multipart/form-data, что определяет, что в данной форме будет выполнена отправка бинарных данных, т.е. файла. Если это значение не указать, то по умолчанию форма будет выполняться как отправка текстовой информации.

Параметр method указывает метод отправки данных. Формы для загрузки файлов обычно используют метод передачи POST. Подробней о методах отправки форм можно узнать в статье "Отличия методов POST или GET"

Параметр action содержит ссылку на PHP-файл, содержащий код обработки отправляемых данных.

Параметр MAX_FILE_SIZE, указанный в форме определяет максимальный размер файла, заданный в байтах. По умолчанию, этот размер определяется настройками сервера.

Для указания загружаемого файла тег <input> должен содержать тип "file", а так же для дальнейшей работы PHP-скрипта следует указать значение "name".

Отправка данных формы выполняется тегом <input> с типом "submit". Он отображается обычной кнопкой.

PHP код сохранения файла

Задача этого обработчика, получив данные формы, проверить ее на возможные ошибки, переместить полученный сервером временный файл в нужное место с заданным именем. Здесь же могут выполнять еще различные необходимые операции – запись информации в БД, создание уменьшенных копий изображений, сохранение изображений с добавлением авторских прав и многое другое.

В принимающем коде, данные о файле содержатся суперглобальном массиве $_FILES. Соответственно, просмотреть сведения об отправленном из формы файле, можно в $_FILES['my_file']. Такой массив содержит следующую информацию:

$_FILES['my_file']['name']имя отправляемого файла
$_FILES['my_file']['size']размер загруженного файла в байтах
$_FILES['my_file']['type']MIME-тип принятого файла. Если он определяется, содержит, например: image/gif, image/png, image/jpeg, text/html
$_FILES['my_file']['tmp_name']содержит имя файла во временном каталоге, например: /tmp/phpR4n5wJ
$_FILES['my_file']['error']код ошибки $_FILES, если она возникла при загрузке файла

После получения этой информации на сервере, файл должен быть скопирован в постоянную директорию, т.к. временный файл по завершении скрипта автоматически будет удален.

Копирование выполняется функцией copy(), параметрами которой служит имя исходного файла (для этого случая имя временного файла - $_FILES['my_file']['tmp_name']) и имя конечного файла.

В итоге должен получиться следующий код:

<?php
// указание директории и имени нового файла на сервере
$new_file = '/upload_files/'.$_FILES['uploadfile']['name'];

// копирование файла
if (copy($_FILES['uploadfile']['tmp_name'], $new_file)) {
echo "Файл загружен на сервер";
} else {
echo "Ошибка при загрузке файла";
?>

Копирование файла, должно выполняться в существующую папку на сервере с имеющимися правами на создание в ней файлов.

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

Функция copy() возвращает значение true, если копирование выполнено успешно и False при возникновении ошибки в процессе копирования.

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


Комментарии

17.02.2016 19:56 Капанович [гость]
в пхп коде присутствуют ошибки, в функции copy - неверно задана переменная имени файла, а в конструкции if - второй оператор else, а не echo
18.02.2016 11:13 Антон [администратор]
Добрый день, Капанович.
Огромное спасибо за ваше замечание. Действительно, были эти ошибки - они, естественно, исправлены.
Имя:
Текст комментария:
* В комментариях запрещено публиковать рекламные объявления. Сообщения, содержащие ссылки на сторонние ресурсы добавляется в скрытом режиме. Они будут открыты, если не нарушают установленных правил, после проверки.
Защита от спам-роботов (* Обязателельно укажите ответ на простой вопрос ниже.)
Сколько букв в слове «барабан»? (цифра)