html大文件传输方法

松鼠的博客 松鼠的博客     2022-12-01     631

关键词:

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        ///

 

  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        ///

 

 11        ///当前请求的HttpContext

 12        ///下载文件的物理路径,含路径、文件名

 13        ///下载速度:每秒允许下载的字节数

 14        /// true下载成功,false下载失败

 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        

上传展示截图:

说明: http://bbsres2.ncmem.com/0456aab2.jpg

详细配置信息可以参考我写的这篇文章:http://blog.ncmem.com/wordpress/2019/08/09/net%E6%96%AD%E7%82%B9%E7%BB%AD%E4%BC%A0/

 

欢迎入群一起讨论“374992201”

ftp传输大文件严重丢包的解决方法

通过FTP方式把公司总部的大体量文件传输到国内多地,或者发给国外合作伙伴,经常遇到长距离网络不可避免的时延丢包及跨运营商的情况。怎么解决这个问题?其实不仅是大文件,网络上传输的各种内容,大多数都需要解决丢... 查看详情

html大文件传输分享

​文件夹数据库处理逻辑public class DbFolder    JSONObjectroot;       public DbFolder()          查看详情

如何分发大文件大文件传输解决方案-html5

...、概述 所谓断点续传,其实只是指下载,也就是要从文件已经下载的地方开始继续下载。在以前版本的HTTP协议是不支持断点的,HTTP/1.1开始就支持了。一般断点下载时才用到Range和Content-Range实体头。HTTP协议本身不支持断点... 查看详情

http传输大文件的四种方法

...这个解决方法也有个缺点,gzip等压缩算法通常只对文本文件有较好的压缩率,而图片、音频视频等多媒体数据本身就已经是高度压缩的,再用gzip处理也不会变小(甚至还有可能会增大一点),所以它就失效了。不过数据压缩在... 查看详情

mac传输文件慢和解决方法你知道么

我们在用Mac使用U盘等外接存储设备的时候,经常在传输文件的过程中,尤其是一些大的安装包或视频文件的拷贝,需要花费大量的时间,给Mac用户造成了很多不便,今天,小编就告诉大家Mac为什么会传输文件很慢以及怎么解决... 查看详情

http传输大文件的方法

...个解决方法也有个缺点,gzip等压缩算法通常只对文本文件有较好的压缩率,而图片、音频视频等多媒体数据本身就已经是高度压缩的,再用gzip处理也不会变小(甚至还有可能会增大一点),所以它就失效... 查看详情

一个好用的大文件传输工具:支持选点续传错误重传

数据正在爆炸式增长,几乎每两年翻一番。这些数据和文件可能是组织机构重要的业务数据,也可能是其重要的信息资源。通常情况下,组织机构使用邮件、QQ、FTP等常规方式传输文件,但是当文件容量在2-3G以上时,上述方法就... 查看详情

在 Flask 中异步传输大文件

】在Flask中异步传输大文件【英文标题】:TransferLargeFilesAsynchronouslyInFlask【发布时间】:2017-05-3002:20:44【问题描述】:的最佳方法是什么?我读过这个article。但我想知道是否有办法不使用芹菜来做到这一点?【问题讨论】:转移... 查看详情

Spring WebClient:如何将大字节 [] 流式传输到文件?

】SpringWebClient:如何将大字节[]流式传输到文件?【英文标题】:SpringWebClient:Howtostreamlargebyte[]tofile?【发布时间】:2019-10-0604:32:36【问题描述】:似乎SpringRestTemplate无法将响应直接流式传输到文件而不将其全部缓冲在内存中。使... 查看详情

大文件如何传输

参考技术A问题一:电脑怎么传输大于4G的文件U盘必须先确定文件系统支持4G以上大文件,比如格式化成NTFS格式或者exFAT格式,否则像FAT32、FAT16的文件系统不支持4G以上文件。插入U盘后右键查看属性可以看文件系统。右键格式化... 查看详情

crt和windows之间传输大文件(代码片段)

crt通过rz、sz基于Zmodem传输协议最大支持4GB的文件,超过这个大小有两种方式(目前已知)1、通过自带的FTP,如果是直连可以通过这种方式调出crt会话窗口,然后通过组合键Alt+p进入ftp命令行,如#查看使用方法sftp>help....#下载... 查看详情

手机压缩pdf文件的简单方法

有时候我们编辑好的PDF文件体积太大,但是又要发送邮件给他人,因为体积大的文件传输的速度不仅慢,往往还会导致传输失败,那我们怎么将PDF文件变小呢?其实我们可以在手机上把文件压缩打包后子啊传输,这样就大大的提... 查看详情

经验分享:压缩pdf文件操作方法

平常大家处理比较大的文件的时候,不知道大家是如何进行操作的?在传输文件的时候,有时就是因为文件太大导致传输时间特别长,就拿PDF文件来说,压缩PDF文件我们该如何进行操作呢?下面小编就将自己的方法分享给大家。... 查看详情

在 Rails 应用程序中处理大文件上传的最佳方法是啥?

】在Rails应用程序中处理大文件上传的最佳方法是啥?【英文标题】:Whatisthebestapproachtohandlelargefileuploadsinarailsapp?在Rails应用程序中处理大文件上传的最佳方法是什么?【发布时间】:2013-05-2021:58:48【问题描述】:我有兴趣了解... 查看详情

linux大文件如何切割与合并?

...制,导致很多时候,我们需要在Linux系统下进行大文件的切割。这样将一个大文件切割成为多个小文件,进行传输,传输完毕之后进行 查看详情

linux大文件如何切割与合并?(代码片段)

...制,导致很多时候,我们需要在Linux系统下进行大文件的切割。这样将一个大文件切割成为多个小文件,进行传输,传输完毕之后进行合并即可。Linux大文件的分割与合并Linux学 查看详情

在 python 中为大文件创建校验和的最快方法

】在python中为大文件创建校验和的最快方法【英文标题】:thefastestwaytocreatechecksumforlargefilesinpython【发布时间】:2010-12-0416:48:00【问题描述】:我需要通过网络传输大文件,并且需要每小时为它们创建校验和。所以生成校验和的... 查看详情

在 Java 1.5 中,将文件从客户端传输到服务器的最佳方法是啥?

】在Java1.5中,将文件从客户端传输到服务器的最佳方法是啥?【英文标题】:WhatistheBestmethodtohttptransferafilefromtheclienttoaserver,inJava1.5?在Java1.5中,将文件从客户端传输到服务器的最佳方法是什么?【发布时间】:2010-09-2309:22:50【... 查看详情