- Массив $_FILES
- Загрузка одного файла
- Код скрипта index.php:
- Результат:
- Загрузка несколько файлов
- Код скрипта index.php
- Результат:
- Результат:
- Максимальный размер загружаемого файла
- Коды ошибок загрузки файлов
- Настройки PHP
- В php.ini:
- В .htaccess:
- Форма php html post одним файлом
- PHP: сервис одним файлом
- PHP :: Использование php-скрипта и html-формы в одном файле
- Быстрый переход к другим страницам
Массив $_FILES
В PHP-скрипте обработка загруженных через форму происходит через глобальный массив $_FILES , рассмотрим его содержимое:
Загрузка одного файла
Чтобы форма отправила файл, необходимо использовать только метод POST для отправки данных и добавить к тегу атрибут enctype=»multipart/form-data» , который определяет способ кодирования данных формы при их отправке на сервер.
Код скрипта index.php:
Результат:
Array( [name] => image.jpg [type] => image/jpeg [tmp_name] => /home/user/temp/phpjX2YXo [error] => 0 [size] => 119303 )
Описание значений массива $_FILES :
$_FILES[‘file-1’][‘name’] | Оригинальное имя файла на компьютере клиента. |
$_FILES[‘file-1’][‘type’] | Mime-тип файла, в случае, если браузер предоставил такую информацию. Этот mime-тип не проверяется на стороне PHP, так что не полагайтесь на его значение без проверки. |
$_FILES[‘file-1’][‘size’] | Размер принятого файла в байтах . |
$_FILES[‘file-1’][‘tmp_name’] | Временное имя, с которым принятый файл был сохранен на сервере. |
$_FILES[‘file-1’][‘error’] | Код ошибки, которая может возникнуть при загрузке файла. |
Загрузка несколько файлов
Для загрузки сразу нескольких файлов к нужно добавить атрибут multiple , а к имени поля – [] .
Код скрипта index.php
Результат:
Array( [name] => Array( [0] => image.jpg [1] => arhive.zip ) [type] => Array( [0] => image/jpeg [1] => application/zip ) [tmp_name] => Array( [0] => /home/user/temp/phpK3h32F [1] => /home/user/temp/phpBrGxus ) [error] => Array( [0] => 0 [1] => 0 ) [size] => Array( [0] => 119303 [1] => 6792 ) )
Как видно, структура массива разделена по свойствам, а не по файлам. Для удобства работы с циклом foreach массив $_FILES можно преобразовать:
$l) < foreach($l as $i =>$v) < $files[$i][$k] = $v; >> $_FILES['file-2'] = $files; print_r($_FILES);
Результат:
Array( [0] => Array( [name] => image.jpg [type] => image/jpeg [tmp_name] => /home/user/temp/phpKgSQbo [error] => 0 [size] => 119303 ) [1] => Array( [name] => arhive.zip [type] => application/zip [tmp_name] => /home/user/temp/phpVht8LS [error] => 0 [size] => 6792 ) )
Максимальный размер загружаемого файла
Размер загружаемого файла можно ограничить, добавив в форму скрытое поле с максимальным размером файла :
В случае превышения размера файла в переменной $_FILES[‘file-1’][‘error’] будет ошибка с кодом « 2 ».
Коды ошибок загрузки файлов
В случаи, если при загрузке файла произошла ошибка, в переменной $_FILES[‘file’][‘error’] будет содержатся её код. Возможны следующие значения:
Код | Константа | Описание |
---|---|---|
0 | UPLOAD_ERR_OK | Ошибок не возникло, файл успешно загружен на сервер. |
1 | UPLOAD_ERR_INI_SIZE | Размер файла превысил максимально допустимый размер, который задан директивой upload_max_filesize |
2 | UPLOAD_ERR_FORM_SIZE | Размер загружаемого файла превысил значение MAX_FILE_SIZE, указанное в HTML-форме. |
3 | UPLOAD_ERR_PARTIAL | Загружаемый файл был получен только частично. |
4 | UPLOAD_ERR_NO_FILE | Файл не был загружен. |
6 | UPLOAD_ERR_NO_TMP_DIR | Отсутствует временная папка. |
7 | UPLOAD_ERR_CANT_WRITE | Не удалось записать файл на диск (возникает, когда на хостинге закончилось место). |
8 | UPLOAD_ERR_EXTENSION | PHP-расширение остановило загрузку файла. |
Настройки PHP
Обычно настройки загрузки файлов на хостинге вполне нормальные и не вызывают проблем, но есть исключения. Если не загружаются большие файлы, то скорее всего установлен лимит на размер загружаемого файла, ограничено время загрузки файла или ограничено количество одновременных загрузок.
Посмотреть установленные значения можно с помощью функции phpinfo() , в разделе «Core».
В php.ini:
; Разрешение на загрузку файлов file_uploads = On ; Максимальное время выполнения скрипта в секундах max_execution_time = 60 ; Максимальное потребление памяти одним скриптом memory_limit = 64M ; Максимально допустимый размер данных отправляемых методом POST post_max_size = 50M ; Папка для хранения файлов во время загрузки upload_tmp_dir = home/user/temp ; Максимальный размер загружаемого файла upload_max_filesize = 5M ; Максимально разрешённое количество одновременно загружаемых файлов max_file_uploads = 10
В .htaccess:
# Разрешение на загрузку файлов php_value file_uploads On # Максимальное время выполнения скрипта в секундах php_value max_execution_time 60 # Максимальное потребление памяти одним скриптом php_value memory_limit 64M # Максимально допустимый размер данных отправляемых методом POST php_value post_max_size 50M # Папка для хранения файлов во время загрузки php_value upload_tmp_dir home/user/temp # Максимальный размер загружаемого файла php_value upload_max_filesize 5M # Максимально разрешённое количество одновременно загружаемых файлов php_value max_file_uploads 10
Форма php html post одним файлом
PHP: сервис одним файлом
Иногда удобнее не писать классы или процедурные модули, а сделать небольшое законченное решение в единственном файле, который выведет форму, отправит, получит и проверит параметры и выдаст результат работы в виде текстового контента или картинки. Рассмотрим эти 2 основных случая (результат-текст и результат-картинка), приведя по каждому из них законченный пример.
1. Форма + текст
Если речь идёт о Web-приложении, которое должно выдавать результаты «текстом» и на ту же страницу, с которой вводились данные формы, удобной представляется следующая организация скрипта (листинг):
function magic ($path) < @ini_set('magic_quotes_runtime', '0'); @ini_set('magic_quotes_sybase', '0'); if (@get_magic_quotes_gpc()=='1') $path=stripslashes($path); //magic_quotes_gpc не меняется программно - см. доки return $path; >//Блок 1 - обработка разрешённых скрипту параметров $params = array ('name','gender','education','php','cpp','java','text','action'); //список разрешенных в скрипте параметров, все переменные создадутся автоматически из данных $_POST/$_GET или пустыми foreach ($params as $num=>$var) < if (!empty($_POST[$var])) $$var = trimall(htmlspecialchars(magic($_POST[$var]))); else if (!empty($_GET[$var])) $$var = trimall(htmlspecialchars(magic($_GET[$var]))); else $$var = ''; >//Блок 2 - вывод и заполнение формы echo '