Загрузка не начинается при нажатии кнопки - PullRequest
0 голосов
/ 30 октября 2019

Можно ли загрузить файл, используя

AjaxLink<Void> downloadButton = new AjaxLink<Void>("downloadButton") { 

        @Override
        public void onClick(AjaxRequestTarget ajaxRequestTarget) {
}

? Или это может произойти только с onSubmit() действием? Потому что у меня есть рабочий код загрузки файла нажатием кнопки, но этот метод использует onSubmit. Теперь я пытаюсь сделать то же действие с такой кнопкой, она подготавливает файл таким же образом, даже создает временный файл в моих локальных файлах, но когда дело доходит до всплывающего окна в браузере, он просто ничего не делает,В чем может быть проблема?

Редактировать:

Вот рабочий код, но если я использую тот же код в моем AjaxLink, он не будет работать должным образом, как указано ранее:

 @Override
        protected void onSubmit() {
            super.onSubmit();

                        File file = null;

                        try {
                            file = File.createTempFile("temp-file-name", ".csv");
                            String data = getData();
                            if (data == null) {
                                FileUtils.writeByteArrayToFile(file, ("").getBytes());
                            } else {
                                FileUtils.writeByteArrayToFile(file, data.getBytes());
                            }
                        } catch (IOException e) {
                            e.printStackTrace();
                        }
                        if (file == null) {
                            throw new IllegalStateException(getClass().getName() +
                                    " failed to retrieve a File object from model");
                        }

                        final File preparedFile = file;


                        IResourceStream resourceStream = new FileResourceStream(
                                new org.apache.wicket.util.file.File(file));
                        getRequestCycle().scheduleRequestHandlerAfterCurrent(
                                new ResourceStreamRequestHandler(resourceStream) {
                                    @Override
                                    public void respond(IRequestCycle requestCycle) {
                                        super.respond(requestCycle);
                                        Files.remove(preparedFile);
                                    }
                                }.setFileName("Report.csv")
                                        .setContentDisposition(ContentDisposition.ATTACHMENT));
                    } 
            }
        }

1 Ответ

2 голосов
/ 30 октября 2019

Вы не можете просто передать файл в ответе Ajax.

Вам необходимо использовать AjaxDownloadBehavior Wicket. Это обеспечивает логику, чтобы преодолеть это ограничение.

См. https://github.com/apache/wicket/blob/0ba3ce015ae9f258246b92ac599a00481a26c37f/wicket-extensions/src/main/java/org/apache/wicket/extensions/ajax/AjaxDownloadBehavior.java

Демонстрационный код: https://github.com/apache/wicket/blob/0ba3ce015ae9f258246b92ac599a00481a26c37f/wicket-examples/src/main/java/org/apache/wicket/examples/ajax/builtin/AjaxDownloadPage.java Демонстрация в действии: http://examples8x.wicket.apache.org/ajax/download

...