2011-03-15 12 views
18

Actualmente tengo un método en Jersey que recupera un archivo de un repositorio de contenido y lo devuelve como respuesta. El archivo puede ser un jpeg, gif, pdf, docx, html, etc. (básicamente cualquier cosa). Actualmente, sin embargo, no puedo entender cómo puedo controlar el nombre del archivo ya que cada archivo se descarga automáticamente con el nombre (descarga. [Extensión de archivo] ie (download.jpg, download.docx, download.pdf). ¿Hay alguna manera de que puede establecer el nombre del archivo? ya lo tengo en una cadena, pero no sé cómo configurar la respuesta para que muestre ese nombre de archivo en lugar de por defecto a "descargar".¿Es posible controlar el nombre de archivo de una respuesta de un servicio Jersey Rest?

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

Respuesta

24

se puede añadir un "Content-Disposition header" a la respuesta, por ejemplo

rb.header("Content-Disposition", "attachment; filename=\"thename.jpg\""); 
+0

No puedo agregar esta cadena a _Content-Disposition_ header 'filename * = UTF-8''url_encoded_filename'. ¿Sabes por qué? – gkiko

23

Una forma aún mejor, que es más typesafe, utilizando el Jersey proporcionado ContentDisposition clase:

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

ContentDisposition viene de 'org.glassfish.jersey.media' /' jersey-media-multipart', que es posible que no tenga si hace JSON exclusivamente entre el cliente y el servidor. – Patrick

+2

En Jersey 1.17. proviene de 'com.sun.jersey.core.header.ContentDisposition' – koppor

0

En el caso de que no está utilizando la clase ResponseBuilder, puede establecer el encabezado directamente sobre la respuesta, lo que evita cualquier dependencia adicionales:

return Response.ok(entity).header("Content-Disposition", "attachment; filename=\"somefile.jpg\"").build(); 
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(); 
    } 

Aquí encuentro la solución a mi problema. Agregué el nombre del archivo en el encabezado de respuesta.

Cuestiones relacionadas