2

我需要先声明一下,我根本不是 .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 :)

4

0 回答 0