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

后端 未结 3 444
慢半拍i
慢半拍i 2020-12-01 03:02

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 clic

相关标签:
3条回答
  • 2020-12-01 03:14
    @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));
            }
        };
    }
    
    0 讨论(0)
  • 2020-12-01 03:26

    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
      }
    }
    
    0 讨论(0)
  • 2020-12-01 03:31

    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
    
    0 讨论(0)
提交回复
热议问题