首页 > 其他分享 >SpringBoot Web实现文件上传下载功能实例解析

SpringBoot Web实现文件上传下载功能实例解析

时间:2023-04-18 17:47:15浏览次数:47  
标签:Web 请求 文件 上传下载 响应 源码 客户端 下载 SpringBoot

IE的自带下载功能中没有断点续传功能,要实现断点续传功能,需要用到HTTP协议中鲜为人知的几个响应头和请求头。

 

一. 两个必要响应头Accept-Ranges、ETag

        客户端每次提交下载请求时,服务端都要添加这两个响应头,以保证客户端和服务端将此下载识别为可以断点续传的下载:

Accept-Ranges:告知下载客户端这是一个可以恢复续传的下载,存放本次下载的开始字节位置、文件的字节大小;

ETag:保存文件的唯一标识(我在用的文件名+文件最后修改时间,以便续传请求时对文件进行验证);

Last-Modified:可选响应头,存放服务端文件的最后修改时间,用于验证

 

二. 一个重要请求头Range

Range:首次下载时,Range头为null,此时服务端的响应头中必须添加响应头Accept-Ranges、ETag;

              续传请求时,其值表示客户端已经收到的字节数,即本次下载的开始字节位置,服务端依据这个 值从相应位置读取数据发送到客户端。

 

三. 用于验证的请求头If-Range、

       当响应头中包含有Accept-Ranges、ETag时,续传请求时,将包含这些请求头:

If-Range:对应响应头ETag的值;

Unless-Modified-Since:对应响应头Last-Modified的值。

        续传请求时,为了保证客户端与服务端的文件的一致性和正确性,有必要对文件进行验证,验证需要自己写验证代码,就根据解析这两个请求头的值,将客户端已下载的部分与服务端的文件进行对比,如果不吻合,则从头开始下载,如果吻合,则断点续传。

 

四.  速度限制

        程序中加入了速度限制,用于对客户端进行权限控制的流量限制。

 

五. 其它注意事项

      如:文件名乱码的问题、文件名中空格变加号、强制客户端显示下载对话框等,详见源码注释:

  1

  2        /// <summary>

  3        /// 下载文件,支持大文件、续传、速度限制。支持续传的响应头Accept-Ranges、ETag,请求头Range 。

  4        /// Accept-Ranges:响应头,向客户端指明,此进程支持可恢复下载.实现后台智能传输服务(BITS),值为:bytes;

  5        /// ETag:响应头,用于对客户端的初始(200)响应,以及来自客户端的恢复请求,

  6        /// 必须为每个文件提供一个唯一的ETag值(可由文件名和文件最后被修改的日期组成),这使客户端软件能够验证它们已经下载的字节块是否仍然是最新的。

  7        /// Range:续传的起始位置,即已经下载到客户端的字节数,值如:bytes=1474560- 。

  8        /// 另外:UrlEncode编码后会把文件名中的空格转换中+(+转换为%2b),但是浏览器是不能理解加号为空格的,所以在浏览器下载得到的文件,空格就变成了加号;

  9        /// 解决办法:UrlEncode 之后, 将 "+" 替换成 "%20",因为浏览器将%20转换为空格

 10        /// </summary>

 11        /// <param name="httpContext">当前请求的HttpContext</param>

 12        /// <param name="filePath">下载文件的物理路径,含路径、文件名</param>

 13        /// <param name="speed">下载速度:每秒允许下载的字节数</param>

 14        /// <returns>true下载成功,false下载失败</returns>

 15        public static bool DownloadFile(HttpContext httpContext, string filePath, long speed)

 16        {

 17            bool ret = true;

 18            try

 19            {

 20                --验证:HttpMethod,请求的文件是否存在

 36

 37                定义局部变量

 49

 50                --验证:文件是否太大,是否是续传,且在上次被请求的日期之后是否被修改过--------------

 67

 68                try

 69                {

 70                    -------添加重要响应头、解析请求头、相关验证-------------------

 97

 98                    -------向客户端发送数据块-------------------

108                }

109                catch

110                {

111                    ret = false;

112                }

113                finally

114                {

115                    br.Close();

116                    myFile.Close();

117                }

118            }

119            catch

120            {

121                ret = false;

122            }

123            return ret;

124        }

上传展示截图:

 

示例下载地址

源代码文档

asp.net源码下载jsp-springboot源码下载jsp-eclipse源码下载jsp-myeclipse源码下载php源码下载csharp-winform源码下载vue-cli源码下载c++源码下载

