Клиент Джерси для загрузки и сохранения файла

Я новичок в реализации трикотажа/JAX-RS. Пожалуйста, найдите ниже мой клиентский код джерси для загрузки файла:

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

Мой код на стороне сервера:

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

В моем клиентском коде я получаю ответ как 200 OK, но я не могу сохранить свой файл на жестком диске. В строке ниже я указываю путь и место, где файлы должны быть сохранены. Не уверен, что здесь что-то не так, любая помощь будет оценена по достоинству. Заранее спасибо!!

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

person cxyz    schedule 12.07.2014    source источник


Ответы (4)


Я не знаю, позволит ли вам Джерси просто ответить файлом, как у вас здесь:

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

Вы можете использовать ответ StreamingOutput для отправки файла с сервера, например:

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

и ваш клиент ожидает прочитать поток и поместить его в файл:

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());
}
person Paul Jowett    schedule 29.10.2014
comment
Можно ли использовать @POST вместо @GET? - person spr; 02.01.2017
comment
Это определенно. В значительной степени они взаимозаменяемы. Я предпочитаю пост обычно, потому что тело может быть защищено, а параметры не видны (там, где их не должно быть видно). - person Paul Jowett; 11.04.2017

Для тех, кто все еще ищет решение, вот полный код того, как сохранить ответ jaxrs в файл.

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);
}
person pNut    schedule 23.07.2015

Этот пример кода ниже может вам помочь.

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

Это служба отдыха JAX RS и тестовый клиент. Он считывает байты из файла и загружает байты в службу REST. Служба REST архивирует байты и отправляет их клиенту в виде байтов. Клиент читает байты и сохраняет заархивированный файл. Я разместил это как ответ на другую тему.

person RuntimeException    schedule 27.08.2015

Вот еще один способ сделать это с помощью Files.copy().

    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;
     }
person Michael Pawlowsky    schedule 01.08.2016