METANIT.COM

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 ] )

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

Читайте также:  Обычно разрешается только одно использование адреса сокета протокол сетевой адрес порт python

Источник

File php для форм

Чтобы загрузить файл на сервер, нам надо использовать форму с параметром enctype=»multipart/form-data» и массив $_FILES . Итак, создадим файл upload.php со следующим содержимым:

      ?> 

Загрузка файла

Выберите файл:

Здесь определена форм с атрибутом enctype=»multipart/form-data» . Форма содержит специальное поле для выбора файла.

Все загружаемые файлы попадают в ассоциативный массив $_FILES . Чтобы определить, а есть ли вообще загруженные файлы, можно использовать конструкцию if: if ($_FILES)

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

Так как элемент для загрузки файла на форме имеет name=»filename» , то данный файл мы можем получить с помощью выражения $_FILES[«filename»] .

У каждого объекта файла есть свои параметры, которые мы можем получить:

  • $_FILES[«file»][«name»] : имя файла
  • $_FILES[«file»][«type»] : тип содержимого файла, например, image/jpeg
  • $_FILES[«file»][«size»] : размер файла в байтах
  • $_FILES[«file»][«tmp_name»] : имя временного файла, сохраненного на сервере
  • $_FILES[«file»][«error»] : код ошибки при загрузке

Также мы можем проверить наличие ошибок при загрузке. Если у нас нет ошибки, то поле $_FILES[«filename»][«error»] содержит значение UPLOAD_ERR_OK .

При отправке файла на сервер он сначала загружается во временное место, из которого затем с помощью функции move_uploaded_file() он перемещается в каталог сервера, где расположен скрипт «upload.php».

Загрузка файлов на сервер в PHP

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

if ($_FILES && $_FILES["filename"]["error"]== UPLOAD_ERR_OK) < $name = "upload/" . $_FILES["filename"]["name"]; move_uploaded_file($_FILES["filename"]["tmp_name"], $name); echo "Файл загружен"; >

Функция move_uploaded_file() принимает два параметра путь к загруженному временному файлу и путь, куда надо поместить загруженный файл.

Ограничения и настройка загрузки

По умолчанию размер загружаемых файлов ограничен 2 мб. Однако можно настроить данный показатель в файле конфигурации. Изменим этот показатель, например, до 10 мб. Для этого найдем в файле php.ini следующую строку:

Также мы можем настроить папку для временных загружаемых файлов. Для этого в файле php.ini найдем следующую строку:

upload_tmp_dir = "C:/php/upload"

Также в каталоге php нам надо создать папку upload .

Мультизагрузка

Изменим скрипт upload.php так, чтобы он поддерживал множественную загрузку:

      $error) < if ($error == UPLOAD_ERR_OK) < $tmp_name = $_FILES["uploads"]["tmp_name"][$key]; $name = $_FILES["uploads"]["name"][$key]; move_uploaded_file($tmp_name, "$name"); >> echo "Файлы загружены"; > ?> 

Загрузка файла




Каждое поле выбора файла имеет атрибут name=»uploads[]» , поэтому сервер будет рассматривать набор отправленных файлов как единый массив.

Затем используя цикл foreach , проходим по все файлам и сохраняем их в каталог веб-сайта.

Читайте также:  HTML код в одну строку

Источник

Загрузка файлов методом POST

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

PHP способен получать загруженные файлы из любого браузера, совместимого со стандартом RFC-1867.

Замечание: Смежные замечания по конфигурации

Также ознакомьтесь с описанием директив file_uploads, upload_max_filesize, upload_tmp_dir, post_max_size и max_input_time конфигурационного файла php.ini

Также следует заметить, что PHP поддерживает загрузку файлов методом PUT, который используется в клиентах Netscape Composer и W3C Amaya . Для получения более детальной документации обратитесь к разделу поддержка метода PUT

Пример #1 Форма для загрузки файлов

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

В приведенном выше примере __URL__ необходимо заменить ссылкой на PHP-скрипт.

Скрытое поле MAX_FILE_SIZE (значение необходимо указывать в байтах) должно предшествовать полю для выбора файла, и его значение является максимально допустимым размером принимаемого файла в PHP. Рекомендуется всегда использовать эту переменную, так как она предотвращает тревожное ожидание пользователей при передаче огромных файлов, только для того, чтобы узнать, что файл слишком большой и передача фактически не состоялась. Помните, обойти это ограничение на стороне браузера достаточно просто, следовательно, вы не должны полагаться на то, что все файлы большего размера будут блокированы при помощи этой возможности. Это по большей части удобная возможность для пользователей клиентской части вашего приложения. Тем не менее, настройки PHP (на сервере) касательно максимального размера обойти невозможно.

