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("https://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("输入流关闭失败"); } }
© 版权声明
特别提醒: 内容为用户自行发布,如有侵权,请联系我们管理员删除,邮箱:mail@xieniao.com ,在收到您的邮件后我们会在3个工作日内处理。
相关文章
暂无评论...