首页 > 编程语言 >C# Web实现文件上传下载功能实例解析

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

时间:2023-04-20 12:13:38浏览次数:37  
标签:Web 请求 文件 C# 上传下载 响应 源码 下载 客户端

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,请求,文件,C#,上传下载,响应,源码,下载,客户端
From: https://www.cnblogs.com/songsu/p/17336302.html

相关文章

  • Halcon图像的 BLOB 分析处理几何变换 &刚性仿射变换
    平移move_region缩放zoom_region镜像mirror_region倒置transpose_region6.2仿射变换刚性仿射变换vector_angle_to_rigid对图像,区域进行仿射变换算子:vector_angle_to_rigid(:: Row1, Column1, Angle1, Row2, Column2, Angle2 : HomMat2D)示例:vector_angle_......
  • JavaScript将时间戳转化为时间
    consttimestampToTime=(timestamp)=>{constdate=newDate(timestamp*1000);constyear=date.getFullYear();constmonth=(date.getMonth()+1).toString().padStart(2,'0');constday=date.getDate().toString().padStart(......
  • C++ - UDP通信
    UDPUDP就比较简单了,步骤比tcp要少一些。连接过程图:  1).服务器1.初始化套接字库WORDwVersion;WSADATAwsaData;interr;​wVersion=MAKEWORD(1,1);2.创建套接字SOCKETsockSrv=socket(AF_INET,SOCK_DGRAM,0);3.绑定//SOCKADDR_INaddrSrv;省略了定......
  • C++ - TCP通信
    前言socket编程分为TCP和UDP两个模块,其中TCP是可靠的、安全的,常用于发送文件等,而UDP是不可靠的、不安全的,常用作视频通话等。如下图:头文件与库:#include<WinSock2.h>​#pragmacomment(lib,"ws2_32.lib")准备工作:创建工程后,首先右键工程,选择属性然后选择C/C++-预......
  • [JavaScript][页面定位]锚的简单使用
     [页面定位]锚的简单使用 1.使用window.location.hash定位到指定的锚1.<!DOCTYPEHTMLPUBLIC"-//W3C//DTDHTML4.0Transitional//EN">2.<HTML>3.<HEAD>4.<TITLE>NewDocument</TITLE>5.<METANAME="Generator"CONTENT=&q......
  • java导出Excel例子(poi)
    publicclasscreatFile{staticpublicvoidmain(String[]args)throwsException{FileOutputStreamfos=newFileOutputStream("d:\\creatFile.xls");HSSFWorkbookwb=newHSSFWorkbook();HSSFSheets=wb.createSh......
  • 低代码开发重要工具:jvs-logic(逻辑引擎)可视化设计要素
    逻辑引擎可视化的交互可视化的服务编排是逻辑引擎的核心功能,逻辑引擎的界面可视化设计是为了方便用户使用和操作逻辑引擎而设计的。一个好的界面设计能够提高用户的工作效率和使用体验,同时也能增加软件的可靠性和可维护性。以下是逻辑引擎界面可视化设计的一些要素:1.界面布局界面......
  • DB2 JDBC Driver
    依照JDBC规范,有四种类型的JDBC驱动程序体系结构:Type1:这类驱动程序将JDBCAPI作为到另一个数据访问API的映射来实现,如开放式数据库连通性(OpenDatabaseConnectivity,ODBC)。这类驱动程序通常依赖本机库,这限制了其可移植性。JDBC-ODBC桥驱动程序就是Type1驱动程序的最......
  • include与jsp:include区别
    我们都知道在jsp中include有两种形式,分别是<%@includefile=””%><jsp:includepage=””flush=”true”/> 以下是对include两种用法的区别主要有两个方面的不同;一:执行时间上:<%@includefile=”relativeURI”%>是在翻译阶段执行<jsp:includepage=”relati......
  • JPCAP——JAVA中的数据链路层控制(监听原理) ARP欺骗
    监听原理在详细说用JPCAP实现网络监听实现前,先简单介绍下监听的原理。局域网监听利用的是所谓的“ARP欺骗”技术。在以前曾经一段阶段,局域网的布局是使用总线式(或集线式)结构,要到达监听只需要将网卡设定为混杂模式即可,但现在的局域网络普遍采用的是交换式网络,所以单纯靠......