Массив $_FILES

В 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>
HTML

Код скрипта index.php:

<?php
print_r($_FILES['file-1']);
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>
HTML

Код скрипта index.php

<?php
print_r($_FILES['file-2']);
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);
PHP

Результат:

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>
HTML

В случае превышения размера файла в переменной $_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
htaccess

В 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');
PHP
13.12.2020
7169

Комментарии

, чтобы добавить комментарий.

Другие публикации

Загрузка файлов через AJAX с помощью jQuery Form Plugin
Пример загрузки изображений через AJAX с помощью плагина jQuery Form Plugin.
14123
+3
Загрузка файлов через jQuery AJAX
В преведущей статье был приведен пример отправки файлов через AJAX с помощью плагина «jQuery Form Plugin». Но файлы...
21550
+3
Загрузка изображений с превью AJAX + PHP + MySQL
В данной статье представлена упрощенная реализация загрузки изображений с превью через AJAX с сохранением в базу данных...
10003
+17
Запрет выполнения PHP скриптов в директории
Если нужно запретить выполнение скриптов php в директории, например в uploads, нужно поместить туда файл .htaccess со...
12238
+9
Примеры отправки AJAX JQuery
AJAX позволяет отправить и получить данные без перезагрузки страницы. Например, делать проверку форм, подгружать контент и т.д. А функции JQuery значительно упрощают работу.
129339
+19
Примеры использования cURL в PHP
cURL PHP – это библиотека предназначенная для получения и передачи данных через такие протоколы, как HTTP, FTP, HTTPS....
115599
+16