はじめに、私は .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 のハンドルを取得するのを手伝ってください :)