Java 如何在jax rs中显示PDF文件下载对话框?

Java 如何在jax rs中显示PDF文件下载对话框?,java,rest,pdf,download,jax-rs,Java,Rest,Pdf,Download,Jax Rs,我正在使用Jasper Report创建REST应用程序和PDF,并希望在浏览器上显示PDF文件下载对话框 这正是我想要的: 我下面的代码创建了一个PDF文件MyAwesomeJasperReport25.PDF,但是浏览器上没有显示文件下载对话框,我不明白为什么 @GET @Path("pdf") @Produces("application/pdf") public Response outputPDF() { OutputStream output = null; t

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

这正是我想要的:

我下面的代码创建了一个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); }

    }
}
检查两件事:

您不应该在response entity response.okObject filePath中放置文件实例而不是文件路径吗? JAX-RS实现是否具有文件类的实体提供程序?
您忘记将输出对象置于Ok方法中:

ResponseBuilder response=response.ok对象文件路径

正确:


ResponseBuilder response=response.ok输出文件路径

尝试将文件字节[]放入实体中,因为Jersey没有用于文件的MessageBodyWriter。您可以使用Apache Commons IO中的FileUtils将文件转换为字节[]。最后,您的代码如下所示:

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

你说得对。我应该有文件实例而不是文件路径。谢谢第二个问题,我要检查一下……你确定吗?输出是实例,不能用于对变量filepath进行强制转换。它甚至可以编译吗?