Полезное для программистов:

Фриланс
Новости
Статьи
   
Рубрики:


Закачка фаилов на сервер

Поиск:
Данная публикация любезно предоставлена Master

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


PНР способен осуществлять загрузку на сервер файлов, посланных браузерами, использующими стандарт RFC 1867 (таковыми являются 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_FILE_SIZE" value="1000" />
Отослать файл: <input name="userfile" type="file" />
<input type="submit" name="Послать" />
</form>


Вместо значения атрибута ACTION "get.php" необходимо указать имя РНР-сценария, который будет принимать файл. В скрытом поле MAX_FILE_SIZE указывается максимальный размер файла (в байтах), который может быть послан, но надо учитывать, что сопоставление размера фаила с MAX_FILE_SIZE происходит на стороне клиента, т.е. несложно будет обойти это ограничение. Тем не менее, директиву из конфигурации PHP upload_max_filesize не обойти. При отображении данной формы браузер автоматически добавляет кнопку "Обзор...", при нажатии на которую появляется стандартное окно выбора файлов.
Сценарий, который получает файл, может использовать глобальный массив $HTTP_POST_FILES для получения информации о том, что за файл был загружен. Обычно этот массив имеет следующую структуру:

Код
Array (
[userfile] => Array (
 [name] => jshtm.zip
 [type] => application/x-zlp-compressed
 [tmpjname] => E:/Tmp\phpAE.tmp
 [size] => 21344
)
[userfile2] => Array (
 [name] => tsrm.txt
 [type] => text/plain
 [tmpjiame] => E:/Tmp\phpAF.tmp
 [size] => 5483
)
)
  • userfile - это имя поля формы, в которое вводилось имя передаваемого файла. (В форме может присутствовать несколько таких полей типа "file", если необходимо передавать несколько файлов одновременно.) Соответственно массив будет содержать столько же подмассивов, сколько полей передачи файлов присутствовало в форме.
  • $HTTP_POST_FILES['userfile']['name'] - имя файла на клиентской машине (без пути к нему).
  • $HTTP_POST_FILES['userfile']['type'] - MIME тип файла, автоматически определяемый браузером.
  • $HTTP_POST_FILES['userfile']['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['tmpname'].
 "E:/Tmp/UpLoaded.Files/".$v['name']))
echo "Файл '$v[name]' (размером $v[size] байт)".
 " был успешно загружен<ВК>\n";
}
?>


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

Код
<input name="userfile[]" type="file"><br>
<input name="userfile[]" type="file"><br>
<input name="userfile[]" type="file"><br>


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

Код
Array (
[userfile] => Array (
 [name] => Array [0 - ...]
 [type] => Array [0 - ...]
 [tmp_name] => Array [0 - ... ]
 [size] => Array [0 - ... ]
)
)


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

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

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

PUT /path/filename.html HTTP/1.1

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

Код
Script PUT /put.php


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

Код
<?php copy($PHP_PUT_FILENAME.$DOCUMENT_ROOT.$REQUEST_URI); ?>


Тогда все загружаемые файлы будут копироваться в указанную в запросе директорию. Необходимо, конечно, предварительно проводить ряд проверок на допустимость подобной операции.
Полученный файл сохраняется во временном файле, имя которого заносится в переменную $PHP_PUT_FILENAME. Адрес, по которому запрашивался файл, сохраняется в переменной $REQUEST_URI (для Apache). Так же как и для файлов POST, полученный файл удаляется по завершении сценария, если он не был скопирован или перемещен.
Автор: MuToGeN
Сайт: http://mutogen.com.ru/






Просмотров: 6122

 

 

Новые статьи:


Популярные:
  1. Как сделать цикличным проигрывание MIDI-файла?
  2. Создание AVI файла из рисунков
  3. Как устройство "отключить в данной конфигурации"?
  4. Kто в данный момент присоединен через Сеть?
  5. Как узнать количество доступной памяти?
  6. Как реализовать в RichEdit разноцветный текст?
  7. Как скрыть свое приложение от ProcessViewer
  8. Как программно нажать/скрыть/показ кнопку "Start"?
  9. Модуль работы с ресурсами в PE файлах
10. Функции вызова диалоговых окон выбора
11. Проверка граматики средствами Word'а из Delphi.
12. Модуль для упрощенного вызова сообщений
13. Функции для записи и чтение своих данных в, ЕХЕ- файле
14. Рекурсивный просмотр директорий
15. Network Traffic Monitor
16. Разные модули
17. Универсальная функция для обращения к любым экспортируем функциям DLL
18. Библиотека от VladS
19. Протектор для UPX'а
20. Еще об ICQ, сообщения по контакт листу?
21. Использование открытых интерфейсов
22. Теория и практика использования RTTI
23. Работа с TApplication
24. Примеры использования Drag and Drop для различных визуальных компонентов
25. Что такое порт? Правила для работы с портами
26. Симфония на клавиатуре
27. Загрузка DLL
28. Исправление автоинкремента
29. Взаимодействие с чужими окнами
30. Проверить дубляжи в столбце


 

 

 
 
На главную