Сделать перезагрузку страницы после загрузки файла - PullRequest
0 голосов
/ 07 октября 2019

Я отправляю отчет о яшме в формате PDF для скачивания. Но когда я это делаю, я не могу перезагрузить или перенаправить страницу.

Страница, которая вызывает загрузку, использует отправку формы для начала загрузки файла. Ответ, предоставленный Говиндой Сахаре, был опубликован до того, как я сделал это разъяснение. Однако его ответ может быть реализован без особых усилий, так как форма имеет только один выбор (большой или маленький).

Ниже приведена функция, которая обрабатывает ответ сервера:

    private void generateReportPDF(JasperReport jasperReport, List<? extends Object> data, Map<String, Object> parameters, HttpServletResponse resp) throws Exception {
        byte[] bytes = null;
        if( data == null ) {
            bytes = JasperRunManager.runReportToPdf(jasperReport, parameters, reportDao.getConnection());
        }
        else {
            bytes = JasperRunManager.runReportToPdf(jasperReport, parameters, new JRBeanCollectionDataSource(data));
        }
        resp.reset();
        resp.resetBuffer();
        resp.setContentType("application/pdf");
        resp.addHeader("Content-Disposition", "attachment; filename=" + jasperReport.getName() + ".pdf");
        resp.setContentLength(bytes.length);

        ServletOutputStream ouputStream = resp.getOutputStream();

        ouputStream.write(bytes, 0, bytes.length);
        ouputStream.flush();
        ouputStream.close();
        return;
    }

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

SEVERE: Servlet.service() for servlet [myapp-dispatcher] in context with path [/myapp] threw exception [Request processing failed; nested exception is java.lang.IllegalStateException: Cannot call sendRedirect() after the response has been committed] with root cause
java.lang.IllegalStateException: Cannot call sendRedirect() after the response has been committed

Я хочу перезагрузить страницу. Это на экране печати этикеток, и после загрузки файла я хочу, чтобы страница перезагрузилась / перенаправила себя так, чтобы напечатанные этикетки отображались на новом месте. Поскольку контроллер не может перенаправить, я должен изменить исходный процесс, который обрабатывает ответ, или реализовать JavaScript, чтобы он происходил после обработки файла.

Этот вопрос запрашивает перехватзагружает и отвечает на них, но не требует весны, поэтому ответы потребуют больше изменений, чем я хочу сделать.

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

 $(document).ready(function() {
        $('#printBtn').click(function() {


            if(confirm('<spring:message code="print.alert.confirm"/>') ? true : false)
                {
                    window.addEventListener('focus', window_focus, false);
                     function window_focus(){
                        //remove buttons
                        var elem1 = document.getElementById('printBtn');
                        elem1.parentNode.removeChild(elem1);
                        //elem1.parentNode.replaceChild(newbutton);
                        var elem2 = document.getElementById('clearBtn');
                        elem2.parentNode.removeChild(elem2);
                        var elem3 = document.getElementById('restoreBtn');
                        elem3.parentNode.removeChild(elem3);
                        document.getElementById('button_spot').innerHTML = "The page will reload after you get the file.";

                        //watch for page to lose focus due to download dialog box
                        window.addEventListener('focusout', pageNoFocus);
                        function pageNoFocus(){
                            //watch for page to resume focus
                            window.removeEventListener('focusout', pageNoFocus);
                            window.addEventListener('focus', pageFocus);
                            function pageFocus(){
                                window.removeEventListener('focus', pageFocus);
                                location.reload();
                            }
                        }
                    }

                    return true;
                }
            return false;


        });

        $('#clearBtn').click(function() {
            return confirm('<spring:message code="print.alert.clear"/>') ? true : false;
        });

        $('#restoreBtn').click(function() {
            return confirm('<spring:message code="print.alert.restore"/>') ? true : false;
        });
    });

1 Ответ

1 голос
/ 07 октября 2019

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

<a href="#" id="download">Download</a>
<a href="downloadfileURL" target="_blank" id="downloadFile" /> 
<!-- change href with Spring mapping which will download the file -->

При нажатии на ссылку «Загрузка» будет щелкать ссылку, которая указывает на фактический URL-адрес. Файл будет загружен, после чего он будет перенаправлен на window.location.href

$("#download").click(function () {
   $("#downloadFile")[0].click();
   window.location.href = "/abc.html"; // change to the desired URL
});

. Если вы загружаете файл с помощью отправки формы, используйте приведенный ниже фрагмент.

$("#formId").click(function (e) {
   e.preventDefault();
   $("#downloadFile")[0].click();
   window.location.href = "/abc.html"; // change to the desired URL
});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...