是否可以从Jersey Rest服务控制响应的文件名?

时间:2011-03-15 21:12:06

标签: jersey jax-rs

目前我在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();
}

4 个答案:

答案 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();
    }

在这里,我找到了解决问题的方法。我在响应标题中添加了文件名。