SharePoint 2003 ドキュメント ライブラリに格納されているファイルをブラウザにストリーミングしようとしています。基本的には、ファイルをストリームとして開き、ファイル ストリームを応答に「書き込み」、コンテンツ タイプとコンテンツ ディスポジション ヘッダーを指定するという考え方です。コンテンツの処理は、ファイル名、コンテンツ タイプを保持するために使用されます。これは、ファイルを表示するためにどのアプリを開けばよいかをブラウザに知らせるためです。
これは、開発環境と UAT 環境で問題なく機能します。ただし、本番環境では、常に期待どおりに動作するとは限りませんが、IE6/IE7 のみです。FF はあらゆる環境でうまく機能します。
本番環境では SSL が有効になっており、一般的に使用されていることに注意してください。(実稼働環境で SSL が使用されていない場合、ファイル ストリームは期待どおりに名前が付けられ、適切に表示されます。)
コード スニペットを次に示します。
System.IO.FileStream fs = new System.IO.FileStream(Server.MapPath(".") + "\\" + "test.doc", System.IO.FileMode.Open);
long byteNum = fs.Length;
byte[] pdfBytes = new byte[byteNum];
fs.Read(pdfBytes, 0, (int)byteNum);
Response.AppendHeader("Content-disposition", "filename=Testme.doc");
Response.CacheControl = "no-cache";
Response.ContentType = "application/msword; charset=utf-8";
Response.Expires = -1;
Response.OutputStream.Write(pdfBytes, 0, pdfBytes.Length);
Response.Flush();
Response.Close();
fs.Close();
前述したように、このコード スニペットは開発マシンと UAT 環境で正常に動作します。ダイアログ ボックスが開き、Testme.doc の保存、表示、またはキャンセルを求められます。ただし、本番環境では SSL を使用する場合のみ、IE 6 および IE7 は添付ファイルの名前を使用しません。代わりに、ストリームを送信しているページの名前 testheader.apx を使用すると、エラーがスローされます。
IE には、「暗号化されたページをディスクに保存しない」という高度な設定があります。
これが問題の一部であると思われます。サーバーはブラウザーにファイルをキャッシュしないように指示しますが、IE では「暗号化されたページをディスクに保存しない」が有効になっています。
はい、大きなファイルの場合、上記のコード スニペットがメモリを大きく圧迫し、この実装が問題になることは承知しています。したがって、実際の最終的な解決策は、ファイル全体を 1 バイト配列に開くのではなく、ファイルをストリームとして開き、ファイルを一口サイズのチャンク (たとえば、サイズが約 10K) でクライアントに送信します。
SSL経由でバイナリファイルを「ストリーミング」する同様の経験をした人はいますか? 提案や推奨事項はありますか?