如何使用Java REST服务和数据流来下载文件
如何使用Java REST服务和数据流来下载文件
我有3台机器:
- 存放文件的服务器
- 运行REST服务的服务器(Jersey)
- 具有访问第二台服务器但无法访问第一台服务器的客户端(浏览器)
如何直接(不将文件保存在第二台服务器上)从第一台服务器下载文件到客户端的机器上?
从第二台服务器,我可以获得一个ByteArrayOutputStream来从第一台服务器获取文件,我可以通过REST服务将这个流传递给客户端吗?
这样会起作用吗?
所以基本上我想要实现的是,允许客户端使用第二台服务器上的REST服务从第一台服务器下载文件(因为客户端无法直接访问第一台服务器),只使用数据流(因此不涉及第二台服务器的文件系统)。
我现在尝试使用EasyStream库的方法:
final FTDClient client = FTDClient.getInstance(); try { final InputStreamFromOutputStreamisOs = new InputStreamFromOutputStream () { @Override public String produce(final OutputStream dataSink) throws Exception { return client.downloadFile2(location, Integer.valueOf(spaceId), URLDecoder.decode(filePath, "UTF-8"), dataSink); } }; try { String fileName = filePath.substring(filePath.lastIndexOf("/") + 1); StreamingOutput output = new StreamingOutput() { @Override public void write(OutputStream outputStream) throws IOException, WebApplicationException { int length; byte[] buffer = new byte[1024]; while ((length = isOs.read(buffer)) != -1) { outputStream.write(buffer, 0, length); } outputStream.flush(); } }; return Response.ok(output, MediaType.APPLICATION_OCTET_STREAM) .header("Content-Disposition", "attachment; filename=\"" + fileName + "\"") .build(); } }
更新2
我现在使用自定义的MessageBodyWriter的代码看起来很简单:
ByteArrayOutputStream baos = new ByteArrayOutputStream(2048) ; client.downloadFile(location, spaceId, filePath, baos); return Response.ok(baos).build();
但是当尝试处理大文件时,我收到相同的堆错误。
更新3
最终成功使其工作!
StreamingOutput起了作用。
谢谢@peeskillet!非常感谢!