目前我在Jersey有一个方法,它从内容存储库中检索文件并将其作为响应返回。该文件可以是jpeg,gif,pdf,docx,html等(基本上任何东西)。但是,目前我无法弄清楚如何控制文件名,因为每个文件都会自动下载名称(下载。[文件扩展名]即(download.jpg,download.docx,download.pdf)。有没有办法让我可以设置文件名吗?我已经把它放在一个字符串中,但我不知道如何设置响应,以便它显示文件名而不是默认为“下载”。
@GET
@Path("/download/{id}")
public Response downloadContent(@PathParam("id") String id)
{
String serverUrl = "http://localhost:8080/alfresco/service/cmis";
String username = "admin";
String password = "admin";
Session session = getSession(serverUrl, username, password);
Document doc = (Document)session.getObject(session.createObjectId(id));
String filename = doc.getName();
ResponseBuilder rb = new ResponseBuilderImpl();
rb.type(doc.getContentStreamMimeType());
rb.entity(doc.getContentStream().getStream());
return rb.build();
}
答案 0 :(得分:27)
使用泽西提供的ContentDisposition
类:
ContentDisposition contentDisposition = ContentDisposition.type("attachment")
.fileName("filename.csv").creationDate(new Date()).build();
return Response.ok(
new StreamingOutput() {
@Override
public void write(OutputStream outputStream) throws IOException, WebApplicationException {
outputStream.write(stringWriter.toString().getBytes(Charset.forName("UTF-8")));
}
}).header("Content-Disposition",contentDisposition).build();
答案 1 :(得分:25)
您可以在回复中添加"Content-Disposition
header",例如
rb.header("Content-Disposition", "attachment; filename=\"thename.jpg\"");
答案 2 :(得分:0)
如果您没有使用ResponseBuilder类,可以直接将标头设置到Response上,这样可以避免任何额外的依赖:
return Response.ok(entity).header("Content-Disposition", "attachment; filename=\"somefile.jpg\"").build();
答案 3 :(得分:0)
@GET
@Path("zipFile")
@Produces("application/zip")
public Response getFile() {
File f = new File("/home/mpasala/Documents/Example.zip");
String filename= f.getName();
if (!f.exists()) {
throw new WebApplicationException(404);
} else {
Boolean success = moveFile();
}
return Response
.ok(f)
.header("Content-Disposition",
"attachment; filename="+filename).build();
}
在这里,我找到了解决问题的方法。我在响应标题中添加了文件名。