记一次跨服务器的文件下载功能开发

1、背景:

有这样一个需求,就是目前在OA系统的所有请求都会打到A服务器上,A服务器作为OA系统的门户服务,但是现在有个独立的文件备份服务,也想通过A服务器来让OA系统调用,里边包括了下载文件的功能,

此时比如把文件备份服务部署到B服务器上,需要下载的文件也在B服务器上,文件备份服务提供了个接口,用来下载文件,所以想要在OA系统上下载B服务器上的文件,整个链路就变成了如下:

浏览器发出下载请求    --->   A服务器接收到浏览器请求后,向B服务器发送请求  ---->    B服务器接收到A服务器的请求后,进行文件下载传输   ---->   A服务器接收到返回的文件流,将该文件流传输到浏览器的返回流上    ---->    浏览器接收到返回的流文件

当然也可以有其他替代的方式,比如使用nginx来直接将请求转到B服务器上,或者使用前端转发的形式将请求转发到B服务器上,但是这些转发的方式有个问题,就是要么修改Nginx配置,要么要前端改,感觉比较麻烦,万一服务部署的时候忘记了就比较麻烦了。

2、实现:

具体的实现原理其实就是把B服务器上返回的文件流直接写入到浏览器请求的返回流上就行,代码如下:

BufferedInputStream bufferedInputStream = null;        
OutputStream os
= null; try { URL url = new URL("http://B服务器:端口/文件下载接口"); URLConnection connection = url.openConnection(); InputStream inputStream = connection.getInputStream(); bufferedInputStream = new BufferedInputStream(inputStream); os = new BufferedOutputStream(response.getOutputStream()); String encoderName = URLEncoder.encode("文件名", CharsetUtil.UTF_8); response.reset();
response.setHeader(
"Access-Control-Allow-Origin", "*");
        //下面这句很关键,如果没有,下载下来的就不是文件了 response.setHeader(
"Content-Disposition", "attachment;filename=" + encoderName); byte[] buffer = new byte[1024]; int bytesRead; while ((bytesRead = bufferedInputStream.read(buffer)) != -1) { os.write(buffer, 0, bytesRead); } } catch (Exception e) { log.error("下载备份文件异常", e); } finally { try { if (os != null) { os.close(); } } catch (IOException e) { log.error("输出流关闭失败"); } try { if (os != null) { bufferedInputStream.close(); } } catch (IOException e) { log.error("输入流关闭失败"); } }

 

posted @ 2023-09-20 15:50  烟花火的人生  阅读(39)  评论(0编辑  收藏  举报