| 网站首页 | 硬件维修 | 应用学院 | 网络组建 | 网站制作 | 菜鸟黑客 | 编程之道 | 数码大全 | 娱乐休闲 | 软件下载 | 在线视频 | 请您留言 | 技术论坛 | 
专 题 栏 目
最 新 热 门
最 新 推 荐
相 关 文 章
  • javascript模拟游戏中的…

  • javascript制作闪烁的边…

  • javascript制作浮动的工…

  • javascript设计漫天雪花

  • javascript设计网页中的…

  • 用javascript实现利用FL…

  • javascript实例教程(20)…

  • javascript实例教程(20)…

  • javascript实例教程(20)…

  • javascript实例教程(20)…

  • Q
    您现在的位置: 我是IT人 >> 网站制作 >> ASP.NET >> 文章正文
    在ASP.NET中跟踪和恢复大文件下载         
    在ASP.NET中跟踪和恢复大文件下载
    作者:网络 文章来源:转载 点击数: 更新时间:2005-8-10
    [ 字体:缩小 正常 放大 | 双击自动滚屏 ]
    请选择合适的字体颜色:

      示例代码在HttpHandler.vb文件中包含了一个自定义的HttpHandler类(ZIPHandler)。ZipHandler实现了IhttpHandler接口,并且处理对所有.zip文件的请求。

      为了测试示例代码,你需要在IIS中建立一个新的虚拟目录,并把源文件复制到那儿。在该目录中建立一个叫做download.zip的文件(请注意IIS和ASP.NET不能处理大于2GB的下载,因此要确保你的文件没有超过该限制)。配置你的IIS虚拟目录,通过aspnet_isapi.dll映射.zip扩展名。

      HttpHandler类:ZIPHandler

      在ASP.NET中映射了.zip扩展名之后,客户端每次向服务器请求.zip文件的时候,IIS调用ZipHandler类的ProcessRequest方法(见下载代码)。

      ProcessRequest方法首先建立自定义的FileInformation类(见下载代码)的一个实例,它封装了下载的状态(例如进行中、被中断了等等)。示例把download.zip示例文件的路径硬编码到代码中了。如果把这段代码应用于你自己的应用程序,需要修改它来打开被请求的文件。

     

    ' 使用objRequest检测请求了哪个文件,用该文件打开objFile。
    ' 例如objFile = New Download.FileInformation(<完整文件名>)
    objFile = New Download.FileInformation( _
    objContext.Server.MapPath("~/download.zip"))

     

      接下来,程序使用描述的HTTP头信息(如果请求提供了头信息)执幸幌盗械难橹ぜ觳椤K衙恐旨觳槎挤庾霸谛⌒退接泻校绻橹こ晒Φ幕熬头祷豑rue。如果某个验证检查失败了,响应会立即终止,并发送适当的StatusCode值。

     

    If Not objRequest.HttpMethod.Equals(HTTP_METHOD_GET) Or Not
    objRequest.HttpMethod.Equals(HTTP_METHOD_HEAD) Then
     ' 目前只支持GET和HEAD方法
     objResponse.StatusCode = 501 ' 没有执行
    ElseIf Not objFile.Exists Then
     ' 无法找到被请求的文件
     objResponse.StatusCode = 404 ' 没有找到
    ElseIf objFile.Length > Int32.MaxValue Then
     ' 文件太大了
     objResponse.StatusCode = 413 ' 请求实体太大
    ElseIf Not ParseRequestHeaderRange(objRequest, alRequestedRangesBegin, alRequestedRangesend, _
    objFile.Length, bIsRangeRequest) Then
     ' Range请求中包含无用的实体
     objResponse.StatusCode = 400 ' 无用的请求
    ElseIf Not CheckIfModifiedSince(objRequest,objFile) Then
     ' 实体没有被修改过
     objResponse.StatusCode = 304 ' 没有被修改过
    ElseIf Not CheckIfUnmodifiedSince(objRequest,objFile) Then
     ' 实体在上次被请求的日期之后被修改过
     objResponse.StatusCode = 412 ' 预处理失败
    ElseIf Not CheckIfMatch(objRequest, objFile) Then
     ' 实体与请求不匹配
     objResponse.StatusCode = 412 ' 预处理失败
    ElseIf Not CheckIfNoneMatch(objRequest, objResponse,objFile) Then
     ' 实体的确与none-match请求匹配。
     ' 响应代码位于CheckIfNoneMatch函数中
    Else
     ' 初步检查成功

     

      这些初步检查的函数中的ParseRequestHeaderRange(见下载代码)检查客户端是否请求了文件范围(这意味着是一个局部下载)。如果被请求的范围是无效的(无效范围指超越文件大小或包含不合理数字的范围数值),该方法把bIsRangeRequest设置为True。如果请求了范围,CheckIfRange方法会验证IfRange头信息。

      如果被请求的范围是有效的,代码会计算响应信息的大小。如果客户端请求了多个范围,响应信息大小的数值会包含多部分头部信息长度的数值。

      如果不能确定某个发送的头部信息值,程序将把这个下载请求作为最初请求而不是部分下载来处理,从文件的顶部开始发送一个新的下载流。

     

    If bIsRangeRequest AndAlso CheckIfRange(objRequest, objFile) Then
     ' 这是范围请求
     ' 如果Range数组包含多个实体,它还是一个多部分范围请求
     bMultipart = CBool(alRequestedRangesBegin.GetUpperBound(0)>0)
     ' 进入每个范围来获取整个响应长度
     For iLoop = alRequestedRangesBegin.GetLowerBound(0) To alRequestedRangesBegin.GetUpperBound(0)
      ' 内容的长度(这个范围的)
      iResponseContentLength += Convert.ToInt32(alRequestedRangesend( _
    iLoop) - alRequestedRangesBegin(iLoop)) + 1
      If bMultipart Then
       ' 如果是多部分范围请求,计算出将发送的中间头信息的长度
       iResponseContentLength += MULTIPART_BOUNDARY.Length
       iResponseContentLength += objFile.ContentType.Length
       iResponseContentLength += alRequestedRangesBegin(iLoop).ToString.Length
       iResponseContentLength += alRequestedRangesend(iLoop).ToString.Length
       iResponseContentLength += objFile.Length.ToString.Length
       ' 49是多部分下载中换行和其它必要的字符的长度
       iResponseContentLength += 49
      End If
     Next iLoop

    上一页  [1] [2] [3] [4] [5] [6] 下一页  

    文章录入:小秦    责任编辑:小秦 
  • 上一篇文章:

  • 下一篇文章:
  • 发表评论】【加入收藏】【告诉好友】【打印此文】【关闭窗口
    网友评论:(只显示最新10条。评论内容只代表网友观点,与本站立场无关!)
    | 设为首页 | 加入收藏 | 联系站长 | 关于我们 | 友情链接 | 版权申明 |