Загрузка файлов. Запрет на отправку

Как лучше всего реализовать загрузку файлов на сервер?

Использую XMLHttpRequest для отправки формы через POST запрос.

let form = new FormData();
form.append('file', file);

Суперглобальная переменная $_FILES пуста до тех пор, пока файл не загрузится полностью во временную директорию. Это значит что файлы большого размера будут загружаться, тем самым занимать пропускную способность сети, прежде чем выдать ошибку, невзирая на указанный малый размер post_max_size и upload_max_filesize.

if ($_FILES) {

    $file = (object) $_FILES['file'];

    $max = 1024 * 1024 * min(

        (int) ini_get('post_max_size'),
        (int) ini_get('upload_max_filesize')
    );

    if ($file->size < $max)
    move_uploaded_file($file->tmp_name, "files/{$file->name}");
}

Перед отправкой файла можно заранее проверить максимально загружаемый размер клиентом, но так ли это безопасно и нужно ли позволять загружаться файлам до проверки сервером?

Во время отправки $_SERVER["CONTENT_LENGTH"] также пуст и не даёт возможность прервать соединение, но позволяет поймать предупреждение:

Warning: POST Content-Length of (...) bytes exceeds the limit of (...) bytes

if ( isset($_SERVER["CONTENT_LENGTH"]) ) {

    if ( $_SERVER["CONTENT_LENGTH"] >
    ((int) ini_get('post_max_size') * 1024 * 1024)) {

        die ( http_response_code(413) );
    }
}

Перед отправкой файла заметил запрос в ожидании с Request Headers: Content-Length: 2170553032.

Можно ли "поймать" на сервере этот заголовок и разорвать соединение, если загружаемый файл превышает допустимый размер отправляемого post запроса?

Или лучше реализовать отправку файлов частями?


Ответы (0 шт):