RS,以便用户看到Excel的下载弹出窗口?
我编写了使用REST JAX-RS生成Excel文件的代码,并确认生成的Excel文件位于GlassFish服务器目录中。
但是我的目标是当用户点击按钮(生成Excel .xls)时,我想要下载弹出窗口来显示询问用户是否要保存或打开.xls文件,就像任何其他用于下载任何类型文件的Web服务一样。
根据我的搜索,步骤是:
生成Excel .xls(完成)
写excel流
在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来完成。 让你的方法返回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响应头和流来在浏览器中显示下载弹出。 注意:我正在使用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
