マイクロソフト系技術情報 Wiki」は、「Open棟梁Project」,「OSSコンソーシアム .NET開発基盤部会」によって運営されています。

目次

概要

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

初期化・終了処理

ヘッダの初期化

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

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

書き込み終了処理

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

  • ※ これを行わないと、当該画面のHTML出力がファイル出力の後に続いてしまったりします。
  • ※ Response.Flash()は最終的にはFlashされるため必須ではありません。
// HTTPレスポンス エンティティ設定の終了
Response.End(); 

HTTPヘッダ

  • 誤ったHTTPヘッダを付与すると正しくダウンロードできないことがあります。
  • HTTPヘッダの確認方法については、こちら(HTTPデバッグ)を参照。

Cacheabilityヘッダ

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

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

Content-Typeヘッダ

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

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

Content-Dispositionヘッダ

  • ファイルとしてのダウンロードを要求するか?
  • OLEドキュメントとしてインライン表示を要求するか?

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

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

  • 進捗ダイアログの表示に問題が出る。
  • また、単純にTCP/IPの受信ロジックを考えて、
    • 受信バッファの採り方や、
    • 受信バイト数などが変わって

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

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

一般の対応状況

  • 通常のHTMLのレスポンス
    HTTP/1.1 200 OK				
    Cache-Control: private				
    Content-Type: text/html; charset=shift_jis				
    Server: Microsoft-IIS/7.5				
    Refresh: 1200;URL=xxx.aspx				
    X-AspNet-Version: 4.0.30319				
    X-Powered-By: ASP.NET				
    Date: Thu, 02 May 2013 04:50:27 GMT				
    Content-Length: 12288				

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

  • PDFなどファイルのレスポンス
    HTTP/1.1 200 OK
    Cache-Control: private
    Transfer-Encoding: chunked
    Content-Type: application/pdf; charset=Shift_JIS
    Server: Microsoft-IIS/7.5
    Refresh: 1200;URL=xxx.aspx
    Content-Disposition: attachment;filename=e:xxx.pdf
    X-AspNet-Version: 4.0.30319
    X-Powered-By: ASP.NET
    Date: Thu, 02 May 2013 04:50:29 GMT
    
    69ace
    %PDF-1.4
    %粤マモ
    2 0 obj
    
    ・・・

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ヘッダーに注目するのも良い。

  • クライアント
    • Rangeリクエスト・ヘッダ
  • サーバ
    • Content-Rangesレスポンス・ヘッダ
    • Content-Type multipart/byterangesレスポンス・ヘッダ

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

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

  • 都度HTTPデバッグ・プロキシを使用してHTTPデバッグするのが良いかと思います。
  • Web上の情報(若しくは↓の参考情報)を参考にしてセルフ・サポートしてみて下さい。

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

PDF

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

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

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

対策方法は、

  • 動作する環境を前提環境とするか、
  • window.open()した画面から
    IFrame経由でインライン表示する方法を採用する

・・・で対応しました。

参考情報

  • adobe.comのacrobat kb(Knowledge Base)

CSV

Content-Type

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

Encoding

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

  • Shift-JIS
  • BOM付UTF-8

に限定されています。

このため、

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)をダウンロードする際、「保存」ではなく、
「開く」とすると、以下の現象が発生するようになった。

  • IEと別に、Excelが立ち上がる。
  • その際、再度認証(Basic認証のダイアログ)が求められる。
  • Webサーバは、ApacheでもIISでも発生するのでクライアント側の問題。

対応方法

下記で解決可能です。

  • 別アプリで開かれないのはHTTPヘッダが、
    Content-Disposition: attachment; filename=<ファイル名>になっているため。
  • Content-Disposition: inlineになっていうればIE内で開かれます。

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

knowledge

  • 原因
    The Office application then tries to access the document directly from the server.
    This differs from other browsers and other file types.
    Most browsers download the file and call the application to open the file from the local cache.
  • 対策方法(以下から選択)
  • Windows認証+SSOを使用
  • 認証Cookieを使用した認証を使用
  • 一度開いたら開きっぱなしにすると認証ダイアログの回数が減る。
  • キャッシュ(Office Protocol Discovery Cache)
    からの起動でoption呼び出ししなくなるらしい。
    HKEY_CURRENT_USER\Software\Microsoft\Office\11.0\Common\Internet\Server Cache
  • キャッシュは2週間でクリアされるもよう KB916658:表示されたら資格情報 Office 2003 で、
    Web リソースを表示するときの 2 週間ごと http://support.microsoft.com/kb/916658
  • Webサーバの設定を変更する。 option呼び出しで認証をしないようにする。
    ・・・しかしdirect-editing機能(WebDav?)が無効になる。

その他

ZoneID

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

  • @IT:Windows TIPS -- Knowledge:XP SP2のZoneId?とは?
    http://www.atmarkit.co.jp/fwin2k/win2ktips/498zoneid/zoneid.html

    Windows XP Service Pack 2(以下XP SP2)のInternet Explorer(IE)では、セキュリティ対策の一環として、新たに「ZoneId?(ゾーンID)」と呼ばれる仕組みが導入された。インターネット・ゾーンからダウンロードしたファイルや、Outlook Expressで保存したメールの添付ファイルに対して、ZoneId?と呼ばれる一種の「目印(マーカー)」を付けておき、エクスプローラなどでダブルクリックして実行しようとすると、本当に実行してもよいかどうかがユーザーに対して問い合わせられる機能である。そして、ユーザーが許可した場合にのみプログラムの実行が行われる。従来は、いったんローカルにダウンロードすれば何の制約もなくファイルを実行することができたが、ZoneId?により、インターネット・ゾーンから取得したファイルに対しては、ある程度の制約を課すことができるようになった。

  • アドレス表記を変更してIEのゾーンを切り替える - @IT
    http://www.atmarkit.co.jp/fwin2k/win2ktips/1201iezone/iezone.html

    Internet Explorer(IE)では、アクセスする先のWebサイトを「インターネット ゾーン」や「ローカル イントラネット ゾーン」という「ゾーン」で分類し、それぞれ異なるセキュリティ設定を適用することによって、ブラウザの安全性を確保している。例えばインターネット・ゾーンに対しては、実行できるスクリプトやActiveXコントロール、ダウンロード機能などを制限してセキュリティを高くするが、イントラネット・ゾーンに対しては制限を緩和し、ユーザーの業務などに支障が出ないようにする、といった具合である。

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

2GB制限

  • 2GB以上のファイルを扱えないケースがあるので注意する。

IE

フレームワークとの干渉

Open棟梁

Open棟梁の以下の機能

  • 不正操作防止機能
  • 二重送信防止機能(クライアント側)
  • ローディング・ダイアログ表示機能

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

詳しくは、利用ガイド(ベターユース、FAQ編)を確認ください。
https://github.com/OpenTouryoProject/OpenTouryoDocuments/blob/master/documents/1_User_Guide/ja-JP/7_User_Guide%28BetterUse_and_FAQ%29.doc

ダウンロード処理の例

以下、.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();

Tags: :その他、開発の色々


トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2017-03-27 (月) 15:19:51 (813d)