如何从安全的位置.NET创建大型可恢复的下载

时间:2009-12-08 05:34:25

标签: .net large-files security chunked resume-download

我需要前言我根本不是.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然后根据ordernumber从数据库中读取文件名/位置,并将其从不在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中,我们需要使用一个处理程序来拦截并做出相应的响应,但点击该链接会将它发送到一个ASPX文件,而handeler需要在AVI领域。也让我感到困惑。
  • 如果有办法请求包含etag的初始HTTP请求标头,接受范围到正常的.ASPX文件,我可以读取这些值,如果存在accept-range和etag,则开始分块字节值不知怎的?但我找不到传输http请求标头的方法,因为它们似乎在IIS级别丢失了。

  • 在URL字符串中传递的OrderNum是唯一的,可以用作ETag

        Response.AddHeader("ETag", request("ordernum"))
    
  • 文件需要根据尺寸进行恢复和分块。

  • 文件扩展名为.AVI,因此可以在其周围编写处理程序。
  • IIS 6.0 Web服务器

任何帮助都会非常感激,我一直在阅读,阅读和下载代码,但是没有一个示例符合我的情况,原始文件是从webroot外部流式传输的。请帮助我掌握这些httphandlers:)

0 个答案:

没有答案