2012-04-11 22 views
13

Il mio requisito è, dovrei inviare un file zip 10MB al client con un servizio riposante. Ho trovato il codice nei forum che l'invio di un oggetto StreamingOutput è il modo migliore, ma come posso creare un oggetto StreamingOutput nel codice seguente:download di file in servizi Web restful

@Path("PDF-file.pdf/") 
@GET 
@Produces({"application/pdf"}) 
public StreamingOutput getPDF() throws Exception { 
    return new StreamingOutput() { 
    public void write(OutputStream output) throws IOException, WebApplicationException  
    { 
     try { 
      //------ 
     } catch (Exception e) { 
      throw new WebApplicationException(e); 
     } 
    } 
    }; 
} 

risposta

22

Suo il modo migliore e modo semplice per il file dowload.

private static final String FILE_PATH = "d:\\Test2.zip"; 
@GET 
@Path("/get") 
@Produces(MediaType.APPLICATION_OCTET_STREAM) 
public Response getFile() { 
    File file = new File(FILE_PATH); 
    ResponseBuilder response = Response.ok((Object) file); 
    response.header("Content-Disposition", "attachment; filename=newfile.zip"); 
    return response.build(); 

} 

Per il codice come si chiesto:

@GET 
@Path("/helloWorldZip") 
@Produces(MediaType.APPLICATION_OCTET_STREAM) 
public StreamingOutput helloWorldZip() throws Exception { 
    return new StreamingOutput(){ 
    @Override 
     public void write(OutputStream arg0) throws IOException, WebApplicationException { 
      // TODO Auto-generated method stub 
      BufferedOutputStream bus = new BufferedOutputStream(arg0); 
      try { 
       //ByteArrayInputStream reader = (ByteArrayInputStream) Thread.currentThread().getContextClassLoader().getResourceAsStream();  
       //byte[] input = new byte[2048]; 
       java.net.URL uri = Thread.currentThread().getContextClassLoader().getResource(""); 
       File file = new File("D:\\Test1.zip"); 
       FileInputStream fizip = new FileInputStream(file); 
       byte[] buffer2 = IOUtils.toByteArray(fizip); 
       bus.write(buffer2); 
      } catch (Exception e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
      } 
     } 
    }; 
} 
+1

sto avendo una domanda simile, come recuperare il file da un client REST ad esempio, per voi aplcatio, se io do http?: // localhost: 8080/urapplication/get? – parameswar

+0

Quale riferimento stai usando per ResponseBuilder? Ho 3 potenziali riferimenti. – Lismore

+1

@Lismore 'import javax.ws.rs.core.Response.ResponseBuilder;' - Oppure usa 'Response.ResponseBuilder' nella tua sorgente - altrimenti ho avuto lo stesso problema di te. –