如何从泽西响应中保存文件?

Jea*_*ard 6 java rest jersey

我试图从Web资源使用Jersey下载SWF文件.

我写了以下代码,但无法正确保存文件:

Response response = webResource.request(MediaType.APPLICATION_OCTET_STREAM)
  .cookie(cookie)
  .post(Entity.entity(form, MediaType.APPLICATION_FORM_URLENCODED_TYPE));

String binarySWF = response.readEntity(String.class);                                     
byte[] SWFByteArray = binarySWF.getBytes();       

FileOutputStream fos = new FileOutputStream(new File("myfile.swf"));
fos.write(SWFByteArray);
fos.flush();
fos.close();
Run Code Online (Sandbox Code Playgroud)

保存假设响应确实返回SWF文件,作为response.getMediaType返回application/x-shockwave-flash.

但是,当我尝试打开SWF时,没有任何事情发生(也没有错误),这表明我的文件不是从响应中创建的.

Jea*_*ard 6

我终于得到了它的工作.

我想出了我可以直接getEntity用来检索它的InputStream 的Jersey API response(假设它还没有被读过).

使用getEntity检索InputStreamIOUtils#toByteArray其创建从一个字节数组InputStream,我设法得到它的工作:

Response response = webResource.request(MediaType.APPLICATION_OCTET_STREAM)
  .cookie(cookie)
  .post(Entity.entity(form, MediaType.APPLICATION_FORM_URLENCODED_TYPE));                                                  

InputStream input = (InputStream)response.getEntity();

byte[] SWFByteArray = IOUtils.toByteArray(input);  

FileOutputStream fos = new FileOutputStream(new File("myfile.swf"));
fos.write(SWFByteArray);
fos.flush();
fos.close();
Run Code Online (Sandbox Code Playgroud)

请注意,IOUtils是一个常见的Apache函数.


ocr*_*tte 6

从Java 7开始,您还可以使用新的NIO API将输入流写入文件:

InputStream is = response.readEntity(InputStream.class)
Files.copy(is, Paths.get(...));
Run Code Online (Sandbox Code Playgroud)