我试图从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时,没有任何事情发生(也没有错误),这表明我的文件不是从响应中创建的.
从Java 7开始,您还可以使用新的NIO API将输入流写入文件:
InputStream is = response.readEntity(InputStream.class) Files.copy(is, Paths.get(...));
我终于得到了它的工作.
我想出了我可以直接getEntity
用来检索它的InputStream 的Jersey API response
(假设它还没有被读过).
使用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函数.