C# ASP.NET 实现文件断点续传


C# ASP.NET 实现文件断点续传
在了解HTTP断点续传的原理之前,让我们先来了解一下HTTP协议,HTTP协议是一种基于tcp的简单协议,分为请求和回复两种。请求协议是由客户机(浏览器)向服务器(WEB SERVER)提交请求时发送报文的协议。回复协议是由服务器(web server),向客户机(浏览器)回复报文时的协议。请求和回复协议都由头和体组成。头和体之间以一行空行为分隔。


以下是一个请求报文与相应的回复报文的例子:

GET /image/index_r4_c1.jpg HTTP/1.1
Accept: */*
Referer: http://192.168.3.120:8080
Accept-Language: zh-cn
Accept-Encoding: gzip, deflate
User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.0; .NET CLR 1.0.3705)
Host: 192.168.3.120:8080
Connection: Keep-Alive


HTTP/1.1 200 OK
Server: Microsoft-IIS/5.0
Date: Tue, 24 Jun 2003 05:39:40 GMT
Content-Type: image/jpeg
Accept-Ranges: bytes
Last-Modified: Thu, 23 May 2002 03:05:40 GMT
ETag: "bec48eb862c21:934"
Content-Length: 2827

….

  下面我们就来说说"断点续传",顾名思义,断点续传就是在上一次下载时断开的位置开始继续下载。
在HTTP协议中,可以在请求报文头中加入Range段,来表示客户机希望从何处继续下载。


  比如说从第1024字节开始下载,请求报文如下:


GET /image/index_r4_c1.jpg HTTP/1.1
Accept: */*
Referer: http://192.168.3.120:8080
Accept-Language: zh-cn
Accept-Encoding: gzip, deflate
User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.0; .NET CLR 1.0.3705)
Host: 192.168.3.120:8080
Range:bytes=1024-
Connection: Keep-Alive

  .NET中的相关类

  明白了上面的原理,那么,我们来看看.NET FRAMEWORK中为我们提供了哪些类可以来做这些事。

  完成HTTP请求

System.Net.HttpWebRequest

  HttpWebRequest 类对 WebRequest 中定义的属性和方法提供支持,也对使用户能够直接与使用 HTTP 的服务器交互的附加属性和方法提供支持。

  HttpWebRequest 将发送到 Internet 资源的公共 HTTP 标头值公开为属性,由方法或系统设置。下表包含完整列表。可以将 Headers 属性中的其他标头设置为名称/值对。但是注意,某些公共标头被视为受限制的,它们或者直接由 API公开,或者受到系统保护,不能被更改。Range也属于被保护之列,不过,.NET为开发者提供了更方便的操作,就是 AddRange方法,向请求添加从请求数据的开始处或结束处的特定范围的字节范围标头

  完成文件访问

System.IO.FileStream

  FileStream 对象支持使用Seek方法对文件进行随机访问, Seek 允许将读取/写入位置移动到文件中的任意位置。这是通过字节偏移参考点参数完成的。字节偏移量是相对于查找参考点而言的,该参考点可以是基础文件的开始、当前位置或结尾,分别由SeekOrigin类的三个属性表示。

  代码实现

  了解了.NET提供的相关的类,那么,我们就可以方便的实现了。

  代码如下:

C# Code:


static void Main(string[] args)
{
   
   string StrFileName="c:\\aa.zip"; //根据实际情况设置
   string StrUrl="http://www.xxxx.cn/xxxxx.zip"; //根据实际情况设置
   
   //打开上次下载的文件或新建文件
   long lStartPos =0;
   System.IO.FileStream fs;
   if (System.IO.File.Exists(StrFileName))
   {
      fs= System.IO.File.OpenWrite(StrFileName);
      lStartPos=fs.Length;
      fs.Seek(lStartPos,System.IO.SeekOrigin.Current); //移动文件流中的当前指针
   }
   else
   {
      fs = new System.IO.FileStream(StrFileName,System.IO.FileMode.Create);
      lStartPos =0;
   }
   
   //打开网络连接
   try
   {
      System.Net.HttpWebRequest request =(System.Net.HttpWebRequest)System.Net.HttpWebRequest.Create(StrUrl);
      if ( lStartPos>0)
      request.AddRange((int)lStartPos); //设置Range值
      
      //向服务器请求,获得服务器回应数据流
      System.IO.Stream ns= request.GetResponse().GetResponseStream();
      
      byte[] nbytes = new byte[512];
      int nReadSize=0;
      nReadSize=ns.Read(nbytes,0,512);
      while( nReadSize >0)
      {
         fs.Write(nbytes,0,nReadSize);
         nReadSize=ns.Read(nbytes,0,512);
      }
      fs.Close();
      ns.Close();
      Console.WriteLine("下载完成");
   }
   catch(Exception ex)
   {
      fs.Close();
      Console.WriteLine("下载过程中出现错误:" ex.ToString());
   }
}

