快速业务通道

ASP.NET中大文件下载的跟踪和恢复

作者 佚名技术 来源 NET编程 浏览 发布时间 2012-05-20
' 在例子中文件实际的mime类型在以后才写入响应
   objResponse.ContentType = MULTIPART_CONTENTTYPE
  Else
   '' 单个部分消息拥有的文件内容类型
   objResponse.ContentType = objFile.ContentType
End If

下载所需要的一切都准备好了,可以开始下载文件了。你将使用FileStream对象从文件中读取字节块。把FileInformation实例objFile的State属性设置为fsDownloadInProgress.只要客户端保持连接,服务器就从文件中读取字节块并发送给客户端。对于多部分下载,这段代码会发送特定的头信息。如果客户端中断连接,服务器就把文件状态设置为fsDownloadBroken.如果服务器完成了被请求范围的发送过程,它会把状态设置为fsDownloadFinished(见下载代码)。

FileInformation辅助类

在ZIPHandler部分中你会发现,FileInformation是一个辅助类,它封装了下载状态信息(例如下载中、中断等等)。

为了建立FileInformation的实例,你需要把被请求文件的路径传递给该类的构造函数:

Public Sub New(ByVal sPath As String)
  m_objFile = New System.IO.FileInfo(sPath)
End Sub

FileInformation使用System.IO.FileInfo对象来获取文件的信息,这些信息是作为该对象的属性暴露的(例如文件是否存在、文件全名、大小等等)。这个类还暴露了一个DownloadState枚举,它描述了下载请求的多种状态:

<Flags()> Enum DownloadState
  '' Clear:没有下载过程,文件可能在维护
  fsClear = 1
  '' Locked:动态建立的文件不能被更改
  fsLocked = 2
  '' In Progress:文件被锁定了,下载过程正在进行
  fsDownloadInProgress = 6
  '' Broken:文件被锁定了,下载过程正在进行,但是被取消了
  fsDownloadBroken = 10
  '' Finished:文件被锁定了,下载过程完成了
  fsDownloadFinished = 18
End Enum

FileInformation还提供了EntityTag属性值。示例代码中的这个值是硬编码的,这是由于示例代码只使用了一个下载文件,并且该文件不会被改变,但是对于实际应用程序来说,你会提供多个文件,甚至于动态地建立文件,你的代码必须为每个文件提供一个唯一的EntityTag值。此外,每次改变或修改该文件的时候,这个值也必须改变。这使客户端软件能够验证它们已经下载的字节块是否仍然是最新的。下面是示例代码中返回硬编码EntityTag值的部分:

Public ReadOnly Property EntityTag() As String
  '' EntityTag用于对客户端的初始(200)响应,以及来自客户端的恢复请求
  Get
   '' 为文件建立唯一的字符串。
   '' 注意,只要文件没有发生改变,该唯一码就必须保留。
   '' 但是,如果文件的确改变了或者被修改了,这个码必须改变。
   Return "MyExampleFileID"
  End Get
End Property

一个简单的和大致足够安全的EntityTag可能由文件名和文件最后被修改的日期组成。无论使用什么方法,你都必须确保这个值是真的是唯一的,不会与其它文件的EntityTag混淆。我希望在自己的应用程序中按照客户、顾客和邮编索引来动态地替被建立的文件命名,并把用作EntityTag的GUID存储在数据库中。

ZipFileHandler类读取和设置公共的State属性。在完成下载以后,它把State设置为fsDownloadFinished.这个时候你就可以删除临时文件了。这儿一般需要调用Save方法来维持状态。

Public Property State() As DownloadState
  Get
   Return m_nState
  End Get
  Set(ByVal nState As DownloadState)
   m_nState = nState
   '' 可选操作:这个时候你可以自动地删除文件。
   '' 如果状态被设置为Finished ,你就再也不需要这个文件了。
   '' If nState =DownloadState.fsDownloadFinished Then
    ''

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

分享到: 更多

Copyright ©1999-2011 厦门凌众科技有限公司 厦门优通互联科技开发有限公司 All rights reserved

地址(ADD):厦门软件园二期望海路63号701E(东南融通旁) 邮编(ZIP):361008

电话:0592-5908028 传真:0592-5908039 咨询信箱:web@lingzhong.cn 咨询OICQ:173723134

《中华人民共和国增值电信业务经营许可证》闽B2-20100024  ICP备案:闽ICP备05037997号