2

每个人。

我开始使用 restEasy (jboss) java rest 客户端并遇到了一个我似乎无法解决的问题。到目前为止,我可以使用它从其余服务器(字符串形式)带回 json。但是,我需要的其余服务之一带回了一个 zip 文件。我偶然发现了一个问题。这是代码:

ClientRequest req = new ClientRequest("rest service url"); //the url is good

ClientResponse<String> res = null;

res = req.get(String.class);

ZipInputStream zip = new ZipInputStream(new 
        ByteArrayInputStream(res.getEntity().getBytes()));

ZipEntry zipEntry = zip.getNextEntry();
        System.out.println(zipEntry.getName()); 
   //here, I print the name of the first file in my archive, so, I seem to have a    
   // zip file indeed

String jsonString = IOUtils.toString(zip); 
   //bam, this is causing a zipException : invalid block type

谷歌告诉我这是读取 zip 文件的正确方法。我也尝试逐字节读取它,它在 zip.read() 上引发了 sams 异常。

我做错什么了吗?我应该怎么做才能阅读我的文件内容?

如果您对此事有任何见解,我将不胜感激。谢谢

PS:对不起,如果我听起来很奇怪,英语不是我的第一语言。

4

3 回答 3

3

假设您的服务在服务器端定义如下

/**
 *
 * http://rama-local:8081/RESTfulDemoApplication/files/download/Test.pdf 
 * Where Test.pdf is the document I have stored under SERVER_DOWNLOAD_LOCATION_FOLDER    path.
 * 
 */


 @GET
 @Path("/files/download/{fileName}")
 @Produces(MediaType.APPLICATION_OCTET_STREAM)
 public Response getFile(@PathParam("fileName") String fileName) {
    File file = new File(SERVER_DOWNLOAD_LOCATION_FOLDER+fileName);
    ResponseBuilder response = Response.ok((Object) file);
    response.header("Content-Disposition","attachment; filename="+fileName);
     return response.build();

}

您可以在客户端定义一个接口为

 public interface RestEasyFileServiceRestfulClient {


    @GET
    @Path("/files/download/{fileName}")
    @Produces(MediaType.APPLICATION_OCTET_STREAM)
    public Response getFile(@PathParam("fileName") String fileName);

}

然后您可以使用java rest客户端下载文件,如下所示

Class RestTest {

  public static void main(String[] args) throws Exception {

   String fileServiceUrl = "http://rama-local:8081/RESTfulDemoApplication/files";
    RestEasyFileServiceRestfulClient fileServiceClient =     ProxyFactory.create(RestEasyFileServiceRestfulClient.class,fileServiceUrl);

    BaseClientResponse response = (BaseClientResponse)fileServiceClient.getFile("ASD.zip");
    File s = (File)response.getEntity(File.class);
    File ff = new File("C:\\ASD.zip");
    s.renameTo(ff);
    FileWriter fr = new FileWriter(s);
    fr.flush();
    System.out.println("FileDownload Response = "+ response.getStatus());
 }
}

这需要 -resteasy-jaxrs-2.3.1.GA.jar -resteasy-multipart-provider-2.3.1.GA.jar

更多信息在

http://docs.jboss.org/resteasy/docs/1.0.2.GA/userguide/html/RESTEasy_Client_Framework.html

于 2014-12-31T19:29:10.127 回答
1
URL url = new URL("http://xyz.com/download.zip");
HttpURLConnection connection = (HttpURLConnection) url.openConnection();
connection.setRequestMethod("GET");
IntpuStream in = connection.getInputStream();
FileOutputStream out = new FileOutputStream("download.zip");
copy(in, out, 1024);
out.close();


  public static void copy(InputStream input, OutputStream output, int bufferSize) throws IOException {
    byte[] buf = new byte[bufferSize];
    int n = input.read(buf);
    while (n >= 0) {
      output.write(buf, 0, n);
      n = input.read(buf);
    }
    output.flush();
  }
于 2013-08-26T14:12:22.907 回答
0
 import java.io.FileInputStream;
 import java.io.FileOutputStream;
 import java.io.InputStream; 
 import java.util.Date; 
 import java.util.zip.ZipEntry;
 import java.util.zip.ZipInputStream;

    public class ZipReader {
        // Expands the zip file passed as argument 1, into the
        // directory provided in argument 2
        public static void main(String args[]) throws Exception
        {
            if(args.length != 2)
            {
                System.err.println("zipreader zipfile outputdir");
                return;
            }

        // create a buffer to improve copy performance later.
        byte[] buffer = new byte[2048];

        // open the zip file stream
        InputStream theFile = new FileInputStream(args[0]);
        ZipInputStream stream = new ZipInputStream(theFile);
        String outdir = args[1];

        try
        {

            // now iterate through each item in the stream. The get next
            // entry call will return a ZipEntry for each file in the
            // stream
            ZipEntry entry;
            while((entry = stream.getNextEntry())!=null)
            {
                String s = String.format("Entry: %s len %d added %TD",
                                entry.getName(), entry.getSize(),
                                new Date(entry.getTime()));
                System.out.println(s);

                // Once we get the entry from the stream, the stream is
                // positioned read to read the raw data, and we keep
                // reading until read returns 0 or less.
                String outpath = outdir + "/" + entry.getName();
                FileOutputStream output = null;
                try
                {
                    output = new FileOutputStream(outpath);
                    int len = 0;
                    while ((len = stream.read(buffer)) > 0)
                    {
                        output.write(buffer, 0, len);
                    }
                }
                finally
                {
                    // we must always close the output file
                    if(output!=null) output.close();
                }
            }
        }
        finally
        {
            // we must always close the zip file.
            stream.close();
        }
    }
}
于 2013-08-26T13:50:01.837 回答