Open棟梁Project - マイクロソフト系技術情報 Wiki

目次

概要

ダウンロード処理についての問い合わせが多いのでメモ

初期化・終了処理

ヘッダの初期化

誤ったヘッダを付与しないよう、一度クリアし正しいヘッダを付与します。

// HTTPレスポンスのヘッダ&エンティティのクリア
Response.Clear();

書き込み終了処理

以降のバッファへの書き込みを停止しHTTPレスポンスを確定させます。

// HTTPレスポンス エンティティ設定の終了
Response.End(); 

HTTPヘッダ

Cacheabilityヘッダ

キャッシュを無効化すると、ダウンロード・ファイルを
ダイアログで保存しないと、直接開けない現象があるようです。

// キャッシュ無効化
Response.Cache.SetCacheability(HttpCacheability.NoCache);

Content-Typeヘッダ

Content-Typeヘッダには適切なものを指定する必要があります。

// MIMEタイプ
Response.ContentType = "application/pdf";

Content-Dispositionヘッダ

で動作が異なりますので注意が必要になります。

attachment

ファイルとしてのダウンロードを要求する。

//こっちは、専用アプリケーションで開く
Response.AppendHeader("Content-Disposition", "attachment;filename=test.pdf");

inline

OLEドキュメントとしてインライン表示を要求する。
(ただし、対応しているアプリケーションに限る)

//こっちは、IEからOLEオブジェクトを開く
Response.AppendHeader("Content-Disposition", "inline;filename=test.pdf");

また、Adobe Readerでのインライン表示は、
「PDFをブラウザに表示」環境設定が必要になるようです。

Content-Lengthヘッダ

付与しない事に因る問題

Content-length設定の有無による
動作の違いについて CGIのQ&A【OKWave】
http://okwave.jp/qa/q113178.html

効率・性能が変わることは有り得る。

が、それ以外に大きな問題は無いと考える。

一般の対応状況

StreamにWriteしているHTMLなどのレスポンスには、
APサーバ側がHTTPヘッダに自動的に付与するものと思われる。

StreamにWriteしていないWriteFile?系のレスポンスには、
APサーバ側がHTTPヘッダに自動的に付与しないものと思われる。

.NETのResponse.WriteFile?()メソッドは、
Content-Lengthを自動的に設定しない模様
(HTML出力の場合は自動的に付与される)。

JavaでもHTTPレスポンス・ストリームへの
ファイルの書き出し時のContent-Length設定は自動では無く、
res.setContentLength?()メソッドでの設定が独自に必要になる模様
(HTML出力の場合は自動的に付与される)。

故に、PDF、CSVなどのWriteFile?系のレスポンスの場合、
Content-Lengthが付与されていないケースも多いと言える。

Rangeヘッダ

分割ダウンロードの作り込みは、
クライアント-サーバのミドルウェアでも作り込みが甘く問題を起こすことが多い。
このためダウンロード問題が起きた場合、Rangeヘッダーに注目するのも良い。

各種ファイルのダウンロード

こちらも同様に、必要に応じて

良くある事例を以下に列挙します。

PDF

Adobe Reader側の問題である場合は、MSのサポート対象外になります。

window.open()+IEのインライン表示

環境によってJavaScriptの window.open()+PDFのインライン表示で、
PDFが表示されず真っ白なblank画面が表示される事例がありました。

対策方法は、

・・・で対応しました。

参考情報

CSV

Content-Type

いろいろ問題が発生するケースがあるようです。

Encoding

日本語環境のExcelが開くことができるCSVファイルのエンコードは

に限定されています。

このため、

Excelで開かれることを考慮したUTF-8のCSVファイル
を作成する場合は、BOMを付け忘れないようご注意ください。

サンプルコード(BOM付UTF-8)

// HTTPレスポンスのヘッダ&エンティティのクリア
Response.Clear();

// HTTPレスポンス ヘッダ再設定

// MIMEタイプを設定
Response.ContentType = "text/csv";

// ダウンロードダイアログを開く
Response.AppendHeader("Content-Disposition", "attachment;filename=test.csv");

// UTF-8のBOM(EF BB BF)を先頭につける
Response.BinaryWrite(new byte[]{239, 187, 191});

// 文字列をUTF-8のバイナリデータに変換する
Response.BinaryWrite(System.Text.Encoding.UTF8.GetBytes("りんご,100円\r\nみかん,50円"));

// HTTPレスポンス エンティティ設定の終了
Response.End();

Office

Officeのoption呼出で認証要求

Windows7+Office2007の環境下でIEからHTMLリンクから
WebサーバからExcel(CSV)をダウンロードする際、「保存」ではなく、
「開く」とすると、以下の現象が発生するようになった。

対応方法

下記で解決可能です。

その他、以下のページに原因と対策が書かれています。

knowledge

その他

ZoneID

ネットワーク越しでコピーした場合など、NTFS 上に ZoneId? が付与される場合がある。
この ZoneId? を持つファイルを実行する場合にメッセージが表示される。

Sysinternals にて streams というコマンドが提供されており、
プログラムからZoneId?を削除することができる。

2GB制限

IE

フレームワークとの干渉

Open棟梁

Open棟梁の以下の機能

と干渉することがあります。

詳しくは、利用ガイド(ベターユース、FAQ編)を確認ください。

ダウンロード処理の例

以下、.NET(C#)によるダウンロード処理の例です。

// HTTPレスポンスのヘッダ&エンティティのクリア
Response.Clear();

// HTTPレスポンス ヘッダ再設定

// MIMEタイプ
Response.ContentType = "application/pdf";

// キャッシュ無効化
Response.Cache.SetCacheability(HttpCacheability.NoCache);

//こっちは、専用アプリケーションで開く
//Response.AppendHeader("Content-Disposition", "attachment;filename=test.pdf");

//こっちは、IEからOLEオブジェクトを開く
Response.AppendHeader("Content-Disposition", "inline;filename=test.pdf");

// HTTPレスポンス エンティティ設定
Response.WriteFile("c:\test.pdf"));

// HTTPレスポンス エンティティ設定の終了
Response.End();

トップ   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS