How to set response header in JAX-RS so that user sees download popup for Excel? How to set response header in JAX-RS so that user sees download popup for Excel? java java

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