RS so that user sees download popup for Excel?

I wrote code that generate Excel file using REST JAX-RS and I confirmed that the generated Excel file is in GlassFish server directory.

But my goal is when user click on the button (which generate Excel .xls), I want download popup to show up asking user whether to save or open the .xls file just like any other web services doing for downloading any type of files.

According to my search, the step is:

  • generate Excel .xls (DONE)

  • write the excel to stream

  • in JAX-RS file, set response header to something like,

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

  • My question is I'm doing all of this in JAX-RS file and I don't have HttpServletResponse object available.

    According to the answer from Add Response Header to JAX-RS Webservice

    He says:

    You can inject a reference to the actual HttpServletResponse via the @Context annotation in your webservice and use addHeader() etc. to add your header.

    I can't really figure what exactly that means without sample code..


    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 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
    
    链接地址: http://www.djcxy.com/p/45574.html

    上一篇: 如何为休息服务中的异常返回http状态码

    下一篇: RS,以便用户看到Excel的下载弹出窗口?