РНР 5 в подлиннике

Страница 494 из 554


Гпава 43. Загрузка файлов на сервер

999

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

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

Что же получится, если разрешить тегу <input type="fiie"> иметь параметр по умолчанию? Предположим, пользователь хранит все свои пароли в "засекреченном" файле C:\zionmainframe.codes. Тогда взломщик паролей может написать на JavaScript и встроить в страницу программу, которая создает и отправляет на "свой" сервер форму незаметно для пользователя. При этом достаточно, чтобы в форме присутствовало единственное поле закачки файла с проставленным параметром

value="C:\zionmainframe.codes".

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

Теперь вы понимаете, почему тег <input type="fiie"> не допускает использования

атрибута value?..

Поддержка закачки в РНР

Так как РНР специально разрабатывался как язык для Web-приложений, то, естественно, он "умеет" работать как с привычными нам, так и с muitipart-формами. Более того, он также поддерживает закачку файлов на сервер.

Простые имена полей закачки

Как мы уже говорили, интерпретатору совершенно все равно, в каком формате приходят данные из формы. Он умеет их обрабатывать и "рассовывать" по переменным в любом формате. Однако данные одного специального поля формы — а именно поля закачки — он интерпретирует особым образом.

Давайте посмотрим на пример сценария в листинге 43.1. Он выводит в браузер muitipart-форму, а в ней — поле закачки файла. Попробуйте выбрать какой-нибудь файл и нажать кнопку Закачать.

j Листинг 43.1. Файл test.php

<?php ## РНР автоматически создает переменные при закачке, if (@$_REQUEST['doUpload'])

1000

Часть VII. Приемы программирования на РНР 5

echo ' <рге>Содержимое $__files: ' .print_r ($_files, true) . "</prexhr>";

?>

Выберите какой-нибудь файл в форме ниже:

<form action="<?=$_SERVER[ 'SCRIPTJIAME' ] ?>" method="POST" enctype="ir,ultipart/form-data">

<input type="file" name="myFile">

<input type="submit" name="doOpload" value="3aKa4aTb"> </form>

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

Содержимое $_FILES: Array( [myFile] => Array (

[name] => sshnuke.zip [type] => application/x-zip-compressed [tmp_name] => /tmp/phpl2E.tmp [error] => 0 [size] => 10222

)

)

Итак, мы видим, что после выбора в поле нужного файла и отправки формы (и загрузки на сервер того файла, который был указан) РНР определит, что нужно принять файл, и сохранит его во временном каталоге на сервере. Кроме того, в программе создастся "суперглобальный" (т. е. доступный даже в функциях без явного применения инструкции global) массив $_files, содержащий по одному ключу для каждого файла. Имя ключа совпадает со значением атрибута name в теге <input

type="file">.

Каждый элемент массива S_files сам представляет собой ассоциативный массив, в котором содержатся следующие ключи:

□ name — исходное имя, которое имел файл на машине пользователя до своей отправки на сервер;

□ type — MIME-тип загруженного файла, если браузер смог его определить.

К примеру, image/gif, text/html, application/x-zip-compressed и Т. Д.;

□ tmp_name — имя временного файла на сервере. Этот файл содержит данные, переданные пользователем, и с ним теперь можно выполнять любые операции: удалять, копировать, переименовывать, снова удалять;

□ size — размер закачанного файла в байтах;

□ error — признак возникновения ошибки во время закачки. Значение 0 (ему же соответствует встроенная в РНР константа opload_err_ok) говорит: файл получен полностью, и его можно найти во временном каталоге сервера под именем в ключе tmp_name. Полный список возможных значений признака:

• upload_err_ok: нет ошибки, файл закачался;

• upload_err_no_file: пользователь не выбрал файл в браузере;

• upload_err_ini_size: превышен максимальный размер файла, задаваемый в директиве upioad_max_fiiesize файла php.ini;




  Hostland.Ru

 «Бесплатный хостинг Hostland.Su» © 2006