Общие сведения
Чтобы пользователь мог загрузить файл на сервер с web-страницы, на этой странице должна присутствовать форма с параметром заголовка enctype, равном "multipart/form-data", а также со специальным полем типа file (выглядит как поле ввода имени файла с кнопкой "Обзор", нажав на которую, можно отобразить окно выбора файла) и кнопкой submit (см., например, рис. 7.3). Как только эта кнопка будет нажата, браузер начнет передавать файл, указанный в поле типа file, на сервер. В заголовке формы также следует указать параметр action, значением которого должно быть имя страницы с обрабатывающим загруженный файл сценарием.
Загрузку файла на сервер умеют осуществлять практически все браузеры (только самые старые модели Microsoft Internet Explorer и Netscape Navigator этого не могут), а воспринять ее могут все web-серверы (кроме CERN и некоторых самых простых), в том числе и самый распространенный – Apache.
После того как файл полностью загружен на сервер, он помещается в его временную папку и находится там до тех пор, пока web-сервер не закончит обрабатывать и отдавать браузеру пользователя ту страницу, имя которой было указано в параметре action формы загрузки файла. После полной выдачи страницы пользователю файл удаляется. Отсюда следует, что на этой странице должны обязательно присутствовать команды, перемещающие этот файл в какую-либо папку.
Странице, указанной в параметре action заголовка формы, передаются несколько переменных (Если в конфигурационном файле РНР – php.ini – параметр register_globals установлен в on) содержащих информацию о загруженном файле. Именно на их основе сценарий на ней сможет работать с загруженным файлом. Кроме того, эти же самые переменные помещаются в массив $HTTP_POST_FILES (Если в конфигурационном файле РНР – php.ini – параметр track_vars установлен в on), а в РНР версий 4.1 и выше – и в массив SFILES (в отличие от переменных и массива SHTTPPOSTFILES этот массив по умолчанию доступен и во всех функциях, размещенных на странице с программой-обработчиком загруженных файлов).
Вот эти переменные:
- Переменная, имеющая то же имя, что и поле с типом file в исходной форме. Если оно выглядело как < input name= "uploadf ile" type= " f ile">, то переменная будет иметь имя $uploadfile (и соответственно еще $HTTP_POST_FILES['uploadfile']['tmp_name'], $_FILES [ ' uploadf ile ' ] [ ' tmp_name ' ]). В эту переменную записывается то имя (временное, создающееся автоматически), которое загруженный файл имеет в папке временных файлов. Именно с ним будут работать команды копирования файла.
Если в исходной форме присутствовало несколько полей типа file с разными именами, то для каждого из них создается своя переменная со значением, относящимся к соответствующему файлу.
- Переменная, имеющая имя "Переменная 1 jiame" – т. е. к имени первой переменной просто приписывается горизонтальная черточка и слово name, например, для вышеуказанного примера ее имя будет выглядеть как $uploadf ile_name (ну и, разумеется, то же самое значение получат элементы вышеупомянутых массивов $HTTP_POST_FILES['uploadfile']['name'], $_FILES ['uploadf ile ' ] ['name ' ]). Ее значением является исходное имя файла в системе отправителя.
- Переменная, имеющая имя "Переменная 1_size". Ее значение – размер загруженного файла в байтах.
- Переменная, имеющая имя "Переменная 1_type". Ее значение – тип загруженного файла согласно спецификации MIME (например, "image/gif").
Все эти переменные можно использовать в PHP-сценарии, расположенном на указанной в параметре action заголовка формы, принадлежащей передающей файл странице. Для копирования файла используется команда сору ("имя копируемого файла (и путь к нему)", "путь к папке, в которую нужно файл скопировать и его новое имя там"). Путь к файлу во временной папке можно не указывать (она используется по умолчанию), а путь к папке, куда файл должен быть помещен, должен указываться относительный от того каталога, в котором находится страница с обрабатывающим загруженный файл сценарием.
Об удалении файла из временной папки после копирования его в нужный каталог можно не думать – это, как уже было сказано, произойдет автоматически.