PHP загрузка файлов через форму

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

Все проблемы возникают из за того, что файлы по средством загрузки данных через поле формы

передаются на сервер только строго при определенных настройках самой формы.

Подготовка формы к отправке файлов

Чтобы сделать процесс отправки файлов возможным, требуется указать протокол POST и способ кодирования данных multipart/form-data при отправке на сервер.

Чтение информации о загруженном файле

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

Этот набор данных хранится в массиве $_FILES, где каждый элемент представляет собой описание загруженного файла. Ключи массива соответствуют именам полей, которые вы задали в форме.

Если PHP удалось загрузить файл на сервер, то error равен 0, а tpm_name — содержит путь до временно созданного файла. Оригинальное название хранится в переменной name, также есть дополнительная информация о типе и размере файла.

Не стоит здесь доверять информации о типе файла, т.к. это просто расшифровка расширения.

Дальнейшая обработка файла

Вы знаете где находится загруженный файл. Как можно работать с ним далее? Для этого PHP имеет богатый арсенал команд и расширений.

Если вы не переместите файл из временной папки, то сервер (в зависимости от настроек) рано или поздно удалит временный файл. Он гарантированно будет находится во временной папке лишь до окончания работы PHP скрипта.

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

Сохранить файл на сервере

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

Копируем файл:

bool copy ( string $source , string $dest [, resource $context ] )

Перемещаем файл:

bool rename ( string $oldname , string $newname [, resource $context ] )

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

Пример использования:

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

Специально для загружаемых файлов PHP также предлагает специальную команду:

bool move_uploaded_file ( string $filename , string $destination )

Данная команда позволяет убедиться, что указанный filename был получен именно через HTTP POST механизм, а не каким либо другим способом. Если файл получен именно так, то производится перемещение.

Чтение файла и работа с текстом

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

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

string file_get_contents ( string $filename [, bool $use_include_path = FALSE [, resource $context [, int $offset = 0 [, int $maxlen ]]]] )

Как видите, функция может принимать множество параметров, самый простой случай это такое использование:

Текст загружен, дальше с ним можно уже что то делать. А потом, к примеру, результаты записать в другой файл.

Чтение и работа с XML

Множество расширений позволяет грузить файл через соответствующие команды инициализации, минуя варианты вроде file_get_contents. К примеру, парcер XML, позволяет загрузить данные непосредственно из файла:

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

Написать комментарий

Мало букафф? Читайте есчо !

Восстанавливаем объект из состояния __PHP_Incomplete_Class_Name

Декабрь 13, 2014 г.

Объект класса "__PHP_Incomplete_Class" с дополнительным свойством __PHP_Incomplete_Class_Name => 'имя класса' появляется, когда PHP не удается найти объявление класса при операции десериализации объекта. К примеру, такое может происходить при хранении ...

Читать

Как использовать callback функции внутри класса

Июнь 5, 2017 г.

Пробовали ли вы использовать функции PHP, требующие указания кол-бек функции в качестве аргумента? Я часто пользуюсь preg_replace_callback(). Если функция вызывается внутри класса, то хотелось бы и callback разместить внутри этого же класса (объекта). ...

Читать

 

Комментарии к «PHP загрузка файлов через форму»

Понравилась статья? Есть вопросы? - пишите в комментариях.



Комментарий: