如何从泽西响应中保存文件?
我试图从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();
假设响应确实返回SWF文件,因为response.getMediaType
返回application/x-shockwave-flash
。
但是当我尝试打开SWF时,没有任何事情发生(也没有错误),这表明我的文件不是从响应中创建的。
我终于得到了它的工作。
我想通过读取Jersey API,我可以直接使用getEntity
来检索response
的InputStream(假设它尚未被读取)。
使用getEntity
检索InputStream
和IOUtils#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();
请注意, IOUtils是一个常见的Apache函数。
从Java 7开始,您还可以使用新的NIO API将输入流写入文件:
InputStream is = response.readEntity(InputStream.class) Files.copy(is, new File(...).toPath());
我想你根本不应该经历一个字符串。
如果响应确实是SWF文件(二进制数据),那么这里:
String binarySWF = response.readEntity(String.class);
而不是这个代码(读取字符串),只是尝试阅读
一个字节数组。 看看它是否有帮助。 字符串与编码有关
并且可能会让事情变得混乱。