How to set response header in JAX-RS so that user sees download popup for Excel?
You don't need HttpServletResponse to set a header on the response. You can do it using javax.ws.rs.core.Response. Just make your method to return Response instead of entity:
return Response.ok(entity).header("Content-Disposition", "attachment; filename=\"" + fileName + "\"").build()
If you still want to use HttpServletResponse you can get it either injected to one of the class fields, or using property, or to method parameter:
@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)); } };}
I figured to set HTTP response header and stream to display download-popup in browser via standard servlet. note: I'm using Excella, excel output 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 classclass 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