В каком массиве содержатся данные о загруженном пользователем файле

В каком массиве содержатся данные о загруженном пользователем файле thumbnail
Массив $_FILES

В PHP-скрипте обработка загруженных через форму происходит через глобальный массив $_FILES, рассмотрим его содержимое:

1

Загрузка одного файла

Чтобы форма отправила файл, необходимо использовать только метод 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’]Код ошибки, которая может возникнуть при загрузке файла.

2

Загрузка несколько файлов

Для загрузки сразу нескольких файлов к <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
)
)

3

Максимальный размер загружаемого файла

Размер загружаемого файла можно ограничить, добавив в форму скрытое поле с максимальным размером файла <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».

4

Коды ошибок загрузки файлов

В случаи, если при загрузке файла произошла ошибка, в переменной $_FILES[‘file’][‘error’] будет содержатся её код. Возможны следующие значения:

КодКонстантаОписание
UPLOAD_ERR_OKОшибок не возникло, файл успешно загружен на сервер.
1UPLOAD_ERR_INI_SIZEРазмер файла превысил максимально допустимый размер, который задан директивой upload_max_filesize
2UPLOAD_ERR_FORM_SIZEРазмер загружаемого файла превысил значение MAX_FILE_SIZE, указанное в HTML-форме.
3UPLOAD_ERR_PARTIALЗагружаемый файл был получен только частично.
4UPLOAD_ERR_NO_FILEФайл не был загружен.
6UPLOAD_ERR_NO_TMP_DIRОтсутствует временная папка.
7UPLOAD_ERR_CANT_WRITEНе удалось записать файл на диск (возникает, когда на хостинге закончилось место).
8UPLOAD_ERR_EXTENSIONPHP-расширение остановило загрузку файла.

5

Настройки PHP

Обычно настройки загрузки файлов на хостинге вполне нормальные и не вызывают проблем, но есть исключения. Если не загружаются большие файлы, то скорее всего установлен лимит на размер загружаемого файла, ограничено время загрузки файла или ограничено количество одновременных загрузок.

Посмотреть установленные значения можно с помощью функции phpinfo(), в разделе «Core».

Раздел «Core» в phpinfo

В 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’);

Читайте также:  В каких фруктах и продуктах содержится витамин в12 список продуктов

// Максимальное потребление памяти одним скриптом
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

Источник

(PHP 4, PHP 5, PHP 7)

file — Читает содержимое файла и помещает его в массив

Описание

array file
( string $filename
[, int $flags = 0
[, resource $context
]] )

Замечание:

Можно также использовать функцию file_get_contents()
для получения файла в виде строки.

Список параметров

filename

Путь к файлу.

Подсказка

Для этой функции вы можете использовать URL
в качестве имени файла, если была включена опция fopen wrappers. Смотрите более
подробную информацию об определении имени файла в описании функции
fopen(). Смотрите также список поддерживаемых оберток URL, их возможности, замечания по использованию и список
предопределенных констант в Поддерживаемые протоколы и обработчики (wrappers).

flags

В качестве необязательного параметра flags может
можно указать одну или более следующих констант:

FILE_USE_INCLUDE_PATH

Ищет файл в include_path.

FILE_IGNORE_NEW_LINES

Не добавлять новую строку к концу каждого элемента массива

FILE_SKIP_EMPTY_LINES

Пропускать пустые строки

context

Ресурс контекста, созданный функцией
stream_context_create().

Замечание: Поддержка контекста была добавлена
в PHP 5.0.0. Для описания контекстов смотрите раздел
Потоки.

Возвращаемые значения

Возвращает файл в виде массива. Каждый элемент массива соответствует
строке файла, с символами новой строки включительно. В случае
ошибки file() возвращает FALSE.

Замечание:

Каждая строка в полученном массиве будет завершаться символами конца
строки (если вы не указали флаг FILE_IGNORE_NEW_LINES),
поэтому, если вам будет нужно избавиться от этих символов, вы
можете использовать функцию rtrim().

