工作中遇到这样的需求:

1、A项目提供下载服务

2、B项目封装A项目的下载服务

3、通过B项目来下载文件。

遇到的场景是:只有A服务可以下载文件,这里ip 限制,其他的服务器无法直接下载文件,这里类似下载请求,B服务无法直接下载文件,只能先请求A服务,通过A服务实现下载。(这里不讲sendredirect)。

A服务,这里对应下载的服务器端,代码如下:

//服务器端@RequestMapping(value = "/realdwonloadFile", method = RequestMethod.POST)public void processDownload(HttpServletRequest request, HttpServletResponse response){int BUFFER_SIZE = 100000;InputStream in = null;OutputStream out = null;System.out.println("Come on, baby .......");try{request.setCharacterEncoding("utf-8");response.setCharacterEncoding("utf-8");response.setContentType("application/octet-stream");String fileName = request.getHeader("fileName");System.out.println("fileName:" + fileName);File file = new File(fileName);response.setContentLength((int) file.length());response.setHeader("Accept-Ranges", "bytes");int readLength = 0;in = new BufferedInputStream(new FileInputStream(file), BUFFER_SIZE);out = new BufferedOutputStream(response.getOutputStream());byte[] buffer = new byte[BUFFER_SIZE];while ((readLength=in.read(buffer)) > 0) {byte[] bytes = new byte[readLength];System.arraycopy(buffer, 0, bytes, 0, readLength);out.write(bytes);}out.flush();response.addHeader("token", "hello 1");}catch(Exception e){e.printStackTrace();response.addHeader("token", "hello 2");}finally {if (in != null) {try {in.close();} catch (IOException e) {}}if (out != null) {try {out.close();} catch (IOException e) {}}}}

B服务,这里是客户端。代码如下:

