开发者

Question regarding streams in java

We have the below requireme开发者_开发百科nt.

We will have to create an excel/pdf report and then download it on click of a button in a java web application. The pdf/excel file is dynamically created using application data.

We should not create any physical file on the server.

How do we go about this? Are there any streams through which I can read and write in the same go without having to close in between.


You could use memory-based streams (such as ByteArrayInputStream and ByteArrayOutputStream) and use the same underlying byte buffer to address the read/write in the same go part of the question.

As others have pointed out, you can just write directly to the output stream of the response.


Look at ServletResponse.getOutputStream().

You need to write to this stream from the one created by your report API. Don't forget to set the proper content-type using setContentType() method of the same class.


Here you can find how you can do it with jxl API and it may help you also. How do I output an Excel file from a Servlet?


Whatever PDF or Excel API you are using to generate the files, you should lookup the constructor or method which takes an OutputStream to write the generated PDF/Excel content to. You should just feed it with response.getOutputStream() instead of FileOutputStream.

For example, iText for PDFs:

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

And Apache POI for Excel:

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


Have a Servlet serve the pdf/excel file as a byte array.

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

MIME type for MS Excel files would be application/vnd.ms-excel.

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