Что такое $_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 ) )
То есть, для каждого поля <input type=”file” name=”inputfile“/> в массиве создается элемент. Если вы создадите <input type=”file” name=”test”>, то название элемента также будет изменено на 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: размер загруженного файла в байтах.
Загрузка файлов на сайт с помощью AJAX
Если добавить возможности JavaScript, форму можно сделать полезнее и красивее. Например, можно будет загружать файлы через AJAX, а также добавить анимацию при перетаскивании:
Сначала поле передается в объект fileDrop, а затем создаются функции dragOver, dragOut, showMessage и closeMessage: первые две меняют рамку для тега <input>, а вторые показывают и скрывают сообщение. Затем создается функция uploadFile, которая отправляет файл через AJAX.
Функция получает файлы с помощью объекта FormData, затем показывает сообщение, что началась загрузка, и начинает отправлять файл.
Из-за измененного способа передачи структура супермассива $_FILES немного меняется: теперь сначала указывается индекс файла, а потом — необходимая ячейка.
Вот как работает загрузка файлов на AJAX:
Как создать файл и записать в него данные в PHP
Чтобы начать работать с файлом, операционной системе надо выделить дескриптор (описатель). Также надо указать что вы собираетесь делать с файлом, т.е. выбрать режим работы.
<?php
//создали/очистили файл и открыли его для записи
$handler = fopen($filename, «w»);
?>
1 |
<?php $handler=fopen($filename,»w»); ?> |
Режим «w» — (writting), позволит только записывать в файл. Если файл не существует, то он будет создан, если он уже есть — то он будет обнулен.
Если вам не нужно очищать содержимое файла, то используйте режим «w+», который будет аналогичен использованию флага FILE_APPEND. При этом дескриптор позволит как запись так и чтение данных из файла.
<?php
//открыли файл для записи данных в конец файла
$handler = fopen($filename, «w+»);
?>
1 |
<?php $handler=fopen($filename,»w+»); ?> |
Итак, дескриптор файла создан. Теперь запишем данные.
<?php
fwrite($handler, $text);
?>
1 |
<?php fwrite($handler,$text); ?> |
Мы можем продолжить использовать открытый дескриптор и далее, дописывая данные. При окончании работы скрипта — он автоматически будет освобожден. Можно освободить его и раньше.
<?php
//закрыли файл
fclose($handler);
?>
1 |
<?php fclose($handler); ?> |
Что насчет монопольного доступа к файлу? Аналогично действию флага LOCK_EX мы можем выполнить блокировку следующим образом:
//включаем блокировку
if (flock($handler, LOCK_EX)) {
fwrite($handler, $text);
//сняли блокировку
flock($handler, LOCK_UN);
} else {
//блокировку выполнить не удалось
echo «Не могу выполнить блокировку!»;
}
1 |
//включаем блокировку if(flock($handler,LOCK_EX)){ fwrite($handler,$text); //сняли блокировку flock($handler,LOCK_UN); }else{ //блокировку выполнить не удалось echo»Не могу выполнить блокировку!»; } |
Чтение данных из файла выполняет функция fread();
<?php
//открыли файл
$handler = fopen($filename, «w+»);
//записали данные
fwrite($handler, $text);
…
//чтобы записать данные реально на диск, нужно либо
//закрыть файл или выполнить ф-цию fflush()
fflush($handler);
//переместили указатель файла в самое начало
fseek($handler, 0);
//читаем все данные из файла
$text = fread($handler, filesize($filename));
//завершили работу с файлом
fclose($handler);
?>
1 |
<?php $handler=fopen($filename,»w+»); //записали данные fwrite($handler,$text); … //чтобы записать данные реально на диск, нужно либо fflush($handler); //переместили указатель файла в самое начало fseek($handler,); //читаем все данные из файла $text=fread($handler, filesize($filename)); //завершили работу с файлом fclose($handler); ?> |
Проверяем расширение загружаемого файла
Ещё необходимо проверить то, что у загружаемого файла корректное расширение. Например, если мы хотим чтобы через форму загружали только картинки, то допустимыми расширениями для нас будут .jpg, .gif, .png.
Если этого не предусмотреть – то через форму загрузки можно будет загрузить какой-нибудь вредоносный скрипт. Представьте, что кто-то загрузил на сервер .php-скрипт, который удаляет все файлы в текущей директории, а затем просто запустил его, зайдя по адресу http://myproject.loc/uploads/very_bad_script.php. И это еще не самое страшное, что могут сделать злобные хакеры. Поэтому нужно всегда контролировать то, что пользователи загружают на сервер.
Получить расширение файла можно при помощи функции pathinfo(). Первым аргументом передаётся путь до файла, вторым – константа PATHINFO_EXTENSION.
В переменной $extension после это будет строка c расширением загруженного файла, например, png.
Нам остаётся только проверить, что расширение загружаемого файла находится в списке разрешенных. Давайте создадим массив со списком таких расширений и проверим наличие расширения загружаемого файла в списке разрешенных.
Теперь, если вы попробуете загрузить файл с каким-то другим расширением, то скрипт на нас ругнётся.
Отправка файлов на сервер
Последнее обновление: 17.03.2021
Чтобы загрузить файл на сервер, нам надо использовать форму с параметром и массив .
Итак, создадим файл upload.php со следующим содержимым:
<!DOCTYPE html> <html> <head> <title>METANIT.COM</title> <meta charset="utf-8" /> </head> <body> <?php if ($_FILES && $_FILES== UPLOAD_ERR_OK) { $name = $_FILES; move_uploaded_file($_FILES, $name); echo "Файл загружен"; } ?> <h2>Загрузка файла</h2> <form method="post" enctype="multipart/form-data"> Выберите файл: <input type="file" name="filename" size="10" /><br /><br /> <input type="submit" value="Загрузить" /> </form> </body> </html>
Здесь определена форм с атрибутом . Форма содержит специальное поле для выбора файла.
Все загружаемые файлы попадают в ассоциативный массив $_FILES. Чтобы определить, а есть ли вообще загруженные файлы, можно использовать
конструкцию if:
Массив $_FILES является двухмерным. Мы можем загрузить набор файлов, и каждый загруженный файл можно получить по ключу, который совпадает со значением
атрибута .
Так как элемент для загрузки файла на форме имеет , то данный файл мы можем получить с помощью выражения .
У каждого объекта файла есть свои параметры, которые мы можем получить:
-
: имя файла
-
: тип содержимого файла, например,
-
: размер файла в байтах
-
: имя временного файла, сохраненного на сервере
-
: код ошибки при загрузке
Также мы можем проверить наличие ошибок при загрузке. Если у нас нет ошибки, то поле содержит значение .
При отправке файла на сервер он сначала загружается во временное место, из которого затем с помощью функции move_uploaded_file()
он перемещается в каталог сервера, где расположен скрипт «upload.php».
Также мы можем указать другой путь, например, допустим, на сервере есть папка «upload», тогда, чтобы загружать в нее файлы, необходимо указать
соответствующий путь:
if ($_FILES && $_FILES== UPLOAD_ERR_OK) { $name = "upload/" . $_FILES; move_uploaded_file($_FILES, $name); echo "Файл загружен"; }
Функция принимает два параметра путь к загруженному временному файлу и путь, куда надо поместить загруженный файл.
Ограничения и настройка загрузки
По умолчанию размер загружаемых файлов ограничен 2 мб. Однако можно настроить данный показатель в файле конфигурации. Изменим этот показатель, например,
до 10 мб. Для этого найдем в файле php.ini следующую строку:
upload_max_filesize = 2M
Изменим ее на
upload_max_filesize = 10M
Также мы можем настроить папку для временных загружаемых файлов. Для этого в файле php.ini найдем следующую строку:
;upload_tmp_dir =
Изменим ее на
upload_tmp_dir = "C:/php/upload"
Также в каталоге php нам надо создать папку upload.
Мультизагрузка
Изменим скрипт upload.php так, чтобы он поддерживал множественную загрузку:
<!DOCTYPE html> <html> <head> <title>METANIT.COM</title> <meta charset="utf-8" /> </head> <body> <?php if($_FILES) { foreach ($_FILES as $key => $error) { if ($error == UPLOAD_ERR_OK) { $tmp_name = $_FILES; $name = $_FILES; move_uploaded_file($tmp_name, "$name"); } } echo "Файлы загружены"; } ?> <h2>Загрузка файла</h2> <form method="post" enctype="multipart/form-data"> <input type="file" name="uploads[]" /><br /> <input type="file" name="uploads[]" /><br /> <input type="file" name="uploads[]" /><br /> <input type="submit" value="Загрузить" /> </form> </body> </html>
Каждое поле выбора файла имеет атрибут , поэтому сервер будет рассматривать набор отправленных файлов как единый массив.
Затем используя цикл , проходим по все файлам и сохраняем их в каталог веб-сайта.
НазадВперед
Настройка параметров PHP
Существует несколько настроек конфигурации PHP, которые вам следует предварительно проверить для успешной загрузки файлов. В этом разделе мы рассмотрим все параметры, которые важны для загрузки файлов PHP. Эти параметры можно настроить в файле php.ini.
Если вы не знаете, где найти файл php.ini, вы можете использовать , чтобы найти его. Просто создайте файл PHP на своем сервере со следующей строкой и откройте его из браузера.
Вот выдержка из установочного файла с некоторыми полезными значениями по умолчанию.
Ключевые настройки
Значение директивы должно быть установлено на , чтобы разрешить загрузку файлов. Значение по умолчанию для этой директивы — .
Директива позволяет вам настроить максимальный размер загруженного файла. По умолчанию он установлен в (два мегабайта), и вы можете переопределить этот параметр, используя файл .htaccess. Два мегабайта не очень соответствуют сегодняшним стандартам, поэтому вам, возможно, придется это увеличить. Если вы получите сообщение об ошибке — при попытке загрузить файл, вам необходимо увеличить это значение. Если вы это сделаете, обязательно увеличьте (см. ниже).
Устанавливает временный каталог, который будет использоваться для хранения загруженных файлов. В большинстве случаев вам не нужно беспокоиться об этой настройке. Если вы не установите его, будет использоваться системный временный каталог по умолчанию.
Директива позволяет настроить максимальный размер данных POST. Поскольку файлы загружаются с помощью POST-запросов, это значение должно быть больше, чем указано в директиве . Например, если ваш составляет (16 мегабайт), вам может потребоваться установить в .
Это позволяет вам установить максимальное количество файлов, которые могут быть загружены за раз. По умолчанию , разумное количество.
Это максимальное количество секунд, которое скрипту разрешено анализировать входные данные. Вы должны установить его на разумное значение, если вы имеете дело с большими загрузками файлов. (60 секунд) является хорошим показателем для большинства приложений.
Директива указывает максимальный объем памяти, который может потреблять скрипт. Если вы сталкиваетесь с проблемами при загрузке больших файлов, вам необходимо убедиться, что значение этой директивы больше, чем указано в директиве . Значение по умолчанию — (128 мегабайт), поэтому, если у вас нет очень больших и , вам не нужно беспокоиться об этом.
Это максимальное количество секунд, разрешенное для работы скрипта. Если вы сталкиваетесь с проблемами при загрузке больших файлов, вы можете рассмотреть возможность увеличения этого значения. (30 секунд) должны хорошо работать для большинства приложений.
Теперь давайте построим реальный пример, чтобы продемонстрировать загрузку файлов в PHP.
Дальнейшая обработка файла
Вы знаете где находится загруженный файл. Как можно работать с ним далее? Для этого PHP имеет богатый арсенал команд и расширений.
Если вы не переместите файл из временной папки, то сервер (в зависимости от настроек) рано или поздно удалит временный файл. Он гарантированно будет находится во временной папке лишь до окончания работы PHP скрипта.
По этой причине необходимо произвести обработку файла до выхода из программы.
Сохранить файл на сервере
В зависимости от архитектуры и целей вашей программы, одной из задач может быть сохранение файла на сервере. Для этого его нужно переместить из временной папки в какое то другое место.
Копируем файл:
Перемещаем файл:
В обоих случаях вы должны указать путь, куда скопировать файл. При этом каталог должен быть создан заранее, а права, выданные на папку, позволять вам записать файл в неё.
Пример использования:
If (!empty($_FILES) && !$_FILES) {
$destination = ‘/var/www/mysite/uploads/newPicture.jpg’;
if (rename($_FILES, $destination)) {
// файл был успешно перемещен
} else {
// ошибка при переносе файла
}
}
1 |
If(!empty($_FILES’myfile’)&& !$_FILES) { $destination = ‘/var/www/mysite/uploads/newPicture.jpg’; if(rename($_FILES’myfile»tmp_name’,$destination)){ // файл был успешно перемещен }else{ // ошибка при переносе файла } } |
В целом, работа с внешними файлами — серьезный источник разного рода уязвимостей. Потому, как настройка сервера, так и проверка загружаемых файлов требует тщательного подхода.
Специально для загружаемых файлов PHP также предлагает специальную команду:
Данная команда позволяет убедиться, что указанный filename был получен именно через HTTP POST механизм, а не каким либо другим способом. Если файл получен именно так, то производится перемещение.
PHP Полная загрузка файла скрипта
Полный файл «upload.php» выглядит так:
<?php$target_dir = «uploads/»;$target_file = $target_dir . basename($_FILES);$uploadOk = 1;$imageFileType =
strtolower(pathinfo($target_file,PATHINFO_EXTENSION));// Проверьте, является ли файл изображения фактическим изображением или поддельным изображениемif(isset($_POST)) { $check = getimagesize($_FILES); if($check !== false) { echo «Файл является изображением — » . $check . «.»; $uploadOk = 1; } else { echo «Файл не является изображением.»; $uploadOk = 0; }}// Проверить, существует ли файлif (file_exists($target_file)) { echo «Извините, файл уже существует.»; $uploadOk = 0;}
// Проверить размер файлаif ($_FILES > 500000) { echo «Извините, ваш файл слишком большой.»; $uploadOk = 0;
}// Разрешить определенные форматы файловif($imageFileType != «jpg» && $imageFileType != «png» && $imageFileType != «jpeg»&& $imageFileType != «gif» ) { echo «Извините, разрешено только файлы JPG, JPEG, PNG и GIF.»; $uploadOk = 0;}// Проверьте, имеет ли $uploadOk значение 0 по ошибкеif ($uploadOk == 0) { echo «Извините, ваш файл не был загружен.»;// если все в порядке, попробуйте загрузить файл} else { if (move_uploaded_file($_FILES, $target_file)) { echo «Файл «. basename( $_FILES). » был загружен.»; } else { echo «К сожалению, произошла ошибка при загрузке файла.»; }}?>
Логика загрузки
В предыдущем разделе мы создали форму HTML, которая отображается на стороне клиента и позволяет загружать файл с вашего компьютера. В этом разделе мы увидим серверную часть кода, которая позволяет обрабатывать загруженный файл.
Загрузите код из файла upload.php на GitHub. Мы рассмотрим важные части этого файла.
В файле upload.php мы проверили, действительно ли это валидный запрос POST.
В PHP, когда файл загружается, суперглобальная переменная заполняется всей информацией о загруженном файле. Она инициализируется как массив и может содержать следующую информацию для успешной загрузки файла.
- : Временный путь, в который загружается файл, сохраняется в этой переменной.
- : Фактическое имя файла сохраняется в этой переменной.
- : Указывает размер загруженного файла в байтах.
- : Содержит mime тип загруженного файла.
- : Если во время загрузки файла была ошибка, эта переменная заполняется соответствующим сообщением об ошибке. В случае успешной загрузки файла она содержит значение 0, которое можно сравнить с помощью константы .
После проверки запроса POST мы проверяем, что загрузка файла прошла успешно.
Вы можете видеть, что переменная является многомерным массивом, первый элемент — это имя поля файла, а второй элемент содержит информацию о загруженном файле, как мы уже говорили выше.
Если загрузка файла прошла успешно, мы инициализируем несколько переменных с информацией о загруженном файле.
В приведенном выше коде мы также выяснили расширение загруженного файла и сохранили его в переменной .
Поскольку загруженный файл может содержать пробелы и другие специальные символы, лучше очистить имя файла, и это именно то, что мы сделали в следующем шаге.
Важно, чтобы вы ограничивали тип файла, который может быть загружен на определенные расширения, и не разрешали все. Мы это сделали, проверив расширение загруженного файла с помощью набора расширений, который мы хотим разрешить для загрузки
Наконец, мы используем функцию для перемещения загруженного файла в определенное место по нашему выбору.
Функция принимает два аргумента. Первым аргументом является имя файла загруженного файла, а второй аргумент — путь назначения, в который вы хотите переместить файл.
Наконец, мы перенаправляем пользователя в файл index.php. Кроме того, мы устанавливаем соответствующее сообщение в переменной сессии, которое будет отображаться пользователям после перенаправления в файле index.php.
Загрузка файлов на PHP
Начать следует с создания формы:
Для тега <form> мы указываются следующие атрибуты:
- method — метод отправки данных (в нашем случае post);
- action — путь к обработчику;
- ectype — тип формы; ult значение multipart/form-data дает браузеру понять, что с ее помощью будут отправляться сразу несколько файлов.
Далее в форме создается скрытое поле MAX_FILE_SIZE , где указан максимальный объем загружаемых файлов в байтах. Поле должно предшествовать самому полю для выбора файлов. Это нужно для того, чтобы пользователь узнал, что превысил допустимый лимит на размер файла до того, как дождется загрузки 200-мегабайтного ролика. Но основная проверка все равно должна проводиться обработчиком, потому что значение этого поля можно изменить в браузере.
Во второй тег <input> добавляется атрибут multiple и имя file[] — это позволит с помощью одного поля загрузить сразу несколько файлов. Также в коде присутствует div, в который позже будет выводиться сообщение.
Далее указываются стили CSS:
И вот как это выглядит:
Форма уже функционирует: можно выбирать или перетаскивать файлы, а после нажатия на кнопку «Загрузить» данные отправятся в обработчик. Там они попадают в многомерный супермассив $_FILES. Его структура выглядит так:
- имя поля, через которое загружен файл;
- name — имя загружаемого файла;
- type — тип в формате MIME-type;
- size — объем в байтах;
- tmp_name — временный адрес;
- error — номер ошибки, если она произошла.
Если через одно поле загружается сразу несколько файлов, то получение доступа к какому-то конкретному происходит следующим образом: $_FILES — индекс файла находится в самом конце.
Сначала нужно провести несколько проверок, и только потом перемещать файлы из временного хранилища непосредственно на сайт. Иначе может получиться так, что взломщики загрузят на сайт PHP-файлы и смогут их запустить, чтобы получить доступ к базе данных или к файловой системе сервера.
Вот как выглядит обработчик:
Если загрузка прошла успешно, создается массив разрешенных типов, по которому проверяется соответствие форматов. Затем, если валидация пройдена, с помощью функции move_uploaded_file файл перемещается из временного хранилища в указанную директорию.
Такой код хоть и работает, но он довольно примитивен и его нужно расширять:
- удалить из названия специальные символы и пробелы, а в идеале вообще задать имя самостоятельно;
- занести информацию в базу данных;
- проверить размер файла;
- если это изображение — его можно сжать и так далее.
В общем, стоит провести несколько дополнительных проверок, чтобы файлы не представляли угрозу для сайта и не валялись без дела.
Запись данных в файл в PHP
Один из самых простых способов записи данных в файл в PHP — с помощью функции .
Параметр определяет файл, в котором будут записываться данные. Второй параметр — это данные, которые вы хотите записать в файл. В большинстве случаев это будет строка, но она также может быть массивом или ресурсом потока.
Помните, что PHP автоматически создаст файл с заданным именем, если он еще не существует. Однако он не создаст для вас каких-либо каталогов. Это означает, что вы можете сохранить файл с именем On the Origin of Species .txt без каких-либо ошибок. Однако установка в Biology/Evolution/On Origin of Species .txt, если Biology/Evolution/ еще не существует, приведет к ошибке.
Параметр определяет, как содержимое будет записано в файл. Он может иметь любое или все из следующих трех значений:
- — Это указывает PHP на поиск имени файла в каталоге include.
- — Это скажет PHP, чтобы добавить данные, которые вы передали функции, к существующим данным в файле. Это может быть полезно, если вы храните данные в файле, таком как журнал или личный дневник. Запись новых данных, таких как температура или события, которые произошли с вами сегодня, не будет перезаписывать то, что вы записали вчера.
- — Это скажет PHP, чтобы получить блокировку файла, прежде чем начинать писать в него содержимое. Это может предотвратить непредвиденные события, когда два разных сценария читают или записывают данные в один и тот же файл. С этим конкретным значением вы получите эксклюзивную блокировку файла. Вы можете узнать больше об этих блокировках в документации PHP о функции .
Эта функция возвращает количество байтов, которые были записаны в файл с успехом, и при ошибке. Тем не менее, вы все равно должны использовать строгий оператор равенства, чтобы проверить, было ли успешным запись содержимого в файл. Это потому, что код, который записывает 0 байтов в файл, будет по-прежнему оцениваться как false.
Как записать в файл массив или объект?
Для этого можно воспользоваться той же самой функцией записи текста, но предварительно массив или объект должны быть сериализованы, т.е. преобразованы в текстовый вид. После загрузки данных необходимо будет выполнить обратную операцию — восстановить массив из строки — десериализовать.
<?php
//это наш массив (или объект)
$arr = array(1,2,3);
…
$filename = ‘somefile.txt’;
$text = serialize($arr); //сериализация
//записываем текст в файл
file_put_contents($filename, $text);
…
//потом его можно прочитать из файла
$text = file_get_contents($filename);
//восстановить массив из текстового представления
$arr = unserialize($text);
?>
1 |
<?php $arr=array(1,2,3); … $filename=’somefile.txt’; $text=serialize($arr);//сериализация //записываем текст в файл file_put_contents($filename,$text); … //потом его можно прочитать из файла $text=file_get_contents($filename); //восстановить массив из текстового представления $arr=unserialize($text); ?> |
Функция file_put_contents() идентична последовательному вызову функций — fopen(), fwrite(), fclose(). Рассмотрим их как второй вариант записи в файл на PHP.
Простая загрузка файлов на сайт при помощи PHP
Вам не составит труда написать собственный PHP-скрипт для загрузки файлов на сервер. Прежде всего, нужно создать HTML-форму с полем file input. Затем привязать к ней PHP-скрипт, который переместит файл в указанную директорию. Чтобы закачать файл на сервер с помощью PHP-скрипта, выполните следующие действия:
Создайте простую HTML-форму: потребуется простая форма с возможностью указания файла. Она размещается в файле basic.php:
<html> <head> <title>Basic File Upload</title> </head> <body> <h1>Basic File Upload</h1> <form method="post" action="basic.php" enctype="multipart/form-data"> <label for="inputfile">Upload File</label> <input type="file" id="inputfile" name="inputfile"></br> <input type="submit" value="Click To Upload"> </form> </body> </html>
Приведенный выше код необходим для создания формы. Как только пользователь выбирает файл и нажимает кнопку Upload, форма передаст данные с помощью метода POST на этой же странице, так как в качестве обработчика указан файл basic.php:
Важно: не забудьте добавить enctype=”multipart/form-data” в тег
Создаем PHP-скрипт для обработки формы загрузки. В PHP вся информация о загруженных файлах содержится в глобальной переменной $_FILES. То есть, используя $_FILES, можно проверить, был ли загружен файл. Если файл был загружен, то можно переместить его в нужную директорию при помощи функции move_uploaded_file PHP:
<?php if(isset($_FILES) && $_FILES == 0){ // Проверяем, загрузил ли пользователь файл $destiation_dir = dirname(__FILE__) .'/'.$_FILES; // Директория для размещения файла move_uploaded_file($_FILES, $destiation_dir ); // Перемещаем файл в желаемую директорию echo 'File Uploaded'; // Оповещаем пользователя об успешной загрузке файла } else{ echo 'No File Uploaded'; // Оповещаем пользователя о том, что файл не был загружен } ?>
Приведенный выше код проверяет, загрузил ли пользователь файл. Если файл загружен, то мы перемещаем файл в указанную директорию. В приведенном выше скрипте мы перемещаем файл в ту же папку, где находится файл basic.php.
Ниже приведена полная версия PHP move uploaded file примера:
<?php if(isset($_FILES) && $_FILES == 0){ // Проверяем, загрузил ли пользователь файл $destiation_dir = dirname(__FILE__) .'/'.$_FILES; // Директория для размещения файла move_uploaded_file($_FILES, $destiation_dir ); // Перемещаем файл в желаемую директорию echo 'File Uploaded'; // Оповещаем пользователя об успешной загрузке файла } else{ echo 'No File Uploaded'; // Оповещаем пользователя о том, что файл не был загружен } ?> <html> <head> <title>Basic File Upload</title> </head> <body> <h1>Basic File Upload</h1> <form method="post" action="basic.php" enctype="multipart/form-data"> <label for="inputfile">Upload File</label> <input type="file" id="inputfile" name="inputfile"></br> <input type="submit" value="Click To Upload"> </form> </body> </html>
Пожалуйста, не тестируйте этот PHP move uploaded file пример на сервере. Он не отвечает требованиям безопасности, и был создан специально для того, чтобы наглядно показать, как загружать файлы с помощью PHP.
Вопрос: Почему приведенный выше скрипт небезопасен?Ответ: С помощью скрипта, приведенного выше, можно загрузить файл любого типа на сервер. То есть, если вы используете скрипт в таком виде на “живом” сервере, то любой хакер сможет загрузить собственные PHP-скрипты, и взломать ваш сайт и сервер.
Чуть позже мы подробнее поговорим о защите скрипта для загрузки файлов на сервер.
Чтение и запись данных в файлы
Вы можете перейти на сайт Project Gutenberg и попытаться загрузить файлы с помощью функции . После того, как у вас есть данные в строке, вы также можете просто сохранить их в локальном файле с помощью функции . В следующем примере это будет ясно:
Вы также можете сохранить веб-страницы или контент с таких сайтов, как Википедия. Если вам нужно понять HTML или проанализировать содержимое HTML, которое вы только что сохранили локально, вы можете следовать руководству, например, Парсинг HTML на PHP с помощью DiDOM, что поможет вам автоматически получать ссылки, файлы изображений или любую другую такую информацию с веб-страницы.
Вернемся к локальным файлам. Подумайте о ситуации, когда у вас есть куча текстовых файлов, и вы хотите проанализировать их содержимое, чтобы увидеть такие вещи, как самые распространенные слова в них. Этого можно добиться легко, используя кучу встроенных функций PHP.
Мы преобразовали весь текст в нижний регистр и сделали предположение, что каждое слово разбивается на пробелы. Затем текст преобразуется в массив с помощью метода , чтобы упростить анализ отдельных слов. Удивительно, но слово «эволюция» не используется ни разу во всей книге, которая дала теорию эволюции ее происхождения.
Это был просто пример автоматического анализа большого количества текста. Вы можете сделать что-то подобное с любым типом текста, хранящегося в файле.
Логирование данных с помощью
Еще одним полезным примером может быть логирование информации в течение небольших периодов времени. Это может быть ваша тренировка, метеорологические данные или колония пчел, которую вы наблюдаете. После того, как у вас есть данные в строке, вы можете легко сохранить его в файле и добавить его к существующим данным, используя флаг с .
Подобный код можно использовать для чего-то вроде хранения ежедневной статьи в Википедии в файле каждый день или отслеживания новостных статей и заголовков в течение недель или месяцев. Все, что вам нужно сделать, это написать код, чтобы очистить данные, а затем сохранить их, используя что-то похожее на приведенный выше фрагмент кода. Учебник, подобный Парсингу HTML на PHP при помощи DiDOM может помочь вам.
Вместо того, чтобы писать текст в обычном формате, вы можете обернуть его в некоторый HTML, чтобы упростить чтение в браузерах. Возможности безграничны.
Создать PHP скрипт для загрузки файла
Файл «upload.html» содержит код для загрузки файла:
<?php$target_dir = «uploads/»;$target_file = $target_dir . basename($_FILES);$uploadOk = 1;$imageFileType =
strtolower(pathinfo($target_file,PATHINFO_EXTENSION));// Проверьте, является ли файл изображения фактическим изображением или поддельным изображениемif(isset($_POST)) { $check = getimagesize($_FILES); if($check !== false) { echo «Файл является изображением — » . $check . «.»; $uploadOk = 1; } else { echo «Файл не является изображением.»; $uploadOk = 0; }}?>
Объяснение PHP скрипта:
- $target_dir = «uploads/» — указывает каталог, в который будет помещен файл
- $target_file указывает путь к файлу для загрузки
- $uploadOk=1 еще не используется (будет использоваться позже)
- $imageFileType содержит расширение файла (в нижнем регистре)
- Затем проверьте, является ли файл изображения фактическим изображением или поддельным изображением.
Примечание: Вам нужно будет создать новый каталог с именем «uploads» в каталоге, где находится файл «upload.html». Загруженные файлы будут сохранены там.
Синтаксис
Первым параметром в контексте HTTP должен быть или (это значение по умолчанию, указывающее, что контент должен быть отображён внутри веб-страницы или как веб-страница) или (указывает на скачиваемый контент; большинство браузеров отображают диалог «Сохранить как» с заранее заполненным именем файла из параметра , если он задан).
Content-Disposition: inline Content-Disposition: attachment Content-Disposition: attachment; filename="filename.jpg"
Первым параметром в контексте HTTP всегда является ; дополнительные параметры регистронезависимые и могут иметь аргументы, значения которых следуют после знака и берутся в кавычки. Несколько параметров разделяются через точку с запятой ().
Content-Disposition: form-data Content-Disposition: form-data; name="fieldName" Content-Disposition: form-data; name="fieldName"; filename="filename.jpg"
- За параметром следует строка с именем HTML-поля на форме, к которому относится данная часть составного тела. При работе с несколькими файлами в том же самом поле (например, атрибуты элемента ), могут быть несколько частей с одинаковым именем.
Если имеет значение , указывающее, что данная часть не является HTML-полем, то она содержит кодировку по умолчанию для всех частей, в которых явно кодировка не указана. - За параметром указана строка с оригинальным именем передаваемого файла. Это имя опционально и не может слепо использоваться приложением: информация о пути должна быть очищена и должно быть сделано преобразование к файловой системе сервера. Этот параметр предоставляет в основном справочную информацию. Когда используется в комбинации с , это значение будет использовано как имя файла по умолчанию для диалога «Сохранить как».
- filename*
-
Оба параметра «filename» и «filename*» отличаются только тем, что «filename*» использует кодирование, определённое в RFC 5987. Когда присутствуют оба параметра «filename» и «filename*» в одном поле заголовке, то преимущество имеет «filename*» над «filename», но только в случае когда оба значения корректны.