/**** @param request* @param response* @param urlPath 调用访问下载文件的url(方法)* @param remoteFilePath  需要下载的文件所在路径*/public void clientDown(HttpServletRequest request, HttpServletResponse response,String urlPath, String remoteFilePath){DefaultHttpClient httpClient = new DefaultHttpClient();OutputStream out = null;InputStream in = null;//        urlPath = "http://localhost:9990/realdown/realdwonloadFile";
//        String remoteFilePath  = "D:\\usr\\local\\ciecc\\testdown\\";String fileName =request.getParameter("name");try {HttpPost httpPost = new HttpPost(urlPath);httpPost.addHeader("fileName", remoteFilePath+fileName);httpPost.setHeader("Content-Disposition", "attachment;filename="+remoteFilePath+fileName);//这里访问server 端(也就是urlPath路径),server下载文件并将文件流回传HttpResponse httpResponse = httpClient.execute(httpPost);HttpEntity entity = httpResponse.getEntity();in = entity.getContent();long length = entity.getContentLength();if (length <= 0) {System.out.println("下载文件不存在!");return;}response.setCharacterEncoding("utf-8");response.setContentType("application/octet-stream");response.setHeader("Accept-Ranges", "bytes");response.setHeader("Content-Disposition", "attachment;filename="+fileName);out = new BufferedOutputStream(response.getOutputStream());byte[] buffer = new byte[4096];int readLength = 0;while ((readLength=in.read(buffer)) > 0) {byte[] bytes = new byte[readLength];System.arraycopy(buffer, 0, bytes, 0, readLength);out.write(bytes);}out.flush();} catch (IOException e) {e.printStackTrace();} catch (Exception e) {e.printStackTrace();}finally{try {if(in != null){in.close();}} catch (IOException e) {e.printStackTrace();}try {if(out != null){out.close();}} catch (IOException e) {e.printStackTrace();}}}

这样就可以实现 通过B服务下载文件。

客户端请求下载,服务端响应下载请求并返回文件流相关推荐

  1. 客户端渲染和服务端渲染

    参考链接:客户端渲染和服务端渲染的区别https://blog.csdn.net/qq_40885461/article/details/88539989 浅谈服务端渲染(SSR)https://ww ...

  2. PhotonServer,客户端发送请求给服务端,服务端解析请求,发送回客户端响应,客户端再解析服务端发过来的响应。

    1.(客户端发送给服务端)test中的构造参数并且发送 完整代码如下 test.cs using System; using System.Collections; using System.Coll ...

  3. Python Django断点下载(服务端/客户端)

    断点下载 背景     断点续传/断点下载一直是每个系统最实用的功能,最近公司在复杂的网络环境(国外vps)下载东西遇到问题,有些文件下载的时候很慢,并且可能会下不下来,这种情况对一个系统的稳定性构成 ...

  4. plsq卸载 删除注册表、_win10操作系统下oracle11g客户端/服务端的下载安装配置卸载总结...

    win10操作系统下oracle11g客户端/服务端的下载安装配置卸载总结 一:前提 注意:现在有两种安装的方式 1. oracle11g服务端(64位)+oracle客户端(32位)+plsql(3 ...

  5. AJAX学习笔记(基本使用,请求参数传递,获取服务端响应,错误处理,低版本IE浏览器缓存问题及解决)

    1. Ajax实现步骤 创建ajax对象 let xhr = new XMLHttpRequest(); 告诉ajax请求地址及请求方式 xhr.open('get','http://www.exam ...

  6. win10找不到oracle11g客户端,win10操做系统下oracle11g客户端/服务端的下载安装配置卸载总结...

    注意:如今有两种安装的方式sql 1. oracle11g服务端(64位)+oracle客户端(32位)+plsql(32位)数据库 2. oracle11g服务端(32位)+plsql(32位)wi ...

  7. 学习AJAX必知必会(2)~Ajax基本使用,设置请求行、请求体、请求头,服务端响应JSON数据

    一.Ajax的基本使用 1.核心对象 XMLHttpRequest,AJAX 的所有操作都是通过该对象进行的. 2.发送ajax请求(4个步骤): 创建xhr对象,然后open方法初始化,设置请求方式 ...

  8. linux服务端 完美世界 下载,【网游单机架设】【完美世界之荣耀与新生151v101一键端】【32位+64位】【永久】...

    2014-03-29 14-04-07.jpg (114.36 KB, 下载次数: 76) 2014-3-30 17:57 上传 2014-03-29 14-04-33.jpg (100.99 KB, ...

  9. 流放者柯南自建服务器 linux,流放者柯南服务器搭建教程 流放者柯南虚拟机建服务器方法(4)_下载服务端_游侠网...

    下载服务端 ConanExiles搭建个人服务器教程(Windows) 1. 下载STEAMCMD https://steamcdn-a.akamaihd.net/client/installer/s ...

最新文章

  1. 如何在linux下解压缩rar格式的文件压缩包
  2. linux 内核调试 booting the kernel.,Uncompressing Linux...done, booting the kernel解决办法
  3. 阿里巴巴60万年薪抢毕业生 必须是公认技术牛人
  4. opencv 图像上画出目标运动的轨迹_基于opencv的单目和双目标定平台手眼标定
  5. java能否调用com_java调用com
  6. linux上ln命令详细说明
  7. Java JDK动态代理
  8. plt是什么格式文件
  9. PRD文档详解(20191209)
  10. 文本分析主要包含哪些技术,文本分析技术的发展方向是什么?
  11. 剖析锂电池的工作原理
  12. 将轻松的留给生活,沉重的留给写作——读《灯下尘》(七堇年)
  13. was启动时java_home配置_WAS常用配置的文件 - wangxin2008的个人空间 - OSCHINA - 中文开源技术交流社区...
  14. android 遮罩窗口,Andriod PopupWindow 实现遮罩效果
  15. 上海区域赛Unlock the Cell Phone
  16. Boggle问题积累
  17. 马云点了人类史上最贵“外卖”,又一场“三国杀”即将来临?
  18. 怎么压缩gif图片大小?如何压缩gif又不影响画质
  19. html置顶代码,详情页置顶自定义版块代码
  20. Retrofit+kotlin Coroutines(协程)+mvvm(Jetpack架构组件)实现更简洁的网络请求

热门文章

  1. 飞桨视频理解黑科技开源,支持3000个实用标签
  2. PHP-FPM日志中出现”好像很忙碌”,您需要增加pm.start_servers,或pm.min/ max_spare_servers
  3. iOS设备中WiFi、蓝牙和飞行模式的开启与关闭(私有API)
  4. 武汉群硕面试心得体会(下)
  5. 腾讯云万象优图每个账户提供50G的图片存储(支持黄图检测)
  6. 父亲节快到了,几句父亲的话留下
  7. java的跨平台性与c语言,Java为什么具有跨平台性?
  8. html ie内核 指定,Delphi TWebBrowser强制使用指定版本的IE内核
  9. Lua 表(table)
  10. 深入浅出玩转监控宝|网站监控之创建网站监控任务