В PHP-скрипте обработка загруженных через форму происходит через глобальный массив $_FILES
, рассмотрим его содержимое:
Чтобы форма отправила файл, необходимо использовать только метод POST для отправки данных и добавить к тегу <form>
атрибут enctype="multipart/form-data"
, который определяет способ кодирования данных формы при их отправке на сервер.
<form action="/index.php" method="post" enctype="multipart/form-data">
<input type="file" name="file-1">
<input type="submit" value="Отправить">
</form>
Код скрипта 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'] |
Код ошибки, которая может возникнуть при загрузке файла. |
Для загрузки сразу нескольких файлов к <input type="file">
нужно добавить атрибут multiple
, а к имени поля – []
.
<form action="/index.php" method="post" enctype="multipart/form-data">
<input type="file" name="file-2[]" multiple>
<input type="submit" value="Отправить">
</form>
Код скрипта 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
можно преобразовать:
<?php
$files = array();
foreach($_FILES['file-2'] as $k => $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
)
)
Размер загружаемого файла можно ограничить, добавив в форму скрытое поле с максимальным размером файла <input type="hidden" name="MAX_FILE_SIZE" value="2097152">
:
<form action="/index.php" method="post" enctype="multipart/form-data">
<input type="hidden" name="MAX_FILE_SIZE" value="2097152">
<input type="file" name="file-1">
<input type="submit" value="Отправить">
</form>
В случае превышения размера файла в переменной $_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-расширение остановило загрузку файла. |
Обычно настройки загрузки файлов на хостинге вполне нормальные и не вызывают проблем, но есть исключения. Если не загружаются большие файлы, то скорее всего установлен лимит на размер загружаемого файла, ограничено время загрузки файла или ограничено количество одновременных загрузок.
Посмотреть установленные значения можно с помощью функции 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 скрипте:
<?php
// Разрешение на загрузку файлов
ini_set('file_uploads', 'On');
// Максимальное время выполнения скрипта в секундах
ini_set('max_execution_time', '60');
// Максимальное потребление памяти одним скриптом
ini_set('memory_limit', '64M');
// Максимально допустимый размер данных отправляемых методом POST
ini_set('post_max_size', '50M');
// Папка для хранения файлов во время загрузки
ini_set('upload_tmp_dir', 'home/user/temp');
// Максимальный размер загружаемого файла
ini_set('upload_max_filesize', '5M');
// Максимально разрешённое количество одновременно загружаемых файлов
ini_set('max_file_uploads', '10');