Загрузка нескольких файлов через записи в сетке Ваадина - PullRequest
1 голос
/ 05 февраля 2020

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

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

Как я могу использовать мою функцию итеративно или рекурсивно, чтобы получить все элементы, загруженные после ссылки из сетки ?


Функция загрузки:

 public Anchor downloadButton(String btnText, String fileName) 
 {

        Button btnDownload = new Button(btnText,VaadinIcon.DOWNLOAD.create());   

        StreamResource StreamResource = new StreamResource(fileName, () -> {
            try 
            {
                return new FileInputStream(fileName);
            } 

            catch (FileNotFoundException e) 
            {
                e.printStackTrace();
                return new ByteArrayInputStream(new byte[]{});
            } 
        });
        Anchor anchorDownload = new Anchor(StreamResource, "");
        anchorDownload.getElement().setAttribute("download", true);
        anchorDownload.add(btnDownload);

        return anchorDownload;
    }


Создание сетки:

List<CorrespondenceFiles> fileList = new ArrayList<>();

    fileList.add(new CorrespondenceFiles(1, mode + " - 90111", "Breakdown", "C:\\manager\\90111 - Korn, Niclas - Breakdown.pdf" ,  "90111 - Breakdown.pdf"));
    fileList.add(new CorrespondenceFiles(1, mode + " - 90111 ", "Letter of Approval", "C:\\manager\\90111 - Letter.pdf",  "90111 - Letter.pdf"));
    fileList.add(new CorrespondenceFiles(2, mode + " - 90112",  "Breakdown", "C:\\manager\\90112 - Breakdown.pdf", "90112 - 90112 - Breakdown.pdf"));

    ListDataProvider<CorrespondenceFiles> ldp = new ListDataProvider<CorrespondenceFiles>(fileList);


    grid.setDataProvider(ldp);  
    grid.addColumn(CorrespondenceFiles::getName)
        .setHeader("Name");
    grid.addColumn(CorrespondenceFiles::getDescription)
    .setHeader("Description");
    grid.addColumn(CorrespondenceFiles::getFileName)
    .setHeader("File Name");

Примечание: список fileList служит только в качестве заполнителя для базы данных возвращаются заявления.

1 Ответ

6 голосов
/ 05 февраля 2020

Загрузка нескольких файлов одним нажатием кнопки - это не то, что вы должны делать, даже если бы могли. Это «правило» исходит не от Ваадина, а от всей сети. Элемент привязки также не обеспечивает такую ​​функциональность. Существуют хакерские обходные пути, использующие javascript, но вам крайне не рекомендуется это делать.

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

...