详细配置信息及思路

 

标签:Web,请求,文件,上传下载,响应,源码,客户端,下载,SpringBoot
From: https://www.cnblogs.com/songsu/p/17330469.html

相关文章

  • WebSocket和Socket编程
    面试一般会问socket原理socket为啥要有端口:确定一个链路的是一个四元组Socket编程socket通信你做过socket编程吗,socket是怎么实现知道有连接过来的说说WebSocket与socket的区别先谈谈Websocket与Socket的区别首先Socket==不属于协议范畴,它把TCP/IP层复杂的操作抽象为几个简......
  • 一种解决多系统web应用的策略,Module Federation(模块联邦)
    前言针对很多大型的web应用,往往会衍生出很多子应用,而这些子应用之间有时候又往往需要进行交互或者复用一些功能或者组件,这个时候有没有一个比较好的策略来实现这样的交互呢。答案是有的,试试webpack5提供的ModuleFederation。先来个示例万事先实操,然后再谈别的,不付诸实践的......
  • jsp Web实现文件上传下载功能实例解析
    ​ 4GB以上超大文件上传和断点续传服务器的实现随着视频网站和大数据应用的普及,特别是高清视频和4K视频应用的到来,超大文件上传已经成为了日常的基础应用需求。但是在很多情况下,平台运营方并没有大文件上传和断点续传的开发经验,往往在网上找一些简单的PHP或者Java程序来实现基......
  • 把闲置安卓手机变成 NAS 服务器:KSWEB
    之前给大家分享过把闲置的安卓手机变成下载机、电脑扩展屏幕、蓝牙音箱、监控摄像头、电脑硬件监控屏等。今天教大家如何变成 NAS 服务器,可以搭建个人博客、或者用来备份文件、搭建私人家庭影库中心等。这里需要用到「KSWEB」这款服务器应用,无需手机ROOT,只要是安卓手机(安卓8......
  • 什么是全栈工程师,为什么全栈开发用Python,Python web全栈开发到底有多高薪?
    我们经常听到全栈工程师这个词语。那么很多小伙伴还是不明所以,什么是全栈工程师?为什么全栈开发用Python?Pythonweb全栈开发到底有多高薪?一、什么是Pythonweb全栈工程师?全栈工程师是指掌握多种技能,并能利用多种技能独立完成产品的人。也叫全端工程师(同时具备前端和后台能力),英文F......
  • Java Web实现文件上传下载功能实例解析
    ​ 第一点:Java代码实现文件上传FormFilefile=manform.getFile();StringnewfileName= null;Stringnewpathname= null;StringfileAddre= "/numUp";try{    InputStreamstream=file.getInputStream();// 把文件读入    StringfilePath=request.......
  • Springboot集成dubbo完整过程(三)
    准备工作1,准备mysql服务环境2,准备redis服务环境3,准备zookeeper服务环境4,准备逆向生成bean的xml配置文件5,准备slf4j日志xml配置文件6,准备一个sql脚本1,搭建创建服务工程1,创建一个空的父工程,用来统一管理依赖2,创建一个interface接口工程,主要存放业务bean,接口类3,创建一......
  • Abp框架Web站点的安全性提升
    本文将从GB/T28448-2019《信息安全技术网络安全等级保护测评要求》规定的安全计算环境中解读、摘要若干安全要求,结合Abp框架,对站点进行安全升级。【身份鉴别】应对登录的用户进行身份标识和鉴别,身份标识具有唯一性,身份鉴别信息具有复杂度要求并定期更换。解决方案设置密码......
  • Apifox 更新 | WebSocket 接口调试功能上线!
    Apifox 新版本上线啦!欢迎升级使用:界面右上角【设置】-> 【关于Apifox】->【检查更新】看看本次版本更新主要涵盖的重点内容,有没有你所关注的功能特性:支持WebSocketAPI;自动化测试功能升级;Web端新增部分功能快捷键;支持自定义设置版本更新及安装提醒。01支持WebSocketAPI最新......
  • SpringBoot学习笔记
    一、Springboot简介目的:设计目的是用来简化Spring应用的初始搭建以及开发过程Spring程序和SpringBoot程序对比SpringBoot项目快速启动对SpringBoot项目打包(执行Maven构建指令package)执行启动命令(cmd中)java-jarspringboot.jar注:jar支持命令行启动需要依赖maven......