Замечание:

Также следует убедиться, что в атрибутах формы вы указали enctype=»multipart/form-data», в противном случае загрузка файлов на сервер выполняться не будет.

Глобальный массив $_FILES содержит всю информацию о загруженных файлах. Его содержимое для нашего примера приводится ниже. Обратите внимание, что здесь предполагается использование имени userfile для поля выбора файла, как и в приведенном выше примере. На самом деле имя поля может быть любым. $_FILES[‘userfile’][‘name’]

Оригинальное имя файла на компьютере клиента.

Mime-тип файла, в случае, если браузер предоставил такую информацию. Пример: «image/gif». Этот mime-тип не проверяется в PHP, так что не полагайтесь на его значение без проверки.

Размер в байтах принятого файла.

Временное имя, с которым принятый файл был сохранен на сервере.

Код ошибки, которая может возникнуть при загрузке файла.

По умолчанию принятые файлы сохраняются на сервере в стандартной временной папке до тех пор, пока не будет задана другая директория при помощи директивы upload_tmp_dir конфигурационного файла php.ini . Директорию сервера по умолчанию можно сменить, установив переменную TMPDIR для окружения, в котором выполняется PHP. Установка этой переменной при помощи функции putenv() внутри PHP-скрипта работать не будет. Эта переменная окружения также может использоваться для того, чтобы удостовериться, что другие операции также работают с принятыми файлами.

Читайте также:  Python sqlite where like

Пример #2 Проверка загружаемых на сервер файлов

Для получения более детальной информации вы можете ознакомиться с описанием функций is_uploaded_file() и move_uploaded_file() . Следующий пример принимает и обрабатывает загруженный при помощи формы файл.

// В PHP 4.1.0 и более ранних версиях следует использовать $HTTP_POST_FILES
// вместо $_FILES.

$uploaddir = ‘/var/www/uploads/’ ;
$uploadfile = $uploaddir . basename ( $_FILES [ ‘userfile’ ][ ‘name’ ]);

echo » ;
if ( move_uploaded_file ( $_FILES [ ‘userfile’ ][ ‘tmp_name’ ], $uploadfile )) echo «Файл корректен и был успешно загружен.\n» ;
> else echo «Возможная атака с помощью файловой загрузки!\n» ;
>

echo ‘Некоторая отладочная информация:’ ;
print_r ( $_FILES );

PHP-скрипт, принимающий загруженный файл, должен реализовывать логику, необходимую для определения дальнейших действий над принятым файлом. Например, вы можете проверить переменную $_FILES[‘userfile’][‘size’] , чтобы отсечь слишком большие или слишком маленькие файлы. Также вы можете использовать переменную $_FILES[‘userfile’][‘type’] для исключения файлов, которые не удовлетворяют критерию касательно типа файла, однако, принимайте во внимание, что это поле полностью контролируется клиентом, используйте его только в качестве первой из серии проверок. Также вы можете использовать $_FILES[‘userfile’][‘error’] и коды ошибок при реализации вашей логики. Независимо от того, какую модель поведения вы выбрали, вы должны удалить файл из временной папки или переместить его в другую директорию.

В случае, если при отправке формы файл выбран не был, PHP установит переменную $_FILES[‘userfile’][‘size’] значением 0, а переменную $_FILES[‘userfile’][‘tmp_name’] — пустой строкой. none.

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

Пример #3 Загрузка массива файлов

PHP поддерживает возможность передачи массива из HTML в том числе и с файлами.

foreach ( $_FILES [ «pictures» ][ «error» ] as $key => $error ) if ( $error == UPLOAD_ERR_OK ) $tmp_name = $_FILES [ «pictures» ][ «tmp_name» ][ $key ];
$name = $_FILES [ «pictures» ][ «name» ][ $key ];
move_uploaded_file ( $tmp_name , «data/ $name » );
>
>
?>

Полоса прогресса загрузки файлов может быть реализована с помощью «отслеживания прогресса загрузки файлов с помощью сессий».

Источник

Оцените статью