Java 如何从球衣响应中保存文件?

声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 原文地址: http://stackoverflow.com/questions/20336235/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me): StackOverFlow

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-08-13 01:09:17  来源:igfitidea点击:

How to save a file from jersey response?

javarestjersey

提问by Jean-Fran?ois Savard

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

我正在尝试使用 Jersey 从 Web 资源下载 SWF 文件。

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.getMediaTypereturns application/x-shockwave-flash.

假设响应确实返回 SWF 文件,如response.getMediaType返回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.

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

采纳答案by ocroquette

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

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

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

回答by peter.petrov

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

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

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

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

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.

而不是这个代码(它读取一个字符串),只需尝试读取
一个字节数组。看看它是否有帮助。字符串与编码有关
,可能会把事情搞砸。

回答by Jean-Fran?ois Savard

I've finally got it to work.

我终于让它工作了。

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

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

Using getEntityto retrieve the InputStreamand IOUtils#toByteArraywhich create a byte array from an InputStream, I managed to get it to work :

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

Note that IOUtilsis a common Apache function.

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