Загрузка файлов на сервер с помощью PHP. Загрузка файлов на сервер с помощью PHP Множественная загрузка файлов php
19KСегодня я хочу рассказать вам о разнообразных ситуациях, связанных с загрузкой файлов на сервер с помощью PHP-скриптов . Постараюсь привести примеры, как самой простой загрузки файла, так и мультизагрузки с применением move uploaded file PHP .
Для загрузки файлов на сервер. Прежде всего, нужно создать HTML-форму с полем file input . Затем привязать к ней PHP-скрипт , который переместит файл в указанную директорию. Чтобы закачать файл на сервер с помощью PHP-скрипта , выполните следующие действия:
- Создайте простую HTML-форму : потребуется простая форма с возможностью указания файла. Она размещается в файле basic.php :
Basic File Upload
Приведенный выше код необходим для создания формы. Как только пользователь выбирает файл и нажимает кнопку Upload , форма передаст данные с помощью метода POST на этой же странице, так как в качестве обработчика указан файл basic.php :
Важно: не забудьте добавить enctype=”multipart/form-data” в тег .
- Создаем PHP-скрипт для обработки формы загрузки. В PHP вся информация о загруженных файлах содержится в глобальной переменной $_FILES . То есть, используя $_FILES , можно проверить, был ли загружен файл. Если файл был загружен, то можно переместить его в нужную директорию при помощи функции move_uploaded_file PHP :
Приведенный выше код проверяет, загрузил ли пользователь файл. Если файл загружен, то мы перемещаем файл в указанную директорию. В приведенном выше скрипте мы перемещаем файл в ту же папку, где находится файл basic.php .
Ниже приведена полная версия PHP move uploaded file примера :
Basic File Upload
Пожалуйста, не тестируйте этот PHP move uploaded file пример на сервере. Он не отвечает требованиям безопасности, и был создан специально для того, чтобы наглядно показать, как загружать файлы с помощью PHP .
Вопрос:
Почему приведенный выше скрипт небезопасен?
Ответ:
С помощью скрипта, приведенного выше, можно загрузить файл любого типа на сервер. То есть, если вы используете скрипт в таком виде на “живом
” сервере, то любой хакер сможет загрузить собственные PHP-скрипты
, и взломать ваш сайт и сервер.
Чуть позже мы подробнее поговорим о защите скрипта для загрузки файлов на сервер.
Что такое $_FILES?
$_FILES – это глобальная переменная в PHP наподобие $_POST или $_GET . Она представляет собой ассоциативный массив, в котором находится информация о загруженном файле с помощью метода HTTP POST .
То есть, если выполнить print_r($_FILES) для приведенного выше скрипта, то мы получим следующую информацию:
Array ( => Array ( => upload-file-php.jpg => image/jpeg => /Applications/XAMPP/xamppfiles/temp/phpcQiYhh => 0 => 6887))
То есть, для каждого поля в массиве создается элемент. Если вы создадите , то название элемента также будет изменено на test . Например:
Array ( => Array ( => upload-file-php.jpg => image/jpeg => /Applications/XAMPP/xamppfiles/temp/phpcQiYhh => 0 => 6887))
Теперь для каждого input file , перемещаемого с помощью move uploaded file PHP , создается пять элементов (name , type , tmp_name , error , size ). Давайте познакомимся с этими элементами поближе:
- name: содержит название загруженного пользователем файла. Если вы загрузите файл abc.txt в браузер, то элемент name получит название abc.txt ;
- type: тип загруженного файла или mime-type , если точнее. Для файла JPG этот элемент будет иметь значение image/jpeg . Если загрузить текст, то элемент получит значение text/plain . Для разных типов файлов разным будет и mime-type . Ниже приведены самые распространенные mime-типы :
- JPEG: image/jpeg ;
- PNG: image/png ;
- Текст: text/plain ;
- Word: application/msword .
- tmp_name: временное расположение для загруженного файла. Этот путь можно изменить в переменной upload_tmp_dir , указанной в файле php.ini .
- error: информация об ошибке. Включает в себя тип ошибки, возникшей в процессе загрузки. Например, когда размер файла превышает максимальный или когда не был указан файл для загрузки. Для любой возникшей ошибки имеется числовое значение и константа. Ниже приведен полный список ошибок, которые могут возникнуть в PHP move uploaded file примере :
- UPLOAD_ERR_OK (значение 0) . Означает, что файл был успешно загружен без ошибок;
- UPLOAD_ERR_INI_SIZE (значение 1) . Размер файла превышает указанный в переменной upload_max_filesize в файле php.ini ;
- UPLOAD_ERR_FORM_SIZE (значение 2) . Размер файла превышает установленное в переменной формы MAX_FILE_SIZE значение;
- UPLOAD_ERR_PARTIAL (значение 3) . Файл загружен не полностью;
- UPLOAD_ERR_NO_FILE (значение 4) . Отсутствует файл для загрузки;
- UPLOAD_ERR_NO_TMP_DIR (значение 6) . Указанной директории для временного хранения не существует;
- UPLOAD_ERR_CANT_WRITE (значение 7) . Невозможно записать файл на диск.
- size: размер загруженного файла в байтах.
Что такое move_uploaded_file?
move_uploaded_file представляет собой функцию, которая перемещает загруженный файл из временной директории в папку назначения. Перед перемещением move_uploaded_file PHP проверяет, был ли загружен файл, указанный в HTTP-методе post .
Если файл был успешно перемещен, то вы получите ответ true или false . В первом примере мы использовали следующую строку кода:
move_uploaded_file($_FILES["inputfile"]["tmp_name"], $destiation_dir)
А теперь давайте сделаем красиво, и выведем информацию:
if(move_uploaded_file($_FILES["inputfile"]["tmp_name"], $destiation_dir)){ echo "File Uploaded" } else{ echo "File Not uploaded" }
Изменяем лимит размера загружаемого файла
У каждой формы для загрузки файлов должен быть установлен лимит размера, иначе пользователи станут загружать увесистые файлы. Выставить ограничение на move uploaded file PHP можно двумя способами:
- В файле PHP.ini есть специальная переменная upload_max_filesize , которая отвечает за максимальный размер загружаемых файлов. Далее приведена строчка из php.ini , которая ограничивает размер загружаемых файлов до 20 Мб: upload_max_filesize = 20M .
- Если загружаемый файл будет иметь больший размер, то пользователь получит ошибку UPLOAD_ERR_INI_SIZE или значение «2» в переменной $_FILES . Важно учесть, что значение переменной upload_max_filesize не должно превышать значение переменной post_max_size , указанной в php.ini ;
- Ограничить размер загружаемого файла можно, поместив скрытый элемент ввода с названием UPLOAD_ERR_INI_SIZE в форму загрузки. Сделать это можно так: .
Если нужно сильно увеличить filesize , то не забудьте изменить время исполнения php-скриптов .
Как обезопасить PHP-скрипт загрузки файлов
Теперь вы умеете ограничивать размер загружаемых файлов и знаете, как определить типы файлов, которые загружают пользователи. Пришло время позаботиться о безопасности нашего PHP move uploaded file примера.
В качестве примера сделаем так, чтобы пользователи не могли загружать jpeg-файлы размером свыше 1 Мб. Установите соответствующее ограничение в переменной upload_max_filesize файла php.ini . Ниже приведена улучшенная версия скрипта:
Secure File Upload
Мультизагрузка файлов при помощи PHP-скрипта
Можно загружать сразу несколько файлов при помощи $_FILES и move_uploaded_file PHP . Ниже я расскажу вам о двух способах мультизагрузки файлов с помощью PHP-скрипта :
- Используя разные имена Input .
- Используя одно и то же имя input, но с привлечением массива.
1. Используя разные имена Input:
Можно загружать сразу несколько файлов, используя несколько элементов ввода. Как уже говорилось ранее, если мы создаем несколько элементов input, то в $_FILES будет создано несколько основных элементов. Например, для приведенной ниже формы:
$_FILES представит массив следующего содержания:
Array ( => Array ( => 20141002_094257.jpg => image/jpeg => /Applications/XAMPP/xamppfiles/temp/phpoBWrBZ => 0 => 2669096) => Array ( => 20141002_094247.jpg => image/jpeg => /Applications/XAMPP/xamppfiles/temp/phpjwUmVZ => 0 => 2207657))
Приведенный ниже PHP move uploaded file пример нужно писать с учетом того, что один элемент предназначен для аватарки (изображение ), а другой – для загрузки резюме (файла в формате .doc ):
Multiple File Upload
2. Используем одно поле input, но с применением массива:
Как и в случае с другими типами input , для move uploaded file PHP мы можем использовать массив с input type , указанным в php . То есть:
То есть, для приведенного выше HTML , $_FILES предоставит данные со следующей структурой:
Array ( => Array ( => Array ( => upload-file-php.jpg => variable-scope-php.jpg => magic-constants.jpg) => Array ( => image/jpeg => image/jpeg => image/jpeg) => Array ( => /Applications/XAMPP/xamppfiles/temp/phpML5kOy => /Applications/XAMPP/xamppfiles/temp/phpNZbuw7 => /Applications/XAMPP/xamppfiles/temp/phpO8VFAk) => Array ( => 0 => 0 => 0) => Array ( => 6887 => 8036 => 9967)))
Скачать код, использованный в статье
Данная публикация представляет собой перевод статьи «File Upload With PHP Script » , подготовленной дружной командой проекта
Приложение для загрузки файлов на сервер представляет собой HTML-форму (upload.html) и скрипт upload.php для ее обработки.
Замечание: Вы можете загрузить промышленную версию системы загрузки файлов на сервер из раздела . Система позволит вам не только загрузить файл на сервер, но и изменить его размер, фон и др.
Код формы (upload.html)
Форма для загрузки файлов