Можно ли контролировать имя файла для ответа от службы отдыха Джерси? - PullRequest
18 голосов
/ 16 марта 2011

В настоящее время у меня есть метод в Джерси, который извлекает файл из хранилища содержимого и возвращает его в качестве ответа. Файл может быть в формате JPEG, GIF, PDF, DOCX, HTML и т. Д. (В основном что-нибудь). Однако в настоящее время я не могу понять, как я могу контролировать имя файла, поскольку каждый файл загружается автоматически с именем (скачать. [Расширение файла], т.е. (download.jpg, download.docx, download.pdf). Есть ли способ, которым я Можно задать имя файла? У меня уже есть его в строке, но я не знаю, как настроить ответ, чтобы он отображал это имя файла вместо значения по умолчанию "download".

@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 ]

28 голосов
/ 23 апреля 2013

Еще лучший способ, более безопасный, с использованием класса Джерси 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();
25 голосов
/ 16 марта 2011

Вы можете добавить "Content-Disposition header" к ответу, например,

rb.header("Content-Disposition",  "attachment; filename=\"thename.jpg\"");
1 голос
/ 05 августа 2014

В случае, если вы не используете класс ResponseBuilder, вы можете установить заголовок непосредственно в Response, что исключает любые дополнительные зависимости:

return Response.ok(entity).header("Content-Disposition", "attachment; filename=\"somefile.jpg\"").build();
0 голосов
/ 14 декабря 2015
@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();
    }

Здесь я нахожу решение моей проблемы. Я добавил имя файла в заголовок ответа.

...