Загрузка файлов на сервер
Загрузка файлов на сервер
Здесь будет рассмотрена загрузка файловна сервер по протоколу HTTP. Рассмотримдва варианта конфигурации PHP:
register_globals=On — все параметры передаваемые скрипту, автоматически становятся глобальными переменными.register_globals=Off — параметры передаваемые скрипту заносятся в массивы $_GET, $_POST, $_FILES, $_COOKIE, …Upload файлов при register_globals=On
Напишем HTML форму для отправки файла насервер.
Содержание формы (файл upload.html):
Выберете файл:
После того как пользователь выбрал имяфайла и нажал кнопку Загрузить, PHPпомещает загружаемый файл во временнуюдиректорию указанную в параметре upload_tmp_dirфайла php.ini. В этой директории этот файлбудет храниться только во время запроса!После запроса PHP удалит этот временный файл.Поэтому загружаемый файл нужно куда-нибудьпереместить (если он вам понадобиться вдальнейшем). Явно удалить временный файлможно функцией unlink(string filename).
Здесь рассмотрим загрузку текстовогофайла и вывод его содержимого.
Скрипт обработки:
Пояснения:
$myfile — имя временного файла, в которомнаходятся загруженные данные;
Когда пользователь отправляет форму, PHPавтоматически определяет ещё несколькопеременных:
$myfile_name — имя файла на компьютерекомпьютере пользователя;
$myfile_type — MIME-тип файла.
$myfile_size — размер файла в байтах.
При загрузке текстовых файлов переменная$myfile_type = «text/plain», при загрузкеизображения gif переменная $myfile_type = «image/gif».
При register_globals=On можно пользоватьсямассивом $_FILES[].
Upload файлов при register_globals=Off
В этом случае PHP формирует массив $_FILES[]. Вэтом массиве храниться вся информация овсех загружаемых файлах. В нашем случаеструктура этого массива следующая:
$_FILES[«myfile»][«tmp_name»] — Имявременного файла
$_FILES[«myfile»][«name»] — Имя файла накомпьютере пользователя
$_FILES[«myfile»][«size»] — Размер файлав байтах
$_FILES[«myfile»][«type»] — MIME-тип файла
$_FILES[«myfile»][«error»] — код ошибки.
PHP код для обработки формы:
При загрузке можно проверятьразмер файла ($myfile_size) и если его размерпревышает требуемый, то вывод файла непроизводить.
Значения $_FILES[«myfile»][«error»]:
0 — ошибок не было, файлзагружен.
1 — размер загруженного файла превышаетразмер установленный параметром upload_max_filesizeв php.ini
2 — размер загруженного файла превышаетразмер установленный параметром MAX_FILE_SIZE вHTML форме.
3 — загружена только часть файла
4 — файл не был загружен (Пользователь вформе указал неверный путь к файлу).
Если вам необходимо сохранитьзагруженный файл, то это можно сделать спомощью функций:
copy ( string source, string dest);move_uploaded_file ( string filename, string destination);
Функция copy() копирует файл source в местоназначения dest.
Функция move_uploaded_file() перемещаетзагруженный файл filename в местоназначение указанное в параметре destination.
Ещё хочется отметить что приодновременной загрузке нескольких файлов т.е.когда HTML форма содержит:
массив $_FILES[] будет иметьследующую структуру:
$_FILES[«myfile1»][«tmp_name»] — Имявременного файла 1
$_FILES[«myfile1»][«name»] — Имя файла накомпьютере пользователя 1
$_FILES[«myfile1»][«size»] — Размер файла1 в байтах
$_FILES[«myfile1»][«type»] — MIME-тип файла 1
$_FILES[«myfile1»][«error»] — код ошибкидля файла 1.
$_FILES[«myfile2»][«tmp_name»] — Имявременного файла 2
$_FILES[«myfile2»][«name»] — Имя файла накомпьютере пользователя 2
$_FILES[«myfile2»][«size»] — Размер файла2 в байтах
$_FILES[«myfile2»][«type»] — MIME-тип файла 2
$_FILES[«myfile2»][«error»] — код ошибкидля файла 2.
$_FILES[«myfile3»][«tmp_name»] — Имявременного файла 3
$_FILES[«myfile3»][«name»] — Имя файла накомпьютере пользователя 3
$_FILES[«myfile3»][«size»] — Размер файла3 в байтах
$_FILES[«myfile3»][«type»] — MIME-тип файла 3
$_FILES[«myfile3»][«error»] — код ошибкидля файла 3.
это пример для одновременной загрузкитрёх файлов.
Таким же образом можно загружать идвоичные файлы, например файлы картинок gif,jpeg и т.д.
У меня все двоичные файлы загружались безповреждений (без глюков), но по словамДмитрия Бородина (http://php.spb.ru)возможно, что при загрузке двоичных файлову вас возникнут проблемы. Файлы будутзагружаться с перекодировкой.
Вот часть статьи «Какделать UPLOAD файлов на сервер и о возможныхглюках» сайта http://php.spb.ru,которая возможно поможет вам устранитьпричину проблемы:
ЦИТИРОВАНИЕ
Попробуйте аплодить таким способом на сервер бинарные файлы. Скореевсего файлы окажутся «битыми»: фотки не будут показываться, программынезапустятся, архивы не распакуются. Текстовые файлы (почти точно) неповредятся. Дело в том, что Русский Апач (ваш веб-сервер) перекодируетвсе подряд. Например, символ с кодом 0х00 он заменяет на пробел (символ с кодом 0х20). Чтобы выключить эту ненужную перекодировку, допишите в файл httpd.conf из каталога Апача (/usr/local/apache) следующиестроки. Если у вас нет доступа к этому файлу и админ сервера не можетсделать это за вас, ткните его в эти строки.
CharsetRecodeMultipartForms Off
Строку CharsetRecodeMultipartForms Off можно добавлять в разные места(один раз). Если вы совсем начинающий пользователь и не решите сами,куда писать эту строку, будьте аккуратнее при решении задачи методомтыка.
Мой блог находят по следующим фразам