私が達成しようとしているのは、ユーザーがSilverlightアプリケーションから複数のファイルをダウンロードできるようにすることです。これを行うには、DotNetZip
ライブラリとASP.NET
ハンドラを使用して、データベースからすべてのファイルを取得してクライアントに送信するようにすることにしました。それは良いアイデアのように思え、実装が簡単です。私はシンプルなハンドラを作成し、必要なすべてのコードを書き、すべてがうまくいった。私は多くのファイルとzipファイルを作成するとき大きなzipファイルを送信しようとすると接続が閉じられる
は、しかし、いくつかの理由で、問題があります。 Response
にデータを書き込もうとすると、例外がスローされています。
Private Sub MultipleFileDownload_Loaded(sender As Object, e As EventArgs) Handles Me.Load
// initialize data and stuff
_context.Response.Clear()
_context.Response.BufferOutput = False
Me.ZipElementsIntoOutputStream(elementsToDownload)
_context.Response.End()
End Sub
Private Sub ZipElementsIntoOutputStream(elements As List(Of ElementImageFile))
_context.Response.ContentType = "application/zip"
Dim archiveName As String = String.Format("archive-{0}.zip", DateTime.Now.ToString("yyyy-MM-dd-HHmmss"))
_context.Response.AddHeader("content-disposition", "attachment; filename=" + archiveName)
Using zip As New ZipFile()
For Each elementToDownload In elements.Where(Function(e) e IsNot Nothing AndAlso e.File IsNot Nothing)
Dim fileName = Me.GetUniqueFileName(elementToDownload, zip)
zip.AddEntry(fileName, elementToDownload.File)
Next
Using s As IO.MemoryStream = New IO.MemoryStream()
zip.Save(s)
s.Seek(0, IO.SeekOrigin.Begin)
Dim buffer(10000) As Byte
Dim length As Integer
Dim dataToRead As Long
dataToRead = s.Length
While dataToRead > 0
If (Me._context.Response.IsClientConnected) Then
length = s.Read(buffer, 0, 10000)
Me._context.Response.OutputStream.Write(buffer, 0, length)
Me._context.Response.Flush()
ReDim buffer(10000)
dataToRead = dataToRead - length
Else
dataToRead = -1
End If
End While
'zip.Save(_context.Response.OutputStream)
End Using
End Using
End Sub
あなたは私がMemoryStream
を作成し、私はそれが同様の問題の解決策として示した見てきましたが、これは助けにはならなかったとして、Response
にデータの小片を送信しています見ることができるように。 Zip
ファイルを直接Response
に保存すると、まったく同じエラーが表示されます。
BufferOutput
プロパティがFalse
に設定されているため、すぐにダウンロードが開始されますが、True
に変更しても何も変更されません。
私が送信しようとしているzip
ファイルを約248メガバイトであり、これは私にエラーを与えます。いくつかの要素を削除し、zip
ファイルが約220メガバイトの場合、すべて正常に動作するようです。
誰でも知っていますか、この動作の理由は何ですか?どうすればこの問題を解決できますか?zipファイルを送信してもこのエラーは発生しません。