首页 > 其他分享 >记一次跨服务器的文件下载功能开发

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

时间:2023-09-20 16:03:34浏览次数:28  
标签:文件 浏览器 请求 服务器 os 下载

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("输入流关闭失败"); } }

 

标签:文件,浏览器,请求,服务器,os,下载
From: https://www.cnblogs.com/Silentness/p/17717556.html

相关文章

  • pikachu的文件上传
    1.单纯的前端js验证,我们直接在浏览器禁用即可。或者可以通过上传图片后缀再抓包修改为php的方式 2.这个是通过验证包中的Content-Type:进行,只需要抓包之后更改即可(图片中没改) 3.这个是通过检测上传文件的文件头进行识别,我们可以选择在php文件前加上图片的码或者直接使用co......
  • 解决不同浏览器下载文件名中文不能正常显示的问题
    if(request.getHeader("User-Agent").toUpperCase().indexOf("FIREFOX")>0){ fileName=newString(fileName.getBytes("UTF-8"),"ISO8859-1"); }elseif(request.getHeader("User-Agent").toUpperCase().......
  • 别人访问下载接口
    //post请求报文体的接收方式HttpContext.Current.Response.ContentType="application/json";HttpContext.Current.Response.ContentEncoding=System.Text.Encoding.UTF8;System.IO.StreaminputStream=HttpContext.Current.Request.InputStream;System.Text.Encodi......
  • iOS开发证书发布证书,推送证书,描述文件的生成总集(一)
    iOS开发证书发布证书,推送证书,描述文件的生成总集(一)一.开发证书发布证书制作1.进入(Launchpad),找到  (我的是在其他里面找到的),运行后再左上角2.存储在桌面就好了,然后就完成退出钥匙串工具就可以了。注册项目的BundleID。到这里就算注册完成了。二.推送证书制作Snip20161214_2.png.......
  • iOS开发证书、bundle ID、App ID、描述文件、p12文件,及企业证书打包发布详述
    引言  此操作手册用于提供客户进行企业发布299美金的账户发布非AppStore的app程序的CSR证书,distribution证书以及p12证书导出用。2.iOS开发证书,描述文件,bundleID的关系苹果为了控制应用的开发与发布流程,制定了一套非常复杂的机制。这里面的关键词有:个人开发者账号,企业开发者账......
  • 如何最简洁的使用iOS 开发证书 和 Profile 文件
    如果你想在iOS设备(iPhone/iPad/iTouch)上调试,需要有iOS开发证书和Profile文件。在你拿到这两个文件之后,该如何使用呢?证书使用说明:1. iOS开发证书:开发证书(DevelopmentCertificate)是一个后缀为.p12 的文件(Certificates.p12); 在Mac系统下,双击这个文件,这个证书会自动导......
  • iOS 生成证书、描述文件、打包上架Appstore详细流程
    简介我打算将生成证书,描述文件、上架App的步骤一步一步写下来,于是就有了这篇文章编译环境系统版本:macOSSierra10.12.6Xcode:v9.2(9C40b)1.开发者账号苹果官方开发者网站开发者账号分为四类:1个人开发者账号Individual个人的是比较好申请的,相比于公司开发者账号,不需要申请 邓......
  • 如何使用iOS 开发证书 和 Profile 文件
    如果你想在iOS设备(iPhone/iPad/iTouch)上调试,需要有iOS开发证书和Profile文件。在你拿到这两个文件之后,该如何使用呢?证书使用说明:1. iOS开发证书:开发证书(DevelopmentCertificate)是一个后缀为.p12 的文件(Certificates.p12); 在Mac系统下,双击这个文件,这个证书会自动导......
  • 最新版 苹果 IOS AppStore证书申请全流程 包括p12文件
    第一步登陆开发者网站并进入证书管理页。辅助工具网站地址:http://www.applicationloader.net/第二步添加【Certificates】证书。在这里插入图片描述第三步 进入添加页后,根据需求选择。第四步选择好环境之后,这里需要选择一个证书,这个证书需要苹果电脑生成。第五步在苹果电脑上打开......
  • linux查看文件夹大小、文件数量的方法
    查看文件数量及大小ls-l|grep"^-"|wc-l或find./company-typef|wc-l查看某文件夹下文件的数量,包括子文件夹里的。ls-lR|grep"^-"|wc-l查看某文件夹下文件夹的数量,包括子文件夹里的。ls-lR|grep"^d"|wc-l以上的命令解释:ls-l长列表输出该目录下文件信息(注意这里......