Процесс загрузки не виден во время загрузки сервлета pdf - PullRequest
2 голосов
/ 13 сентября 2011

Я использую контент-расположение, чтобы скачать pdf.Когда я нажимаю кнопку загрузки, сначала загружается полный файл PDF, а затем браузер показывает диалоговое окно для сохранения файла.Я хочу, чтобы браузер показывал процесс загрузки.Вот мой код сервлета:

        String filename = "abc.pdf";
        String filepath = "/pdf/" + filename;
        resp.setContentType("application/pdf");
        resp.addHeader("content-disposition", "attachment; filename=" + filename);

        ServletContext ctx = getServletContext();
        InputStream is = ctx.getResourceAsStream(filepath);

        System.out.println(is.toString());
        int read = 0;

        byte[] bytes = new byte[1024];

        OutputStream os = resp.getOutputStream();           
        while ((read = is.read(bytes)) != -1) {
            os.write(bytes, 0, read);
        }
        System.out.println(read);

        os.flush();
        os.close();
        }catch(Exception ex){
            logger.error("Exception occurred while downloading pdf -- "+ex.getMessage());
            System.out.println(ex.getStackTrace());
        }

1 Ответ

3 голосов
/ 13 сентября 2011

Прогресс нельзя определить, не зная заранее длину содержимого тела ответа на стороне клиента.Чтобы сообщить клиенту о длине содержимого, необходимо установить заголовок Content-Length на стороне сервера.

Измените строку

InputStream is = ctx.getResourceAsStream(filepath);

на

URL resource = ctx.getResource(filepath);
URLConnection connection = resource.openConnection();
response.setContentLength(connection.getContentLength()); // <--- 
InputStream is = connection.getInputStream();
// ...

Не имеет отношения к конкретной проблеме , ваша обработка исключений плохая.Заменить строку

System.out.println(ex.getStackTrace());

на

throw new ServletException(ex);
...