# Класс HttpSoft\ServerRequest\UploadedFileCreator

Хелпер для создания HttpSoft\Message\UploadedFile.

Исходный код на GitHub.

use HttpSoft\Message\Stream;
use HttpSoft\ServerRequest\UploadedFileCreator;

// Из существующего файла:
$uploadedFile = UploadedFileCreator::create('/tmp/phpN3FmFr', 1024, UPLOAD_ERR_OK, 'file.txt', 'text/plain');

// Из экземпляра `Psr\Http\Message\StreamInstance`:
$stream = new Stream('/tmp/phpN3FmFr', 'wb+');
$uploadedFile = UploadedFileCreator::create($stream, 1024, UPLOAD_ERR_OK, 'file.txt', 'text/plain');

// Из существующего ресурса:
$resource = fopen('path/to/file', 'wb+');
$uploadedFile = UploadedFileCreator::create($resource, 1024, UPLOAD_ERR_OK, 'file.txt', 'text/plain');

// Из элемента `$_FILES`:
$uploadedFile = UploadedFileFactory::createFromArray([
    'name' => 'file.txt',
    'type' => 'text/plain',
    'tmp_name' => '/tmp/phpN3FmFr',
    'error' => UPLOAD_ERR_OK,
    'size' => 1024,
]);

// Создать несколько из суперглобального массива `$_FILES`:
$uploadedFiles = UploadedFileCreator::createFromGlobals($_FILES);

# Публичные методы

# create

Создает новый экземпляр HttpSoft\Message\UploadedFile.

/**
 * @param StreamInterface|string|resource $streamOrFile
 * @param int $size
 * @param int $error
 * @param string|null $clientFilename
 * @param string|null $clientMediaType
 * @return UploadedFileInterface
 */
public static function create(
    $streamOrFile,
    int $size,
    int $error,
    string $clientFilename = null,
    string $clientMediaType = null
): UploadedFileInterface;

# createFromArray

Создает новый экземпляр HttpSoft\Message\UploadedFile из массива.

public static function createFromArray(array $file): UploadedFileInterface;

Создает экземпляр Psr\Http\Message\UploadedFileInterface из одномерного массива $file. Структура массива должна быть такой же, как и элемент в глобальном массиве $_FILES.

// Пример структуры массива:
[
    'name' => 'filename.jpg', // необязательный
    'type' => 'image/jpeg', // необязательный
    'tmp_name' => '/tmp/php/php6hst32',
    'error' => 0, // UPLOAD_ERR_OK
    'size' => 98174,
];

# createFromGlobals

Нормализует структуру дерева загружаемых файлов и преобразует каждое значение многомерного массива $files в экземпляр Psr\Http\Message\UploadedFileInterface.

public static function createFromGlobals(array $files = []): array;

Метод использует рекурсию, поэтому массив $files может быть любого уровня вложенности.

Все имена ключей в массиве $files будут сохранены.

Структура массива должна быть такой же, как и у глобального массива $_FILES.

Если указанно невалидное значение спецификации файла, будет брошено исключение \InvalidArgumentException.

use HttpSoft\ServerRequest\UploadedFileCreator;

// Пример #1

print_r($_FILES);
/*
[
    'file' => [
        'name' => 'file.txt',
        'type' => 'text/plain',
        'tmp_name' => '/tmp/phpN3FmFr',
        'error' => UPLOAD_ERR_OK,
        'size' => 1024,
    ],
];
*/

print_r(UploadedFileCreator::createFromGlobals($_FILES));
/*
[
    'file' => `HttpSoft\Message\UploadedFile Object`,
];
*/

// Пример #2

/*
[
    'file_1' => [
        'name' => 'file.txt',
        'type' => 'text/plain',
        'tmp_name' => '/tmp/phpN3FmFr',
        'error' => UPLOAD_ERR_OK,
        'size' => 1024,
    ],
    'file_2' => [
        'name' => 'image.png',
        'type' => 'image/png',
        'tmp_name' => '/tmp/phpLs7DaJ',
        'error' => UPLOAD_ERR_OK,
        'size' => 98760,
    ],
];
*/

print_r(UploadedFileCreator::createFromGlobals($_FILES));
/*
[
    'file_1' => `HttpSoft\Message\UploadedFile Object`,
    'file_2' => `HttpSoft\Message\UploadedFile Object`,
];
*/

// Пример #3

print_r($_FILES);
/*
[
    'files' => [
        'name' => [
            'file_1' => 'file.txt',
            'file_2' => 'image.png',
        ],
        'type' => [
            'file_1' => 'text/plain',
            'file_2' => 'image/png',
        ],
        'tmp_name' => [
            'file_1' => '/tmp/phpN3FmFr',
            'file_2' => '/tmp/phpLs7DaJ',
        ],
        'error' => [
            'file_1' => 0,
            'file_2' => 0,
        ],
        'size' => [
            'file_1' => 1024,
            'file_2' => 98174,
        ],
    ],
];
*/

print_r(UploadedFileCreator::createFromGlobals($_FILES));
/*
[
    'files' => [
        'file_1' => `HttpSoft\Message\UploadedFile Object`,
        'file_2' => `HttpSoft\Message\UploadedFile Object`,
    ],
];
*/

// Пример #4

/*
[
    'files' => [
        'name' => [
            'data' => [
                'nested' => [
                    'file_1' => 'file.txt',
                    'file_2' => 'image.png',
                ],
            ],
        ],
        'type' => [
            'data' => [
                'nested' => [
                    'file_1' => 'text/plain',
                    'file_2' => 'image/png',
                ],
            ],
        ],
        'tmp_name' => [
            'data' => [
                'nested' => [
                    'file_1' => '/tmp/phpN3FmFr',
                    'file_2' => '/tmp/phpLs7DaJ',
                ],
            ],
        ],
        'error' => [
            'data' => [
                'nested' => [
                    'file_1' => UPLOAD_ERR_OK,
                    'file_2' => UPLOAD_ERR_OK,
                ],
            ],
        ],
        'size' => [
            'data' => [
                'nested' => [
                    'file_1' => 1024,
                    'file_2' => 98174,
                ],
            ],
        ],
    ],
];
*/

print_r(UploadedFileCreator::createFromGlobals($_FILES));
/*
[
    'files' => [
        'data' => [
            'nested' => [
                'file_1' => `HttpSoft\Message\UploadedFile Object`,
                'file_2' => `HttpSoft\Message\UploadedFile Object`,
            ],
        ],
    ],
];
*/

Подробнее о структуре загружаемых файлов смотрите здесь.