gpt4 book ai didi

java - 为什么使用 JAX-RS 与 JAX-RS 时浏览器中的下载弹出窗口不显示标准servlet?

转载 作者:行者123 更新时间:2023-12-02 08:25:26 31 4
gpt4 key购买 nike

当我尝试使用标准 servlet 方法时,浏览器中会显示弹出窗口,询问我是否打开 .xls 文件或保存它。

我通过JAX-RS尝试了完全相同的代码,浏览器弹出窗口不会以某种方式显示。有人遇到过这种情况吗?

不显示弹出窗口的 JAX-RS 方式:

@Path("excellaTest")
public class ExcellaTestResource {
@Context
private UriInfo context;
@Context
private HttpServletResponse response;
@Context
private HttpServletRequest request;

public ExcellaTestResource() {
}


@Path("horizontalProcess")
@GET
//@Produces("application/vnd.ms-excel")
@Produces("application/vnd.ms-excel")
public void getProcessHorizontally() {
try {

URL templateFileUrl = this.getClass().getResource("myExcelTemplate.xls");
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("myExcelSheet");
outputBook.addReportSheet(outputSheet);

reportProcessor.addReportBookExporter(new OutputStreamExporter(response));
reportProcessor.process(outputBook);

System.out.println("done!!");
}
catch(Exception e) {
System.out.println(e);
}

return;
}


}//end class


class OutputStreamExporter extends ReportBookExporter {

private HttpServletResponse response;

public OutputStreamExporter(HttpServletResponse response) {
this.response = response;
}

//ReportProcessor output()
//This method is call when ReportProcessor process() is invoked.
//The Workbook from POI API can be used to write to stream

@Override
public void output(Workbook book, BookData bookdata, ConvertConfiguration configuration) throws ExportException {

//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

最佳答案

您使用什么 JAX-RS 框架?

我的猜测是您的代码不起作用,因为您返回的是 void。您使用的框架可能会将 void 识别为 HTTP 204 No Content。 这会导致浏览器跳过实际的响应正文并忽略内容处置 header 。

正如我已经在并行线程中写给您的:尝试返回 Response 对象。您可以将 OutputStream 或 byte[] 作为实体来设置内容处置 header 。

关于java - 为什么使用 JAX-RS 与 JAX-RS 时浏览器中的下载弹出窗口不显示标准servlet?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4622613/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com