如何在JAX-RS中设置响应头,以便用户看到Excel的下载popup窗口?

我编写了使用REST JAX-RS生成Excel文件的代码,并确认生成的Excel文件位于GlassFish服务器目录中。

但是我的目标是当用户点击button(生成Excel .xls)时,我想下载popup窗口,显示询问用户是否要保存或打开.xls文件,就像其他Web服务一样,下载任何types的文件。

根据我的search,步骤是:

  1. 生成Excel .xls(DONE)

  2. 写excelstream

  3. 在JAX-RS文件中,将响应头设置为类似的东西,

    String fileName =“Blah_Report.xls”; response.setHeader(“Content-Disposition”,“attachment; filename =”+ fileName);

我的问题是我在JAX-RS文件中做了所有这一切,我没有可用的HttpServletResponse对象。

根据添加响应头到JAX-RS Webservice的答案

他说:

你可以在你的webservice中通过@Context注释来注入对实际HttpServletResponse的引用,并使用addHeader()等来添加你的头文件。

没有示例代码,我无法确切地说明究竟是什么意思。

您不需要HttpServletResponse在响应上设置标题。 你可以使用javax.ws.rs.core.Response来完成。 只要让你的方法返回响应而不是实体:

return Response.ok(entity).header("Content-Disposition", "attachment; filename=" + fileName).build() 

如果您仍想使用HttpServletResponse,则可以将其注入到其中一个类字段,或者使用属性或方法参数:

 @Path("/resource") class MyResource { // one way to get HttpServletResponse @Context private HttpServletResponse anotherServletResponse; // another way Response myMethod(@Context HttpServletResponse servletResponse) { // ... code } } 
 @Context ServletContext ctx; @Context private HttpServletResponse response; @GET @Produces(MediaType.APPLICATION_OCTET_STREAM) @Path("/download/{filename}") public StreamingOutput download(@PathParam("filename") String fileName) throws Exception { final File file = new File(ctx.getInitParameter("file_save_directory") + "/", fileName); response.setHeader("Content-Length", String.valueOf(file.length())); response.setHeader("Content-Disposition", "attachment; filename=\""+ file.getName() + "\""); return new StreamingOutput() { @Override public void write(OutputStream output) throws IOException, WebApplicationException { Utils.writeBuffer(new BufferedInputStream(new FileInputStream(file)), new BufferedOutputStream(output)); } }; } 

我想通过标准的servlet来设置HTTP响应头和stream来在浏览器中显示下载popup。 注意:我正在使用Excella,excel输出API。

 package local.test.servlet; import java.io.IOException; import java.net.URL; import java.net.URLDecoder; import javax.servlet.ServletException; import javax.servlet.annotation.WebServlet; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import local.test.jaxrs.ExcellaTestResource; import org.apache.poi.ss.usermodel.Workbook; import org.bbreak.excella.core.BookData; import org.bbreak.excella.core.exception.ExportException; import org.bbreak.excella.reports.exporter.ExcelExporter; import org.bbreak.excella.reports.exporter.ReportBookExporter; import org.bbreak.excella.reports.model.ConvertConfiguration; import org.bbreak.excella.reports.model.ReportBook; import org.bbreak.excella.reports.model.ReportSheet; import org.bbreak.excella.reports.processor.ReportProcessor; @WebServlet(name="ExcelServlet", urlPatterns={"/ExcelServlet"}) public class ExcelServlet extends HttpServlet { @Override protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { try { URL templateFileUrl = ExcellaTestResource.class.getResource("myTemplate.xls"); // /C:/Users/m-hugohugo/Documents/NetBeansProjects/KogaAlpha/build/web/WEB-INF/classes/local/test/jaxrs/myTemplate.xls System.out.println(templateFileUrl.getPath()); String templateFilePath = URLDecoder.decode(templateFileUrl.getPath(), "UTF-8"); String outputFileDir = "MasatoExcelHorizontalOutput"; ReportProcessor reportProcessor = new ReportProcessor(); ReportBook outputBook = new ReportBook(templateFilePath, outputFileDir, ExcelExporter.FORMAT_TYPE); ReportSheet outputSheet = new ReportSheet("MySheet"); outputBook.addReportSheet(outputSheet); reportProcessor.addReportBookExporter(new OutputStreamExporter(response)); System.out.println("wtf???"); reportProcessor.process(outputBook); System.out.println("done!!"); } catch(Exception e) { System.out.println(e); } } //end doGet() @Override protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { } }//end class class OutputStreamExporter extends ReportBookExporter { private HttpServletResponse response; public OutputStreamExporter(HttpServletResponse response) { this.response = response; } @Override public String getExtention() { return null; } @Override public String getFormatType() { return ExcelExporter.FORMAT_TYPE; } @Override public void output(Workbook book, BookData bookdata, ConvertConfiguration configuration) throws ExportException { System.out.println(book.getFirstVisibleTab()); System.out.println(book.getSheetName(0)); //TODO write to stream try { response.setContentType("application/vnd.ms-excel"); response.setHeader("Content-Disposition", "attachment; filename=masatoExample.xls"); book.write(response.getOutputStream()); response.getOutputStream().close(); System.out.println("booya!!"); } catch(Exception e) { System.out.println(e); } } }//end class