spring-mvc(portlet):如何在打开文件对话框中返回pdf文件?

时间:2011-01-04 10:43:40

标签: java spring spring-mvc portlet spring-portlet-mvc

在我的@ActionMapping我为用户创建了一个PDF文件。 现在我想知道如何以保存/打开文件对话框的形式将这个pdf返回给用户? 如果这一代人成功的话,我更愿意这样做而不是显示下载链接。

我将spring-mvc 3.0.5与portlet结合使用。但是,如果有人有一些正常应用程序的指针,那么我可以从那里弄清楚。 对于2.0,我读了一些关于扩展pdfgenerator类并在web.xml中进行修改的内容,但是从现在开始我们只需要POJO ....


编辑: 阿德尔建议之后的代码:

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 个答案:

答案 0 :(得分:8)

您可以直接将该文件写入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你所拥有的,但事实并非如此。当您使用Portlet时,它是一个RenderResponse对象。通过互联网搜索后,我发现在这方面可能对您有所帮助的链接很少。

  • 首先以Lotus Form Server Portlet为例,展示如何在使用portlet.xml配置portlet时允许多个mime类型。

  • 这是Spring Portlet docs,它显示了我们如何使用portlet.xml配置portlet。它有一个关于mime-type的XML元素,看看你是否可以在那里给出值application/pdf

另一个想法是将参数更改为ActionResponse response,而不是RenderResponse response。我在这里有点模糊,不确定你的超级班级是什么?它是什么方法?等....

对我而言,似乎问题是允许/不允许的mime-types用于portlet响应。

答案 1 :(得分:4)

在spring mvc中,ResourceResponse响应

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();

答案 2 :(得分:1)

这是我解决了一段时间之后的答案: Serve PDF in Spring Portlet MVC Architecture - Liferay 6.0.6

解决方案是使用JSR 286中的资源服务机制。ResourceResponse res具有res.setContentType("application/pdf");方法,因此您可以使用它来提供任何类型的资源。如果您需要将其作为附件下载,请使用:

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

答案 3 :(得分:0)

我的代码:

  

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();
    }
}