繁体   English   中英

关于 java 中的流的问题

[英]Question regarding streams in java

我们有以下要求。

我们必须创建一个 excel/pdf 报告,然后单击 java web 应用程序中的按钮下载它。 pdf/excel 文件是使用应用程序数据动态创建的。

我们不应该在服务器上创建任何物理文件。

我们如何 go 关于这个? 是否有任何流可以让我在同一个 go 中读取和写入,而不必在两者之间关闭。

您可以使用基于内存的流(例如ByteArrayInputStreamByteArrayOutputStream )并使用相同的底层字节缓冲区来解决问题的同一 go 部分中的读/写问题。

正如其他人指出的那样,您可以直接写入响应的 output stream 。

查看ServletResponse.getOutputStream()

您需要将报告 API 创建的 stream 写入此 stream。 不要忘记使用同一 class 的setContentType()方法设置正确的content-type

在这里您可以找到如何使用 jxl API 来完成它,它也可能对您有所帮助。 如何从 Servlet 中 output 和 Excel 文件?

无论您使用什么 PDF 或 Excel API 来生成文件,您都应该查找使用OutputStream将生成的 PDF/Excel 内容写入的构造函数或方法。 您应该只使用response.getOutputStream()而不是FileOutputStream来提供它。

例如,用于 PDF 的 iText:

response.setContentType("application/pdf");
response.setHeader("Content-Disposition", "attachment; filename=\"" + filename + "\"");
PdfWriter pdfWriter = PdfWriter.getInstance(document, response.getOutputStream());
// ...

和 Excel 的 Apache POI:

response.setContentType("application/vnd.ms-excel");
response.setHeader("Content-Disposition", "attachment; filename=\"" + filename + "\"");
WritableWorkbook workBook = Workbook.createWorkbook(response.getOutputStream());
// ...

让 Servlet 将 pdf/excel 文件作为字节数组提供。

@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {    
    byte[] bytes = null; // get this from somewhere in your app
    String fileName = "filename.pdf"; // whatever you wish to name the file

    ServletOutputStream out = response.getOutputStream();
    response.setHeader("Content-Disposition", "attachment; filename=\"" + fileName + "\"");
    response.setContentType("application/pdf");
    response.setContentLength(bytes.length);
    out.write(bytes);
    out.flush();
}

MS Excel 文件的 MIME 类型为application/vnd.ms-excel

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM