mas*_*san 47 java rest header jax-rs glassfish-3
我编写了使用REST JAX-RS生成Excel文件的代码,并确认生成的Excel文件位于GlassFish服务器目录中.
但我的目标是当用户点击按钮(生成Excel .xls)时,我想要下载弹出窗口,询问用户是否保存或打开.xls文件,就像任何其他Web服务用于下载任何类型的文件一样.
根据我的搜索,步骤是:
生成Excel .xls(DONE)
将excel写入流
在JAX-RS文件中,将响应头设置为类似的,
String fileName ="Blah_Report.xls"; response.setHeader("Content-Disposition","attachment; filename ="+ fileName);
我的问题是我在JAX-RS文件中做了所有这些,而且我没有可用的HttpServletResponse对象.
根据Add Response Header到JAX-RS Webservice的答案
他说:
您可以通过Web服务中的@Context注释注入对实际HttpServletResponse的引用,并使用addHeader()等来添加标头.
如果没有示例代码,我无法确切地说明这意味着什么.
Tar*_*log 86
您不需要HttpServletResponse来在响应上设置标头.你可以使用javax.ws.rs.core.Response来做到这一点.只需让您的方法返回Response而不是实体:
return Response.ok(entity).header("Content-Disposition", "attachment; filename=\"" + fileName + "\"").build()
Run Code Online (Sandbox Code Playgroud)
如果您仍想使用HttpServletResponse,您可以将其注入其中一个类字段,或使用property或方法参数:
@Path("/resource")
class MyResource {
// one way to get HttpServletResponse
@Context
private HttpServletResponse anotherServletResponse;
// another way
Response myMethod(@Context HttpServletResponse servletResponse) {
// ... code
}
}
Run Code Online (Sandbox Code Playgroud)
小智 16
@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));
}
};
}
Run Code Online (Sandbox Code Playgroud)