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 のファイルでうまく機能し、現在は完全に機能しています。しかし、再開できない問題が 1 つだけあります。

fetch.aspx という元のコードを使用して、URL を介して orderNUM を渡します。fetch.aspx&ordernum=xxxxxxx 次に、注文番号に従ってデータベースからファイル名/場所を読み取り、Webroot の下ではない安全な場所からそれをチャンクします。

これを再開可能にする方法が必要です。インターネットと大きなファイルの性質上、人々は常に切断され、中断したところから再開したいと考えています。しかし、私が読んだ再開可能な記事はすべて、ファイルが webroot 内にあると想定しています。http://www.devx.com/dotnet/Article/22533/1954すばらしい記事でうまく機能しますが、安全な場所からストリーミングする必要があります。

私はまったく .NET コーダーではありません。せいぜい、コールドフュージョンを少し行うことができます。これを行うためにハンドラーを変更するのを手伝ってくれる人がいれば、本当に感謝しています。

要件:

  • 正常に機能し、上記のコード スニペットをストリーミング ダウンロードのベースとして使用する、動作中の fetch.aspx スクリプトがあります。
  • ダウンロード ファイルは 600 MB と大きく、ウェブルート以外の安全な場所に保存されます。
  • ユーザーは fetch.aspx をクリックしてダウンロードを開始するため、失敗した場合は再度クリックすることになります。ext が .ASPX で、送信されるファイルが AVI の場合、それをクリックすると .AVI ext にマップされた IHTTP ハンドラが完全にバイパスされるため、混乱します。
  • 私が理解していることから、ブラウザーは etag 値とファイルの変更日を読み取って照合し、それらが同じファイルについて話していると判断し、その後の受け入れ範囲がブラウザーと IIS の間で交換されます。このダイアログは IIS で発生するため、ハンドラーを使用してインターセプトし、それに応じて応答する必要がありますが、リンクをクリックすると、ハンドラーが AVI フィールドにある必要がある ASPX ファイルに送信されます。また、私を混乱させます。
  • etag、accept-range を含む初期 HTTP 要求ヘッダーを通常の .ASPX ファイルに要求する方法があれば、それらの値を読み取ることができ、accept-range と etag が存在する場合は、そのバイト値でチャンクを開始できますか? しかし、IIS レベルで失われているように見えるため、http 要求ヘッダーを転送する方法が見つかりませんでした。

  • URL 文字列で渡される OrderNum は一意であり、ETag として使用できます

        Response.AddHeader("ETag", request("ordernum"))
    
  • ファイルは、サイズのために再開可能でチャンクアウトする必要があります。

  • ファイル拡張子は .AVI であるため、その周りにハンドラーを記述することができます。
  • IIS 6.0 Web サーバー

私はコードを読み、読み、ダウンロードしてきましたが、元のファイルが webroot の外部からストリーミングされているという私の状況を満たしている例はありません。これらの httphandlers のハンドルを取得するのを手伝ってください :)

4

0 に答える 0