2014-07-12 41 views
6

Ben jersey/JAX-RS uygulanması için yeni.Forma indirmek ve kaydetmek için Jersey client

Client client = Client.create(); 
WebResource wr = client.resource("http://localhost:7070/upload-0.0.1-SNAPSHOT/rest/files/download"); 
Builder wb=wr.accept("application/json,application/pdf,text/plain,image/jpeg,application/xml,application/vnd.ms-excel"); 
ClientResponse clientResponse= wr.get(ClientResponse.class); 
System.out.println(clientResponse.getStatus()); 
File res= clientResponse.getEntity(File.class); 
File downloadfile = new File("C://Data/test/downloaded/testnew.pdf"); 
res.renameTo(downloadfile); 
FileWriter fr = new FileWriter(res); 
fr.flush(); 

My Sunucu tarafı kodudur: dosyayı indirmek için benim forma istemci kod aşağıda bulabilirsiniz

müvekkilimin kodu ı 200 OK olarak tepkisini alıyorum, ama kurtarmak alamıyorum olarak
@Path("/download") 
    @GET 
    @Produces({"application/pdf","text/plain","image/jpeg","application/xml","application/vnd.ms-excel"}) 
    public Response getFile() 
    { 

     File download = new File("C://Data/Test/downloaded/empty.pdf"); 
     ResponseBuilder response = Response.ok((Object)download); 
     response.header("Content-Disposition", "attachment; filename=empty.pdf"); 
     return response.build(); 
    } 

Sabit diskteki dosyam Aşağıdaki satırda dosyaların kaydedilmesi gereken yol ve konumdan bahsediyorum. Burada neyin yanlış gittiğinden emin değil, herhangi bir yardım takdir edilecektir. Şimdiden teşekkürler!

File downloadfile = new File("C://Data/test/downloaded/testnew.pdf"); 

cevap

4

Jersey burada var gibi sadece bir dosya ile cevap bakalım eğer bilmiyorum:

File download = new File("C://Data/Test/downloaded/empty.pdf"); 
ResponseBuilder response = Response.ok((Object)download); 

Sen kesinlikle sunucudan dosya göndermek için bir StreamingOutput yanıtını kullanabilirsiniz, böyle:

StreamingOutput stream = new StreamingOutput() { 
    @Override 
    public void write(OutputStream os) throws IOException, 
    WebApplicationException { 
     Writer writer = new BufferedWriter(new OutputStreamWriter(os)); 

     //@TODO read the file here and write to the writer 

     writer.flush(); 
    } 
}; 

return Response.ok(stream).build(); 

ve müşteri akışı okuma ve bir dosyaya koydu beklenir:

InputStream in = response.getEntityInputStream(); 
if (in != null) { 
    File f = new File("C://Data/test/downloaded/testnew.pdf"); 

    //@TODO copy the in stream to the file f 

    System.out.println("Result size:" + f.length() + " written to " + f.getPath()); 
} 
+0

@GET yerine @POST ile yapmak mümkün mü? – spr

+0

Kesinlikle öyle. Büyük ölçüde birbirleriyle değiştirilebilirler. Gönderiyi tercih ederim çünkü vücut sabitlenebilir ve parametreler görünmez (görünür olmamalıdır). –

2

Halen bir çözüm arayan kişiler için, burada bir Dosyaya nasıl Jaxrs yanıtı kaydedileceğinin tam kodu verilmiştir.

public void downloadClient(){ 
    Client client = ClientBuilder.newClient(); 
    WebTarget target = client.target("http://localhost:7070/upload-0.0.1-SNAPSHOT/rest/files/download"); 

    Response resp = target 
     .request("application/pdf,image/jpeg,application/xml,application/vnd.ms-excel") 
     .get(); 

    if(resp.getStatus() == Response.Status.OK.getStatusCode()) 
    { 
     InputStream is = resp.readEntity(InputStream.class); 
     fetchFeed(is); 
     //fetchFeedAnotherWay(is) //use for Java 7 
     IOUtils.closeQuietly(is); 
     System.out.println("the file details after call:"+downloadfile.getAbsolutePath()+", size is "+downloadfile.length()); 
    } 
    else{ 
     throw new WebApplicationException("Http Call failed. response code is"+resp.getStatus()+". Error reported is"+resp.getStatusInfo()); 
    } 
} 
/** 
* Store contents of file from response to local disk using java 7 
* java.nio.file.Files 
*/ 
private void fetchFeed(InputStream is){ 
    File downloadfile = new File("C://Data/test/downloaded/testnew.pdf"); 
    byte[] byteArray = IOUtils.toByteArray(is); 
    FileOutputStream fos = new FileOutputStream(downloadfile); 
    fos.write(byteArray); 
    fos.flush(); 
    fos.close(); 
} 

/** 
* Alternate way to Store contents of file from response to local disk using 
* java 7, java.nio.file.Files 
*/ 
private void fetchFeedAnotherWay(InputStream is){ 
    File downloadfile = new File("C://Data/test/downloaded/testnew.pdf"); 
    Files.copy(is, downloadfile.toPath(), StandardCopyOption.REPLACE_EXISTING); 
} 
2

Aşağıdaki örnek kod size yardımcı olabilir.

https://stackoverflow.com/a/32253028/15789

Bu

JAX RS dinlenme hizmet ve test istemcisidir. Bir dosyadan baytları okur ve baytları REST hizmetine yükler. REST hizmeti baytları fermuarlar ve istemciye bayt olarak geri gönderir. İstemci baytları okur ve sıkıştırılmış dosyayı kaydeder. Bunu başka bir ileti dizisine yanıt olarak gönderdim.

0

File.copy() kullanarak bunu yapmanın başka bir yolu.

private long downloadReport(String url){ 

      long bytesCopied = 0; 
      Path out = Paths.get(this.fileInfo.getLocalPath()); 

      try { 

       WebTarget webTarget = restClient.getClient().target(url); 
       Invocation.Builder invocationBuilder = webTarget.request(MediaType.TEXT_PLAIN_TYPE); 

       Response response = invocationBuilder.get(); 

       if (response.getStatus() != 200) { 
        System.out.println("HTTP status " response.getStatus()); 
        return bytesCopied; 
       } 

       InputStream in = response.readEntity(InputStream.class); 
       bytesCopied = Files.copy(in, out, REPLACE_EXISTING); 

       in.close(); 

      } catch(IOException e){ 
       System.out.println(e.getMessage()); 
      } 

      return bytesCopied; 
    } 
İlgili konular