3

ブラウザが理解できるファイルタイプをブラウザで直接開く必要があります(つまり、[開く/保存/キャンセル]ダイアログはありません)。

これが私のコードです。現在はうまく機能しています!...すべてのファイルがダイアログボックスをポップアップし、ファイルを直接開かないことを除いて:

string filePath = Path.Combine(WebConfigurationManager.AppSettings["NewsAttachmentPath"], context.Request.QueryString["FileName"]);
byte[] bytes = System.IO.File.ReadAllBytes(filePath);
context.Response.Clear();
context.Response.ContentType = "application/octet-stream";
context.Response.Cache.SetCacheability(HttpCacheability.Private);
context.Response.Expires = -1;
context.Response.Buffer = true;
context.Response.AddHeader("Content-Disposition", string.Format("{0};FileName=\"{1}\"", "inline", context.Request.QueryString["FileName"]));
context.Response.BinaryWrite(bytes);
context.Response.End();

ご覧のとおり、Content-Dispositionを「inline」に変更しても、ダウンロードを求めるプロンプトが表示されます。これは、ブラウザが理解できることがわかっているファイルを使用したものです。つまり、ランダムなサイトに移動してPDFをクリックすると、ブラウザで開きます。私のサイトでは、表示するために保存します。

「なぜapplication/octet-streamを使いたいのか」に対する先制的な答え 単一のファイルタイプごとにハンドラーを作成したくないからです。これが間違っている場合は、私に知らせてください。

4

1 に答える 1

5

ファイルタイプごとにハンドラーを作成する必要はありません。行を変更するだけです:

context.Response.ContentType = "application/octet-stream";

することが:

string contentType = //your logic here, possibly many lines in a separate method
context.Response.ContentType = contentType;

ただし、いいえ。アプリケーション/オクテットストリームを「インライン化」することはできません。つまり、「ここにいくつかのバイトがありますが、それらが何であるかはわかりません」という意味です。ブラウザは、それをどこかに保存する以外は、それをあまり処理できません。したがって、ダウンロードプロンプトが表示されます。ただし、content-dispositionを使用してファイル名を提案することはできます。

ブラウザはファイル拡張子では機能しません-コンテンツタイプで機能します。つまり、応答で正しいコンテンツタイプを報告する必要があります。これはswitch、知っているファイル拡張子に基づいて/ルックアップを作成することを意味する場合もあれば、明示的なコンテンツタイプをファイル情報とともにメタデータとして個別に保存することを意味する場合もあります。

于 2012-06-08T07:02:17.693 に答える