Php загружаются файлы на сервер. Загрузка файла на сервер с помощью JavaScript и библиотеки JQuery. Обычная загрузка файла
Сегодня я хочу рассказать вам о разнообразных ситуациях, связанных с загрузкой файлов на сервер с помощью 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
Рад видеть Вас на страницах своего сайта. Сегодня поговорим о реализации загрузки файлов на сервер. Тема довольно интересная т.к. многих новичков интересует данный вопрос.
Загрузка файлов на сервер средствами PHP значительно облегчит Ваш труд по наполнению фотогалереи или оформления страницы сайта при помощи редактора (например TinyMCE ). Также Вы можете загружать любые типы файлов на сервер исходя из Ваших задач.
Для того чтобы загрузить файл на сервер нужно создать форму для загрузки файлов. В принципе данная форма не очень сильно отличается от обычной формы с текстовыми полями, за исключением, что type будет не text , а file (так как мы грузим файлы) и в самой форме добавится атрибут enctype="multipart/form-data" . Entype определяет вид кодировки, которую браузер применяет к параметрам формы.
Демо: Загрузка файлов на сервер
Форму загрузки файлов мы сделали, самое время написать простой обработчик для загрузки файлов на сервер. Определим сразу, что грузить будем только графические файлы с типом jpeg , png , gif . После того как мы определили типы файлов для загрузки на сервер, нам нужно создать папку на самом сервере, куда мы будем складывать наши файлы. В моем примере это папка image, в нее мы будем складывать наши файлы.
"Ошибок не возникло, файл был успешно загружен на сервер. ",
1 => "Размер принятого файла превысил максимально допустимый размер, который задан директивой upload_max_filesize конфигурационного файла php.ini.",
2 => "Размер загружаемого файла превысил значение MAX_FILE_SIZE, указанное в HTML-форме.",
3 => "Загружаемый файл был получен только частично.",
4 => "Файл не был загружен.",
6 => "Отсутствует временная папка. Добавлено в PHP 4.3.10 и PHP 5.0.3.");
//Определяем типы файлов для загрузки
$fileTypes = array("jpg" => "image/jpeg",
"png" => "image/png",
"gif" => "image/gif");
//Если нажата кнопка загрузить
if(isset($_POST["upload"]))
{
//Проверяем пустые данные или нет
if(!empty($_FILES))
{
//Проверяем на ошибки
if($_FILES["files"]["error"] > 0)
$err = $errUpload[$_FILES["files"]["error"]];
//Проверям тип файла для загрузки
if(!in_array($_FILES["files"]["type"], $fileTypes))
$err = "Данный тип файла ". $_FILES["files"]["type"] ." не подходит для загрузки!";
//Если нет ошибок то грузим файл
if(empty($err))
{
$type = pathinfo($_FILES["files"]["name"]);
$name = $uploadDir ."/". uniqid("files_") .".". $type["extension"];
move_uploaded_file($_FILES["files"]["tmp_name"],$name);
//Сбрасываем POST параметры
header("Location: http://". $_SERVER["HTTP_HOST"] ."/less/uploads/uploads.php?name=". $name);
exit;
}
else
echo implode("
", $err);
}
}
//Сообщение об успешной загрузке файла на сервер
if(isset($_GET["name"]))
echo "
Файл ". htmlentities($_GET["name"]) ." успешно загружен!
"; //Выводим картинки из каталога $imgDir = array_values(array_diff(scandir($uploadDir), array("..", "."))); for($i = 0; $i < count($imgDir); $i++) { if($i % 2 == 0) echo ""."\n"; echo "
"."\n"; echo " http://". $_SERVER["HTTP_HOST"] ." "; ?>
После того как мы написали код, проверили что все работает, новичок может столкнутся с проблемой загрузки больших файлов. Для это нужно поправить настройки в PHP.INI
; Максимальное время выполнения каждого скрипта в секундах max_execution_time = 3000 ; Максимальная количество времени каждый сценарий может потратить разбора запроса данных max_input_time = 400 ; Максимальный объем памяти, скрипт может потреблять (8 МБ) memory_limit = 500M ; Максимальный размер данных POST, что PHP будет принимать. post_max_size = 500M ; Максимально допустимый размер для загружаемых файлов. upload_max_filesize = 200M
Но в начале я бы хотел сказать пару слов о том, как же происходит загрузка файлов.
Для этого нам понадобится html форма с полем ввода типа . Кроме того, для передачи файлов на сервер необходимо форме установить тип multipart . Для этого в качестве параметра enctype указывается значение multipart/form-data .
После того, как на html страничке мы разместим форму с полем в окне браузера отобразится поле с возможностью выбрать файл на локальном компьютере.
После того, как пользователь выберет нужный файл и нажмет кнопку «Загрузить» форма передаст данные php скрипту на сервер, который указан в action формы. Если action формы пустой, то данные будут переданы тому же файлу, на котором находится форма. Вся информация о загружаемом файле помещается в массив $ _FILES . Нам лишь остается извлечь эту информацию и переместить файл в необходимое нам место.
Прежде, чем приступить к написанию скрипта обработки multipart-формы , нужно отредактировать файл конфигурации php.ini , чтобы разрешить загрузку файлов на сервер.
Конфигурационный файл PHP php.ini имеет три параметра, связанные с загрузкой файлов на сервер:
- file_uploads = On - разрешает загрузку файлов на сервер по протоколу HTTP;
- upoad_tmp_dir = /tmp - устанавливает каталог для временного хранения загруженных файлов;
- upload_max_filesize = 2M - устанавливает максимальный объем загружаемых файлов.
Итак, создайте новый файл с именем upload.php и скопируйте в него следующий код.