//来源:C/S框架网(www.csframework.com) QQ:1980854898


 
转载请注明来自: http://www.caodong.net/Article/729.html


本文来源:
版权声明:本文为开发框架文库发布内容,转载请附上原文出处连接
C/S框架网
上一篇:FastReport for.Net 1.6.18 vs2010 简体中文破解版下载
下一篇:C# 动态编译及调用WebService的方法
评论列表

发表评论

评论内容
昵称:
关联文章

C# ASP.NET 实现文件断点
C#,Asp.Net多线程断点下载
Asp.Net FileUpload类实现文件(C/S框架网开源)
C# ASP.NET使用ashx一般处理程序实现文件功能
ASP.NET WebApi框架异步实现MultipartContent方式上文件
[原创]无线监控系统之二-------C#实现
ASP.NET IIS网站为什么Global.asax的Application_Start方法设断点跟踪不运行?
CSFramework.WebApi框架实现阿里云OSS上、下载、删除文件功能
CSFramework.AutoUpgrader上文件升级包测试报告
C#.Net图片,限制图片大小,检查类型完整版
ASP.NET Web API入门介绍(一)
WebApi快速开发框架,C# ASP.NET后端开发平台
编译器错误消息: CS0016: 未能写入输出文件c:\Windows\Microsoft.NET\Framework\v4.0.30319\Temporary ASP.NET Files\root
C#.NET 6 实现全局异常处理
软件开发与设计 - EMS-电子商城系统-ASP.NET车站售票系统的设计与实现(毕业设计)
C#使用Multipart form-data方式上文件及提交其他数据
Asp.Net SignalR介绍
ASP.NET Web Forms - HTML 页面
微信小程序后端框架 | C# ASP.NET服务端WebApi快速开发框架平台
ASP.NET MVC快速入门(一)

热门标签
.NET5 .NET6 .NET7 APP Auth-软件授权注册系统 Axios B/S B/S开发框架 Bug Bug记录 C#加密解密 C#源码 C/S CHATGPT CMS系统 CodeGenerator CSFramework.DB CSFramework.EF CSFrameworkV1学习版 CSFrameworkV2标准版 CSFrameworkV3高级版 CSFrameworkV4企业版 CSFrameworkV5旗舰版 CSFrameworkV6.0 DAL数据访问层 Database datalock DbFramework Demo教学 Demo下载 DevExpress教程 DOM EF框架 Element-UI EntityFramework ERP ES6 Excel FastReport GIT HR IDatabase IIS JavaScript LINQ MES MiniFramework MIS NavBarControl Node.JS NPM OMS ORM PaaS POS Promise API Redis SAP SEO SQL SQLConnector TMS系统 Token令牌 VS2022 VSCode VUE WCF WebApi WebApi NETCore WebApi框架 WEB开发框架 Windows服务 Winform 开发框架 Winform 开发平台 WinFramework Workflow工作流 Workflow流程引擎 版本区别 报表 踩坑日记 操作手册 代码生成器 迭代开发记录 基础资料窗体 架构设计 角色权限 开发sce 开发技巧 开发教程 开发框架 开发平台 开发指南 客户案例 快速搭站系统 快速开发平台 秘钥 密钥 权限设计 软件报价 软件测试报告 软件简介 软件开发框架 软件开发平台 软件开发文档 软件体系架构 软件下载 软著证书 三层架构 设计模式 生成代码 实用小技巧 收钱音箱 数据锁 数据同步 微信小程序 未解决问题 文档下载 喜鹊ERP 喜鹊软件 系统对接 详细设计说明书 行政区域数据库 需求分析 疑难杂症 蝇量级框架 蝇量框架 用户管理 用户开发手册 用户控件 在线支付 纸箱ERP 智能语音收款机 自定义窗体 自定义组件 自动升级程序