Spring-MVC (портлет): как вернуть PDF-файл в диалоге открытия файла? - PullRequest
8 голосов
/ 04 января 2011

В моем @ActionMapping я создаю файл PDF для пользователя. Теперь мне было интересно, как я могу вернуть этот PDF-файл пользователю в виде диалогового окна сохранения / открытия файла? Я бы предпочел это показу ссылки на скачивание, если генерация прошла успешно.

Я использую spring-mvc 3.0.5 в сочетании с портлетами. Но если у кого-то есть указатели для нормального приложения, то я, вероятно, смогу понять это оттуда. Для 2.0 я прочитал кое-что о расширении класса pdfgenerator и переворачивании в web.xml, но с тех пор нам просто нужны POJO ....


Edit: Код после предложения Адиля:

File file = new File("C:\\test.pdf");
        response.setContentType("application/pdf");

        try {
            byte[] b = new byte[(int) file.length()];
            OutputStream out = response.getPortletOutputStream();
            out.write(new FileInputStream(file).read(b));
            out.flush();
        } catch (FileNotFoundException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        return "users/main";

Ответы [ 4 ]

8 голосов
/ 04 января 2011

Вы можете записать этот файл прямо в response writer, и не забудьте изменить contentType.Например,

response.setContentType("application/pdf");
response.setHeader("Content-Disposition", "attachment;filename=something.pdf");
OutputStream out = response.getOutputStream();
out.write(pdfFileContentInBytes);
out.flush();                   

Ну, я думал, что это HttpServletResponse, что у вас есть, но это не так.Поскольку вы работаете с портлетом, это объект RenderResponse.После поиска по Интернету я нашел несколько ссылок, которые могут быть вам полезны в этом отношении.

  • Сначала рассмотрим пример Lotus Form Server Portlet , его отображениеспособ разрешения нескольких типов MIME при настройке портлета с использованием portlet.xml.

  • Вот документы Spring Portlet , в которых показано, как мы настраиваем портлет с использованием портлета.xml.У него есть элемент XML о типе mime, посмотрите, можете ли вы указать здесь значение application/pdf.

Другая идея - изменить ваш параметр на ActionResponse response вместоRenderResponse response.Я немного размыта, не знаю, какой у тебя супер класс?какой это метод?и т.д ....

Мне кажется, что проблема в разрешенных / недопустимых mime-типах для ответа портлета.

4 голосов
/ 21 июня 2011

весной mvc, ResourceResponse response

response.reset();
response.setContentType("application/pdf");
response.setProperty("Content-disposition", "attachment; filename=\"" +"example.pdf" +"\"");

InputStream fontInputStream = request.getPortletSession()
                .getPortletContext()
                .getResourceAsStream("/WEB-INF/classes/arial.ttf");
Document document = new Document(PageSize.A4, 40, 40, 40, 50);
PdfWriter writer = PdfWriter.getInstance(document,
response.getPortletOutputStream());
document.addAuthor("XYZ");
document.addTitle("ASDF");
document.open();
1 голос
/ 24 января 2012

Вот ответ после того, как я немного поработал: Обслуживание PDF в Spring Portlet MVC Architecture - Liferay 6.0.6

Решением является использование механизма обслуживания ресурсов из JSR 286. ResourceResponse res имеет метод res.setContentType("application/pdf");, поэтому вы можете использовать его для обслуживания ресурсов любого типа. Если вам нужно скачать его как вложение, используйте это:

res.addProperty(HttpHeaders.CONTENT_DISPOSITION,"attachment");

0 голосов
/ 25 января 2013

Мой код:

ResourceMapping ("getPDF")

public void descargarRecibo(ResourceRequest request,
        ResourceResponse response, PortletSession session,
        ModelMap modelMap) {
    FileInputStream fileInputStream = null;
    BufferedInputStream bufferedInputStream = null;

    String fileURL = "c:/intranetdoc/PDetalleLlamadas/file.pdf";

    try {
        fileInputStream = new java.io.FileInputStream(fileURL);
        OutputStream outputStream = response.getPortletOutputStream();
        response.setContentType("application/pdf");
        response.addProperty("Content-Disposition", "attachment; filename="
                + fileName);
        bufferedInputStream = new java.io.BufferedInputStream(
                fileInputStream);
        byte[] bytes = new byte[bufferedInputStream.available()];
        response.setContentLength(bytes.length);
        int aByte = 0;
        while ((aByte = bufferedInputStream.read()) != -1) {
            outputStream.write(aByte);
        }
        outputStream.flush();
        bufferedInputStream.close();
        response.flushBuffer();
    } catch (Exception e) {
        e.printStackTrace();
    }
}
...