Информационные технологииStfw.Ru 🔍

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

Управляющие функции
🕛 01.11.2006, 13:40
PHP способен осуществлять загрузку на сервер файлов, посланных браузерами, использующими стандарт RFC1867 (таковыми являются Netscape Navigator 3 и старше, Microsoft Internet Explorer 3 с обновлением или более поздние браузеры Microsoft). Файлы могут быть как двоичными, так и текстовыми. При этом бывает полезно г воспользоваться процедурой аутентификации и функциями файловой системы.

Также РНР поддерживает загрузку методом PUT, используемую программами Netscape Composer и Amaya (см. ниже).

Для загрузки файлов методом POST необходимо передать браузеру следующую форму:

«FORM ENCTYPE="multipart/form-data"
ACTION="get.php" METHOD=POST>
<INPUT TYPE="hidden" name=
"MAX_FHE_SIZE" value="1000">
Отослать файл; <INPUT NAME=
"userfile" TYPE="file">
<INPUT TYPE="subirnt"
="Послать">
</FORM>

Вместо значения атрибута ACTION «get.php» необходимо указать имя PHP-сценария, который будет принимать файл. В скрытом поле MAX_FILE_SIZE указывается максимальный размер файла (в байтах), который может быть послан, но он не может быть больше, чем определено в параметре конфигурации upload_max_filesize. При отображении данной формы браузер автоматически добавляет кнопку «Обзор...», при нажатии на которую появляется стандартное окно выбора файлов.

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

Array (
[userfile] => Array ( [name] ->
jshtm.zip [type] =>
application/x-zip-compressed
[tmp_name] => E:/Tmp\phpAE.tmp
[size] => 21344 ) [userfnle?] =>
Array (
[name] => tsrm.txt
[type] => text/plain
[tmp_name] => E:/Tmp\phpAF.tmp
[size] => 5483 ) )

userfile - это имя поля формы, в которое вводилось имя передаваемого файла. (В форме может присутствовать несколько таких полей типа «file», если необходимо передавать несколько файлов одновременно.) Соответственно массив будет содержать столько же подмассивов, сколько полей передачи файлов присутствовало в форме.

$HTTP_POST_FILES['userfne']['name'] - имя файла на клиентской машине (без пути к нему).
JHTTP_POST_FILES['userfile']['type'] - MIME тип файла, автоматически определяемый браузером.
$HTTP_POST_FILES['userfi1e']['size'] - размер файла и байтах.
$HTTP_POST_FILES['userfile']['tmp_name'] - имя временного файла, в котором был сохранен загруженный на сервер файл.
По умолчанию, если каталог не установлен параметром конфигурации upload_tmp_dir, загруженные файлы сохраняются в системном каталоге для временных файлов (определяется системной переменной окружения TMPDIR). Обычно загруженные файлы перемещаются из временного каталога в какой-либо специально для этого предназначенный, это может быть сделано с помощью функции move_ uploaded_file().

<?php
foreach ($HTTP_POST_FILES as $v) {
// здесь обычно проводится проверка
допустимости if(move_uploaded_file
($v['tmp_name'J.
"Е/Tmp/UpLoaded.Files/".$v['name']))
echo "Файл r$v[name]' (размером
$v[snze] байт)", был успешно загружен
<ВР>\n", } ?>

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

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

<input name="userfile[]" type="file">
<br>
<input name="userfile[]" type="file">
<br>
<input name="userfile[]" type-"file">
<br>

Тогда структура массива $HTTP_POST_FILES будет иметь другую форму:

Array (
[userfilo] => Array ( [name] =>
Array [0 - ...] [type] => Array
[0 - ..] [tmpjiame] => Array [0 - ... ]
[size] > Array [0 - . ] ))

В этом случае тип первого загруженного файла будет находиться в элементе $HTTP_POST_FILES["userfile"]["type"][0], а размер второго в $HnP_POST_FILES["userfile"]["size"][l].

Загрузка методом PUT

PHP также поддерживает загрузку HTTP PUT, используемую такими устаревшими приложениями, как Netscape Composer. Этот метод работает намного проще, в теле заголовка запроса HTTP передается строка:

PUT /path/filename html HTTP/1.1

Строка указывает, что сервер должен сохранить последующую часть запроса как файл под именем filename.html в каталоге web-сервера /path/. Едва ли такое решение является удачным - позволять любому клиенту сохранять произвольные файлы на сервере. Поэтому в конфигурации web-сервера следует указать, что запросы этого типа должен обрабатывать определенный сценарий. В сервере Apache для этого необходимо добавить директиву Script в его файл конфигурации. Обычно такая директива вносится в блок <Directory>, иногда - в блок <Virtualhost>. Например, в таком виде:

Script PUT /put.php

Эта директива указывает серверу, что все получаемые запросы типа PUT (соответствующие контексту, то есть адресованные определенному каталогу или виртуальному хосту) должны передаваться сценарию put.php (расположенному в корневом каталоге web-сервера). Внутри файла put.php можно указать следующую строку:

<?php copy
($PHPjmjILFNAME.IDOCUMENT_ROOT.
$REQUEST_URI); ?>

Тогда все загружаемые файлы будут копироваться в указанную в запросе директорию. Необходимо, конечно, предварительно проводить ряд проверок на допустимость подобной операции. Полученный файл сохраняется во временном файле, имя которого заносится в переменную SPHP_PUT_FILENAME. Адрес, по которому запрашивался файл, сохраняется в переменной $REQUEST_URI (для Apache). Так же как и для файлов POST, полученный файл удаляется по завершении, если он не был скопирован или перемещен.[/size][/size][/size]

Учебник по основам PHP   Теги:

Читать IT-новости в Telegram
Информационные технологии
Мы в соцсетях ✉