ダウンロード用のファイルを提供する汎用ハンドラーがあります。
Dim request As HttpRequest = context.Request
Dim response As HttpResponse = context.Response
response.ContentType = "application/octet-stream"
response.AddHeader("content-disposition", "inline; filename=" & filename)
response.Buffer = True
response.OutputStream.Write(fileBytes, 0, fileBytes.Length)
response.Flush()
response.Close()
(「fileBites」はバイト配列、「filename」はファイル名)。
たとえば、fileBites が .txt ファイルの場合、ダウンロードが開始され、ファイルは完全に読み取られます。
しかし、.pdf ファイルと .docx ファイルが破損していることに気付きました。.docx の場合、Word はファイルを復元する必要があると言って、復元の許可を求めてきました。この許可を与えると、すぐに修正され、完全に表示されました。
明らかに、私はユーザーにこの破損ダイアログを見せたくなかったので、しばらく調査した後、これを発見しました: http://forums.asp.net/t/1301978.aspx/1/10 - これは、破損の理由を示唆しています余分な空のビットがバイト配列の最後に書き込まれていました: 長さを 1 ビット落として確認しました:
response.OutputStream.Write(fileBytes, 0, fileBytes.Length - 1)
魔法のように、.docx のダウンロードが機能するようになりました。(これは私の現在の問題ではありません。コンテキストと他の誰かが同じ問題を抱えている場合に備えて含めます)
私の現在の問題は、.docx ファイルは正しくストリーミングされるようになりましたが、.pdf ファイルは正しくないことです。それらは (正しい KB サイズで) 1 つにまとめて転送されるように見えますが、ダウンロードしたファイルを開こうとすると、Adobe Reader X から次のように表示されます。
Adobe Reader could not open xxxx because it is either not a supported file type
or because the file has been damaged (for example, it was sent as an email
attachment and wasn't correctly decoded).
2008 年付けの adobe フォーラム ( http://forums.adobe.com/thread/391712 ) で、この正確な問題に対処するためのかなり長い未解決の議論がありましたが、これは現在死んでいます。ユーザーが投稿したすべての回避策 (コンテンツ タイプ: /pdf ではなく /octet、配置: アプリケーションがインラインではない、コンテンツ エンコーディングと文字セットが異なるなど) をすべて試しましたが、すべて役に立ちませんでした。
誰かがこの問題に遭遇した前に、どこか漠然としたものをどこかで指摘して、正しい方向に少しでも似ているかどうか疑問に思います!