Замечание: Если у вас возникают проблемы
с распознаванием PHP концов строк при чтении или создании файлов на Macintosh-совместимом компьютере, включение опции
auto_detect_line_endings может помочь решить проблему.

Список изменений

ВерсияОписание
4.3.0 file() стала безопасной для обработки
бинарных данных

Примеры

Пример #1 Пример использования file()

<?php
// Получает содержимое файла в виде массива. В данном примере мы используем
// обращение по протоколу HTTP для получения HTML-кода с удаленного сервера.
$lines = file(‘https://www.example.com/’);// Осуществим проход массива и выведем содержимое в виде HTML-кода вместе с номерами строк.
foreach ($lines as $line_num => $line) {
    echo “Строка #<b>{$line_num}</b> : ” . htmlspecialchars($line) . “<br />n”;
}// Второй пример. Получим содержание web-страницы в виде одной строки.
// См.также описание функции file_get_contents().
$html = implode(”, file(‘https://www.example.com/’));// Используем необязательный параметр flags (начиная с PHP 5)
$trimmed = file(‘somefile.txt’, FILE_IGNORE_NEW_LINES | FILE_SKIP_EMPTY_LINES);
?>

Примечания

Внимание

При использовании SSL,
Microsoft IIS нарушает протокол, закрывая соединение без отправки
индикатора close_notify. PHP сообщит об этом как “SSL: Fatal Protocol Error”
в тот момент, когда вы достигнете конца данных. Чтобы обойти это, вы должны
установить error_reporting на
уровень, исключающий E_WARNING.
PHP версий 4.3.7 и старше умеет определять, что на стороне сервера находится
проблемный IIS при открытии потока с помощью обертки https:// и не выводит предупреждение.
Если вы используете fsockopen() для создания ssl:// сокета,
вы сами отвечаете за определение и подавление этого предупреждения.

Вернуться к: Файловая система

Источник

Как загрузить файл на сервер используя PHP? В этой статье мы подробно рассмотрим этот вопрос с примерами.

HTML-форма для отправки файла

Первое, что нужно знать для загрузка файлов на сервер — это особенности HTML-форм, которые отправляют файл.

Вот пример HTML-кода такой формы:

<html>
<head>
<title>Загрузка файлов на сервер</title>
</head>
<body>
<h2>Форма для загрузки файлов</h2>
<!– Поле MAX_FILE_SIZE должно быть указано до поля загрузки файла –>
<input type=”hidden” name=”MAX_FILE_SIZE” value=”30000″>
<form action=”upload.php” method=”post” enctype=”multipart/form-data”>
<input type=”file” name=”filename”><br>
<input type=”submit” value=”Загрузить”><br>
</form>
</body>
</html>

Что уникального в этой форме:

  1. Тег form должен обязательно содержать атрибут enctype=”multipart/form-data. Именноо этот атрибут указывает на то, что форма будет передавать файл. По умолчанию атрибут enctype имеет значение application/x-www-form-urlencoded.
  2. Форма должна содержать скрытый атрибут (type=”hidden”) с именем MAX_FILE_SIZE в значении которого (value) указывается размер файла. Теоретически, браузеры должны сообщать о том, что файл превышает допустимые размеры, но на практике браузеры не поддерживают это. Я думаю, что этот атрибут можно не указывать.
  3. Для выбора передаваемого файла служит тег input, у которого атрибут type=”file”.

После того, как сервер получил HTTP-запрос от такой формы, он записывает файл во временную папку на сервере.

Если хотите чтобы файл на этом этапе сохранялся в другой каталог, укажите его в директиве upload_tmp_dir файла php.ini.

Для перемещения загруженного файла в новое место используется функция move_uploaded_file.

Но перед тем, как начать работать с этой функцией, мы должны изучить двумерный массив $_FILES, через который мы получаем доступ к характеристикам загруженного файла.

Читайте также:  В каких продуктах содержится витамин список продуктов

Массив $_FILES

Итак, после того, как скрипт получил данные формы с переданным файлом, файл он записал в специальную папку, а данные о файле записал в двумерный массив $_FILES.

Давайте рассмотрим пример, который выводит содержимое массива $_FILES на экран.

<html>
<head>
<title>Загрузка файлов на сервер</title>
</head>
<body>

<?php
if ( ! $_FILES )
{
echo ‘
<h2>Форма для загрузки файлов</h2>
<form action=”” method=”post” enctype=”multipart/form-data”>
<input type=”file” name=”filename”><br>
<input type=”submit” value=”Загрузить”><br>
</form>
‘;
}
else
{
echo “<pre>”, print_r($_FILES), “</pre>”;
}
?>

</body>
</html>

Вот что мы получим в результате работы этого скрипта:

Массив $_FILESРис.1. Массив $_FILES.

Теперь давайте разберём, что содержится в этом массиве.

В нашем двумерном массиве $_FILES есть один элемент filename. Это значение поля name из элемента формы:

<input type=”file” name=”filename”>

Данные для этого файла:

  • $_FILES[‘filename’][‘name’] — имя файла;
  • $_FILES[‘filename’][‘type’] — тип файла;
  • $_FILES[‘filename’][‘tmp_name’] — полный путь к временному каталогу на диске;
  • $_FILES[‘filename’][‘error’] — содержит код ошибки, который это 0, если операция прошла успешно;
  • $_FILES[‘filename’][‘size’] — размер файла.

Можно было бы в форме указать два поля для файлов, например так:

<input type=”file” name=”filename-1″>
<input type=”file” name=”filename-2″>

В этом случае наш массив выглядел бы так:

Массив $_FILESРис.2. Массив $_FILES.

Итак, теперь мы знаем как устроен массив $_FILES и следующий шаг — положить полученный файл в нужное нам место.

Функция move_uploaded_file

Как я уже писал, для перемещения загруженного файла в новое место используется функция move_uploaded_file.

Синтаксис функции move_uploaded_file:

move_uploaded_file ( откуда переносить , куда переносить )

Функция move_uploaded_file возвращает булево значение:

  • TRUE — в случае успеха,
  • FALSE — если первый аргумент является загруженным файлом, но по каким-либо причинам не может быть перемещён в указанное место, в этом случае никаких действий не предпринимается.

Используем эту функцию в примере:

<html>
<head>
<title>Загрузка файлов на сервер</title>
</head>
<body>

<?php
if ( ! $_FILES )
{
echo ‘
<h2>Форма для загрузки файлов</h2>
<form action=”” method=”post” enctype=”multipart/form-data”>
<input type=”file” name=”filename”><br>
<input type=”submit” value=”Загрузить”><br>
</form>
‘;
}
else
{
move_uploaded_file
(
$_FILES[“filename”][“tmp_name”],
__DIR__ . DIRECTORY_SEPARATOR . $_FILES[“filename”][“name”]
);
}
?>

</body>
</html>

Этот скрипт перемещает картинку в ту же папку, в которой он сам находится. Для этого мы используем встроенные в PHP константы для указания пути:

  • __DIR__ — одна из “волшебных” констант, содержит директорию файла.
  • DIRECTORY_SEPARATOR — предопределённая константа, содержащая разделитель пути. Для ОС Windows это «», для ОС Linux и остальных — «/».

Внимание: Если результирующий файл уже существует, он будет перезаписан.

Функция is_uploaded_file

Ест ещё одна функция, которую нужно обязательно использовать при работе с загрузкой файлов на сервер. Это функция is_uploaded_file и она используется из соображений безопасности.

is_uploaded_file — определяет, был ли файл загружен при помощи HTTP POST и возвращает TRUE, если это так.

Использование этой функции целесообразно для удостоверения, что злонамеренный пользователь не пытается обмануть скрипт так, чтобы он работал с файлами, с которыми работать не должен – к примеру, /etc/passwd.

Обратите внимание: для правильной работы функции is_uploaded_file нужно передать путь к файлу на временном хранилище на сервере, то есть аргумент вида $_FILES[‘filename’][‘tmp_name’], – а вот имя закачиваемого файла на клиентской машине ($_FILES[‘filename’][‘name’]) тут не подходит.

Наш конечный пример скрипта, обрабатывающего форму отправки файла, будет выглядеть так:

<html>
<head>
<title>Загрузка файлов на сервер</title>
</head>
<body>

<?php
if ( ! $_FILES )
{
echo ‘
<h2>Форма для загрузки файлов</h2>
<form action=”” method=”post” enctype=”multipart/form-data”>
<input type=”file” name=”filename”><br>
<input type=”submit” value=”Загрузить”><br>
</form>
‘;
}
else
{
// Проверяем загружен ли файл
if( is_uploaded_file($_FILES[“filename”][“tmp_name”]) )
{
// Если файл загружен успешно, перемещаем его
// из временной директории в конечную
move_uploaded_file
(
$_FILES[“filename”][“tmp_name”],
__DIR__ . DIRECTORY_SEPARATOR . $_FILES[“filename”][“name”]
);
} else {
echo(“Ошибка загрузки файла”);
}
}
?>

</body>
</html>

Ограничиваем размер файла

В некоторых случаях требуется ограничить размер файла, который может быть загружен на сервер. К примеру, чтобы разрешить загрузку на сервер только файлов с размером не более 3 Мбайт, в приведенном скрипте содержится код:

<?php

if($_FILES[“filename”][“size”] > 1024*3*1024)
{
echo(“Размер файла превышает три мегабайта”);
exit;
}

?>

Максимальный размер загружаемого файла можно также задать при помощи директивы upload_max_filesize в файле в php.ini. Значение этой которой директивы по умолчанию равно 2 Мбайт:

<?php

// получаем значеие директивы upload_max_filesize при помощи функции ini_get
$upload_max_filesize = (integer) ini_get( upload_max_filesize );

Читайте также:  В каких продуктах содержатся коэнзимы

// перевобим бегабайты в байты
$upload_max_filesize = $upload_max_filesize * 1024 * 1 024;
if( $_FILES[“filename”][“size”] > $upload_max_filesize )

?>

Кстати, тут мы использовали временное преобразование типа переменной. Речь о круглых скобках с типом (integer). Подробнее об это читайте в статье “Работа с данными в PHP”.

Настройки php.ini для загрузки файлов на сервер

Итак, мы узнали про директиву upload_max_filesize файла php.ini которая устанавливает максимальный размер загружаемого файла. Какие ещё директивы файла php.ini отвечают за загрузку файлов на сервер?

Кстати, если Вы хотите узнать, где расположен Ваш файл php.ini, выполните скриптик:

<?php phpinfo(); ?>

Итак, список директив файла php.ini:

  • file_uploads — возможность запретить или разрешить загрузку файлов на сервер в целом, по умолчанию разрешена (значение On).
  • post_max_size — общее ограничение сверху на размер данных, передаваемых в POST запросе. Если Вам необходимо передавать несколько файлов одновременно, или работать с большими файлами, измените значение этой директивы. Значение по умолчанию 8Мб.
  • upload_max_filesize — уже рассмотренная нами директива. Не забывайте при необходимости также менять post_max_size.
  • upload_tmp_dir — временная директория на сервере, в которую будут помещаться все загружаемые файлы.

Это всё, что я хотел сказать Вам по теме “Загрузка файлов на сервер в PHP”.

Источник

Меня всегда мучал вопрос по поводу того, почему так устроен массив $_FILES в PHP, точнее то, почему он очень странным образом формирует его. В случае, если имена полей формы оформлены с использованием синтаксиса массива, $_REQUEST, $_GET или $_POST будут содержать правильное представление, но… такое использование не подходит для $_FILES!

Проблема

Имеем форму:

<form action=”” method=”post” enctype=”multipart/form-data”>
<input type=”file” name=”oneLevel[]”>
<input type=”file” name=”oneLevel[]”>
<input type=”submit”>
</form>

При загрузке файлов через эту форму получаем массив $_FILES следующего вида:

array(
‘files’ => array (
‘name’ => array (
0 => ‘Lighthouse.jpg’,
1 => ‘Hydrangeas.jpg’,
),
‘type’ => array (
0 => ‘image/jpeg’,
1 => ‘image/jpeg’,
),
‘tmp_name’ => array (
0 => ‘/tmp/phpQR67Qp’,
1 => ‘/tmp/phpJjnAHA’,
),
‘error’ => array (
0 => 0,
1 => 0,
),
‘size’ => array (
0 => 561276,
1 => 595284,
),
),
)

Мне эта «фича» в большинстве случаев не подходит и кажется нелогичной. Простейшее решение — использовать простые (строковые) имена для полей типа «файл», например file_0, file_1, …, file_N, но это не так удобно. Если, все-таки, вас интересует решение этой проблемы — читаем далее…

Решение

В autoprepend-файле или где-нибудь в момент инициализации вашего приложения стоит обработать массив $_FILE следующим образом:

/**
* Рекурсивная функция для реструктуризации массива
*
* @param array $arrayForFill Массив для заполнения.
* Этот массив будет содержать “правильное”
* представление $_FILES
* @param string $currentKey Ключ текущей позиции
* @param mixed $currentMixedValue Значение текущей позиции
* @param string $fileDescriptionParam Текущий параметр описания файла
* (name, type, tmp_name, error или size)
* @return void
*/
function rRestructuringFilesArray(&$arrayForFill, $currentKey,
$currentMixedValue, $fileDescriptionParam)
{
if (is_array($currentMixedValue)) {
foreach ($currentMixedValue as $nameKey => $mixedValue) {
rRestructuringFilesArray($arrayForFill[$currentKey],
$nameKey,
$mixedValue,
$fileDescriptionParam);
}
} else {
$arrayForFill[$currentKey][$fileDescriptionParam] = $currentMixedValue;
}
}

// массив, в котором будем формировать “правильный” $_FILES
$arrayForFill = array();

// первый уровень проходим без изменения
foreach ($_FILES as $firstNameKey => $arFileDescriptions) {

// а вот со второго уровня интерпритатор делает то,
// что мне в большинстве случаев не подходит
foreach ($arFileDescriptions as $fileDescriptionParam => $mixedValue) {
rRestructuringFilesArray($arrayForFill,
$firstNameKey,
$_FILES[$firstNameKey][$fileDescriptionParam],
$fileDescriptionParam);
}
}
// перегружаем $_FILES сформированным массивом
$_FILES = $arrayForFill;

В итоге имеем более «логичный» миссив:

array(
‘files’ => array (
0 => array (
‘name’ => ‘Lighthouse.jpg’,
‘type’ => ‘image/jpeg’,
‘tmp_name’ => ‘/tmp/phpKNqlsc’,
‘error’ => 0,
‘size’ => 561276,
),
1 => array (
‘name’ => ‘Hydrangeas.jpg’,
‘type’ => ‘image/jpeg’,
‘tmp_name’ => ‘/tmp/phpB8X3E8’,
‘error’ => 0,
‘size’ => 595284,
),
),
)

Разместил это решение комментарием в официальной документации, т.к. вопросов много, а конкретного примера нет. Но, на момент публикации здесь его там пока ещё не появилось (не знаю, появится ли?).

Спасибо за внимание, надеюсь кому-нибудь пригодится.

UPD: Глядя на то, как мои слова «В autoprepend-файле или где-нибудь в момент инициализации вашего приложения стоит обработать массив $_FILE» и перезапись в коде массива $_FILES вызвали некоторое негодование некоторой части сообщества, заявляю: это пример того, как можно реализовать необходимый функционал, и я не призываю использовать данный код «как есть» в боевых проектах.

Источник