如何使用Java REST服务和数据流来下载文件

14 浏览
0 Comments

如何使用Java REST服务和数据流来下载文件

我有3台机器:

  1. 存放文件的服务器
  2. 运行REST服务的服务器(Jersey)
  3. 具有访问第二台服务器但无法访问第一台服务器的客户端(浏览器)

如何直接(不将文件保存在第二台服务器上)从第一台服务器下载文件到客户端的机器上?

从第二台服务器,我可以获得一个ByteArrayOutputStream来从第一台服务器获取文件,我可以通过REST服务将这个流传递给客户端吗?

这样会起作用吗?

所以基本上我想要实现的是,允许客户端使用第二台服务器上的REST服务从第一台服务器下载文件(因为客户端无法直接访问第一台服务器),只使用数据流(因此不涉及第二台服务器的文件系统)。

我现在尝试使用EasyStream库的方法:

final FTDClient client = FTDClient.getInstance();
try {
    final InputStreamFromOutputStream  isOs = 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!非常感谢!

0