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

时间:2013-12-02 19:27:33

标签: java rest jersey

我正在尝试使用网络资源中的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();

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

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

3 个答案:

答案 0 :(得分:6)

我终于开始工作了。

我想通过阅读Jersey API,我可以直接使用getEntity来检索response的InputStream(假设它尚未被读取)。

使用getEntity检索从InputStream创建字节数组的IOUtils#toByteArrayInputStream,我设法让它工作:

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

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

答案 1 :(得分:6)

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

InputStream is = response.readEntity(InputStream.class)
Files.copy(is, new File(...).toPath());

答案 2 :(得分:1)

我认为你根本不应该通过一个字符串。

如果响应确实是SWF文件(二进制数据),那么这里:

String binarySWF = response.readEntity(String.class);

代替此代码(读取字符串),只需尝试阅读
一个字节数组。看看它是否有帮助。字符串与编码有关 可能会让事情变得混乱。