Как проверить максимальный размер публикации в пользовательской форме

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

              $form['attachments'] = [
            '#type' => 'managed_file',
            '#multiple' => true,
            '#upload_validators' => [
                'file_validate_extensions' => ['jpg docx pdf xlsx jpeg png gif'],
                'file_validate_size' => [10485760],
            ],
       ];

При загрузке одного файла размером более 10 МБ он выдает через AJAX правильную ошибку, заключающуюся в том, что размер файла не может превышать 10 МБ. Это работает из коробки.

Как я могу ограничить общий МБ для всех файлов, которые могут быть загружены через эту форму?

Например: 3 файла по 3 МБ = штраф 4 файла по 3 МБ = ошибка.

Мне удалось показать сообщение, когда это произойдет

          public function validateForm(array &$form, FormStateInterface $form_state) {
        $max_size = 10485760;
        $total_size = 0;
        $triggered_element = $form_state->getTriggeringElement();
        if($triggered_element['#name'] == 'attachments_upload_button') {
            $fids = (array) $form_state->getValue('attachments', []);
            if(!empty($fids)) {
                $files = File::loadMultiple($fids);
                foreach ($files as $key => $uploadedFile) {
                    $total_size += $uploadedFile->getSize();
                    if($total_size > $max_size) {
                        $form_state->setErrorByName('attachments', $this->t('The total maximum size of your file sizes can not be more than 10MB.'));
                        $form_state->set('attachments',array_pop($fids));
                        return;
                    }
                }
            }
        }
    }

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

Я хочу, чтобы последний отправленный файл, в котором общее количество всех файлов> 10M, был удален из form_state, а также из папки сервера tmp. И в идеале через AJAX без потери ввода полей.

Я не могу найти решение. Заранее спасибо.

Как я могу добиться этого с помощью ajax.

0 ответов

Другие вопросы по тегам