How to save a file from jersey response?

[亡魂溺海] 提交于 2019-12-30 18:48:08

问题


I am trying to download a SWF file using Jersey from a web resource.

I have written the following code, but am unable to save the file properly :

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

It is save to assume that the response does return a SWF file, as response.getMediaType returns application/x-shockwave-flash.

However when I try to open the SWF, nothing happen (also no error) which suggest that my file was not created from response.


回答1:


From Java 7 on, you can also make use of the new NIO API to write the input stream to a file:

InputStream is = response.readEntity(InputStream.class)
Files.copy(is, Paths.get(...));



回答2:


I've finally got it to work.

I figured out reading the Jersey API that I could directly use getEntity to retrieve the InputStream of the response (assuming it has not been read yet).

Using getEntity to retrieve the InputStream and IOUtils#toByteArray which create a byte array from an InputStream, I managed to get it to work :

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

Note that IOUtils is a common Apache function.




回答3:


I think you should not go through a String at all.

If the response is really the SWF file (binary data), then here:

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

instead of this code (which reads a String), just try reading
a byte array. See if it helps. Strings are related to encodings
and probably that messes things up.



来源:https://stackoverflow.com/questions/20336235/how-to-save-a-file-from-jersey-response

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!