【问题标题】:how to display file download dialog for PDF in jax-rs?如何在 jax-rs 中显示 PDF 的文件下载对话框?
【发布时间】:2012-05-09 06:56:39
【问题描述】:

我正在使用 Jasper Report 创建 REST 应用程序和 PDF,并希望在浏览器上显示 PDF 的文件下载对话框。

这正是我要找的:
http://www.mkyong.com/webservices/jax-rs/download-pdf-file-from-jax-rs/

我下面的代码创建了 PDF 文件 (MyAwesomeJasperReport25.pdf),但文件下载对话框没有显示在浏览器上,我不明白为什么。

@GET
@Path("pdf")
@Produces("application/pdf")
public Response outputPDF() {

    OutputStream output = null;

    try {    
        File jrxmlFile = new File("C:\\Users\\m-takayashiki\\report2.jrxml");

        if(jrxmlFile.exists()) {

            //jrxml compile
            JasperReport jasperReport = JasperCompileManager.compileReport(jrxmlFile.getAbsolutePath());

            //some code emitted        

            JasperPrint jasperPrint = JasperFillManager.fillReport(jasperReport, params, dataSource);

            String filePath = "C:\\Users\\m-takayashiki\\MyAwesomeJasperReport25.pdf";
            output = new FileOutputStream(new File(filePath)); 
            JasperExportManager.exportReportToPdfStream(jasperPrint, output); 


            // From here trying to ask user to download PDF        

            ResponseBuilder response = Response.ok((Object) filePath);

            response.header("Content-disposition",
                    "attachment; filename=MyAwesomeJasperReportDownload.pdf");

            return response.build();
        }
    }
    catch(Exception e) {
        System.out.println("-------------------- PDF exception ");
        System.out.println(e);
        return null;
    }
    finally {
        try {
            if(output != null) { output.close(); }
        }
        catch(Exception e) { System.out.println(e); }

    }
}

【问题讨论】:

    标签: java rest pdf download jax-rs


    【解决方案1】:

    检查两件事:

    1. 您不应该将 File 的实例而不是 filePath 放在响应实体(“Response.ok((Object) filePath)”)中吗?
    2. 您的 JAX-RS 实现是否具有 File 类的实体提供程序?

    【讨论】:

    • 你是对的。我应该有文件实例而不是文件路径。谢谢!第二个问题,我去查一下..
    【解决方案2】:

    尝试将文件 byte[] 放入实体中,因为 Jersey 没有用于 File 的 MessageBodyWriter。您可以使用 Apache Commons IO 中的 FileUtils 将 File 转换为 byte[]。最后你的代码看起来像这样:

    ResponseBuilder response = Response.ok(FileUtils.readFileToByteArray(file));
    

    【讨论】:

      【解决方案3】:

      你忘了把输出对象放在Ok()方法中:

      ResponseBuilder response = Response.ok((Object) filePath);

      正确:

      ResponseBuilder response = Response.ok((output) filePath);

      【讨论】:

      • 你确定吗? “输出”是实例,不能用于转换变量“文件路径”。它甚至可以编译吗?
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-06-01
      • 2012-09-06
      • 2023-04-03
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多