我需要先声明一下,我根本不是 .NET 编码器,但为了获得部分功能,我修改了一个 technet chunkedfilefetch.aspx 脚本,该脚本使用分块数据读取和写入流式传输方法进行文件传输,让我中途受益。
iStream = New System.IO.FileStream(path, System.IO.FileMode.Open, _
IO.FileAccess.Read, IO.FileShare.Read)
dataToRead = iStream.Length
Response.ContentType = "application/octet-stream"
Response.AddHeader("Content-Length", file.Length.ToString())
Response.AddHeader("Content-Disposition", "attachment; filename=" & filedownload)
' Read and send the file 16,000 bytes at a time. '
While dataToRead > 0
If Response.IsClientConnected Then
length = iStream.Read(buffer, 0, 16000)
Response.OutputStream.Write(buffer, 0, length)
Response.Flush()
ReDim buffer(16000) ' Clear the buffer '
dataToRead = dataToRead - length
Else
' Prevent infinite loop if user disconnects '
dataToRead = -1
End If
End While
这适用于高达 2GB 的文件,并且现在可以正常运行。但只有一个问题它不允许恢复。
我采用了名为 fetch.aspx 的原始代码,并通过 URL 传递了一个 orderNUM。fetch.aspx&ordernum=xxxxxxx 然后它根据订单号从数据库中读取文件名/位置,并将其从不在 webroot 下的安全位置分块。
我需要一种方法来使这种恢复,由于互联网和大文件的性质,人们总是会断开连接并希望从中断的地方恢复。但是我读过的任何可恢复的文章,假设文件在 webroot 中.. 即。http://www.devx.com/dotnet/Article/22533/1954很棒的文章,效果很好,但我需要从安全的位置流式传输。
我根本不是 .NET 编码器,充其量我可以做一些冷融合,如果有人可以帮助我修改处理程序来做到这一点,我将非常感激。
要求:
- 我有一个运行良好的 fetch.aspx 脚本,它使用上面的代码片段作为流式下载的基础。
- 下载文件有 600MB 大,存储在 webroot 之外的安全位置。
- 用户单击 fetch.aspx 开始下载,因此如果下载失败,将再次单击它。如果 ext 是 .ASPX 并且发送的文件是 AVI,点击它会完全绕过映射到 .AVI ext 的 IHTTP 处理程序,所以这让我很困惑
- 据我了解,浏览器将读取并匹配 etag 值和文件修改日期以确定它们正在谈论同一个文件,然后在浏览器和 IIS 之间交换后续的接受范围。由于此对话框发生在 IIS 中,我们需要使用处理程序来拦截并做出相应的响应,但单击链接会将其发送到处理程序需要位于 AVI 字段上的 ASPX 文件。这也让我感到困惑。
如果有一种方法可以将包含 etag 的初始 HTTP 请求标头、accept-range 请求到普通的 .ASPX 文件中,我可以读取这些值,如果存在 accept-range 和 etag,以某种方式开始在该字节值处分块?但我找不到传输 http 请求标头的方法,因为它们似乎在 IIS 级别丢失了。
在 URL 字符串中传递的 OrderNum 是唯一的,可以用作 ETag
Response.AddHeader("ETag", request("ordernum"))
由于大小,文件需要可恢复和分块。
- 文件扩展名为 .AVI,因此可以围绕它编写处理程序。
- IIS 6.0 网络服务器
任何帮助都将不胜感激,我一直在阅读和下载代码,但是给出的示例都不符合我的情况,原始文件是从 webroot 外部流式传输的。请帮我处理这些 httphandlers :)