multiUpload и ограничение на кол-во загружаемых файлов

Добрый день!
Необходимо ограничить кол-во загружаемых файлов с помощью компонента . Т.е. программно отменить процесс загрузки большого кол-ва файлов?

  1. Возможно ли получить кол-во файлов перед началом процесса закачки ?
  2. Может возможно остановить процесс с помощью exception?
  3. В каком listener - FileUploadStartEvent или FileUploadFinishEvent лучше всего бросить исключение? и какое исключение?
  4. Каким образом можно обработать эти исключения, чтобы контролируемым образом показать ошибку пользователю?

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

Буду благодарен за помощь.
Версия Cuba Platform 7.2.14, Cuba Studio plugin 15.6.-211

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

multiUploadField.getUploadsMap().entrySet().size()

В этот момент файлы еще находятся на клиенте, а загрузку их на сервер вы выполняете позднее.

Добрый вечер, Андрей! Спасибо за оперативный ответ!
Я скорее всего не понимаю архитектуру приложения, но , как мне кажется,
событие QueueUploadCompleteEvent срабатывает только после закачки всех файлов.
Я наблюдаю скачанные файлы в deploy/app_home/myapp/temp до того как срабатывает указанное событие. Так же срабатывание события FileUploadFinishEvent подтверждает закачку всех файлов.
Если я все же не прав, то как можно прервать закачку (как отреагировать) ?

Заранее спасибо за помощь!

Я, надеюсь, нашел обходное решение мое проблемы.
Проверяем кол-во скачиваемых файлов с помощью события FileUploadEvent:

    @Subscribe("multiUpload")
public void onMultiUploadFileUploadStart(UploadField.FileUploadStartEvent event) {
    if (multiUpload.getUploadsMap().size() > MAX_UPLOAD_FILES) {
        multiUpload.setFileSizeLimit(1); // no other way to cancel upload progress
    }
}

прерываем закачку установив multiUpload.setFileSizeLimit(1) , а в обработчике ошибки FileUploadErrorEvent восстановить лимит размера multiUpload.setFileSizeLimit(0) и сообщить пользователю об ошибке:

@Subscribe("multiUpload")
public void onMultiUploadFileUploadError(UploadField.FileUploadErrorEvent event) {
    notifications.create(Notifications.NotificationType.ERROR)
            .withCaption(exceedLimitFileNumberErrorMsg)
            .show();
    multiUpload.setFileSizeLimit(0);
}

PS: Возможно ли реализовать возможность установки лимита кол-ва скачиваемых файлов в будущем?

1 симпатия

В документации буквально пошагово расписано как происходит обработка загружаемых файлов. В обработчике события QueueUploadCompleteEvent как раз выполняется выгрузка файлов в серверное хранилище.

Но я, отвечая вчера на ночь глядя, забыл про сбытые FileUploadStartEvent.

Конечно, лучше вашу ситуацию обработать сразу на стадии FileUploadStartEvent.

Я не уверен, что потребность ограничения именно числа загружаемых файлов такая уж типовая.
Если беспокоиться о трафике в сторону сервера, то количество файлов не информативно.
Их может быть много, но по 1 КБ. А может быть всего два, но очень тяжелых.
Конечно, бывают случаи, когда по бизнес-логике к этой конкретной сущности нельзя прикладывать сколько угодно файлов, а их количество должно быть вполне определенным.
Но из нашего опыта, в этом случае, обычно есть и дополнительные требования к “комплекту” файлов.
Например, файлов должно быть три, один в формате docx, один в формате xlsx, третий в pdf.

Попробуйте возможность штатной установки лимита кол-ва загружаемых файлов оформить в раздел “Идеи”.
Если вызовет интерес - наверняка попадет в план разработки.
Но это, наверное уже в Jmix.

1 симпатия

Большое спасибо!