2011-03-15 4 views
18

Actuellement, j'ai une méthode dans Jersey qui récupère un fichier à partir d'un référentiel de contenu et le renvoie en tant que réponse. Le fichier peut être un fichier jpeg, gif, pdf, docx, html, etc. (essentiellement n'importe quoi). Actuellement, cependant, je n'arrive pas à comprendre comment je peux contrôler le nom de fichier car chaque fichier se télécharge automatiquement avec le nom (download. [Extension de fichier] ie (download.jpg, download.docx, download.pdf). peut définir le nom du fichier? Je l'ai déjà dans une chaîne, mais je ne sais pas comment définir la réponse afin qu'il montre que le nom de fichier au lieu de défaut à « télécharger ».Est-il possible de contrôler le nom de fichier d'une réponse provenant d'un service 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(); 
} 

Répondre

24

Vous pouvez ajouter un "Content-Disposition header" à la réponse, par exemple

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

Je ne peux pas ajouter cette chaîne à l'en-tête _Content-Disposition_ 'filename '= UTF-8' 'url_encoded_filename'. Est-ce que tu sais pourquoi? – gkiko

23

Une façon encore meilleure, ce qui est plus typé, en utilisant le Jersey fourni ContentDisposition classe:

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 vient de 'org.glassfish.jersey.media' /' jersey-media-multipart', que vous n'avez peut-être pas déjà si vous faites du JSON exclusivement entre le client et le serveur. – Patrick

+2

À Jersey 1.17. ça vient de 'com.sun.jersey.core.header.ContentDisposition' – koppor

0

Dans le cas où vous n'utilisez pas la classe ResponseBuilder, vous pouvez définir l'en-tête directement sur la réponse, ce qui évite les dépendances supplémentaires:

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

je trouve ici la solution à mon problème. J'ai ajouté le nom de fichier dans l'en-tête de réponse.

Questions connexes