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

* 目次 [#bc2e0e0b]
#contents

*概要 [#k4d59519]
ダウンロード処理についての問い合わせが多いのでメモ

-アップロードについては、 
--[[アップロードのいろいろ]]

*初期化・終了処理 [#y12d5e9f]
**ヘッダの初期化 [#j6a05f6f]
誤ったヘッダを付与しないよう、一度クリアし正しいヘッダを付与します。

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

**書き込み終了処理 [#ef375237]
以降のバッファへの書き込みを停止しHTTPレスポンスを確定させます。
-※ これを行わないと、当該画面のHTML出力がファイル出力の後に続いてしまったりします。
-※ Response.Flash()は最終的にはFlashされるため必須ではありません。

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

*HTTPヘッダ [#y39498ab]
-誤ったHTTPヘッダを付与すると正しくダウンロードできないことがあります。
-HTTPヘッダの確認方法については、こちら([[HTTPデバッグ>IE、WWWブラウザのいろいろ#o9b0e736]])を参照。

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

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

-参考
--ファイルダウンロードの開くで、~
CSVファイルが開けない  Microsoft ASPのQ&A【OKWave】~
http://okwave.jp/qa/q1573645.html

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

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

-参考
--Content-Typeエンティティヘッダフィールドは~
適切なものを指定してください - Web標準普及プロジェクト~
http://www.mozilla.gr.jp/standards/webtips/webtips0033.html
--教科書に載らないWebアプリケーションセキュリティ(2)~
[無視できない]IEのContent-Type無視 (1-2) - @IT~
http://www.atmarkit.co.jp/ait/articles/0903/30/news118.html
--ファイルのダウンロード機能を実装する方法~
http://msdn.microsoft.com/ja-jp/library/cc719227.aspx

**Content-Dispositionヘッダ [#aa3270f9]

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

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

***attachment [#x10ac062]
ファイルとしてのダウンロードを要求する。

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

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

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

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

**Content-Lengthヘッダ [#pd005d4f]
***付与しない事に因る問題 [#d5e3a582]
Content-length設定の有無による~
動作の違いについて  CGIのQ&A【OKWave】~
http://okwave.jp/qa/q113178.html

-進捗ダイアログの表示に問題が出る。

-また、単純にTCP/IPの受信ロジックを考えて、
--受信バッファの採り方や、
--受信バイト数などが変わって

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

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

***一般の対応状況 [#n3f63760]

-通常の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ヘッダに自動的に付与しないものと思われる。

-c# - Response.WriteFile PDF files~
 - corrupted files - Stack Overflow~
http://stackoverflow.com/questions/770084/response-writefile-pdf-files-corrupted-files

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

-ファイルダウンロード処理(Java) プログラマーの雑記帳~
http://programmer-toy-box.sblo.jp/article/13810580.html

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

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

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

-HTTPのRangeアクセスを実装して、~
分割ダウンロードに対応する - もなじろう日記~
http://d.hatena.ne.jp/monajiro/20100617/p1

--クライアント
---Rangeリクエスト・ヘッダ

--サーバ
---Content-Rangesレスポンス・ヘッダ
---Content-Type multipart/byterangesレスポンス・ヘッダ

-[Studying HTTP] Range Requests and Partial Responses~
http://www.studyinghttp.net/range

*各種ファイルのダウンロード [#i4863dc3]
こちらも同様に、必要に応じて~
-都度HTTPデバッグ・プロキシを使用してHTTPデバッグするのが良いかと思います。
-Web上の情報(若しくは↓の参考情報)を参考にしてセルフ・サポートしてみて下さい。

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

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

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

対策方法は、

-動作する環境を前提環境とするか、

-window.open()した画面から~
IFrame経由でインライン表示する方法を採用する

・・・で対応しました。

***参考情報 [#h68c14c7]

-adobe.comのacrobat kb(Knowledge Base)

--Internet Explorer で PDF ファイルを表示するための設定について~
(Windows 版 Acrobat 8-Adobe Reader 8)~
http://helpx.adobe.com/jp/acrobat/kb/230396.html

--Web ブラウザで PDF が表示できない場合のトラブルシューティング~
(Acrobat 9-Adobe Reader 9)~
http://helpx.adobe.com/jp/acrobat/kb/235116.html

**CSV [#c32e139d]

***Content-Type [#j5b16322]
いろいろ問題が発生するケースがあるようです。

-CSVダウンロードの保存ダイアログでhtml形式となる~
http://social.technet.microsoft.com/Forums/ja-JP/internetexplorerja/thread/de9c7212-3c2e-4056-9de7-9011a215a23d/
--text/csv
--application/x-csv
--application/octet-stream
--application/vnd.ms-excel

-参考
--ファイルのダウンロード機能を実装する方法~
http://msdn.microsoft.com/ja-jp/library/cc719227.aspx
--ファイルのダウンロードダイアログで表示されるファイル名の命名規則~
http://support.microsoft.com/kb/436153/ja
--サーブレットでのCSVのダウンロード - Java Solution - @IT~
http://www.atmarkit.co.jp/bbs/phpBB/viewtopic.php?topic=12433&forum=12

--CSVが保存ダイアログでHTMLになる~
http://okwave.jp/qa/q6443040.html
--商品情報CSVのダウンロードをすると、CSVの拡張子でHTMLがダウンロードされる~
http://xoops.ec-cube.net/modules/newbb/viewtopic.php?topic_id=7514&forum=11

***Encoding [#j751d2f0]
日本語環境の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 [#oe163f0e]

***Officeのoption呼出で認証要求 [#f080c684]
Windows7+Office2007の環境下でIEからHTMLリンクから~
WebサーバからExcel(CSV)をダウンロードする際、「保存」ではなく、~
「開く」とすると、以下の現象が発生するようになった。
-IEと別に、Excelが立ち上がる。
-その際、再度認証(Basic認証のダイアログ)が求められる。
-Webサーバは、ApacheでもIISでも発生するのでクライアント側の問題。

***対応方法 [#j82e44ad]
下記で解決可能です。

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

-IE9から、デフォルトの動作が変わっているもよう。
--IE9 のウィンドウ内に Office ドキュメントを表示する ≪ Hebikuzure's Tech Memo~
http://hebikuzure.wordpress.com/2011/06/09/ie9-%E3%81%AE%E3%82%A6%E3%82%A3%E3%83%B3%E3%83%89%E3%82%A6%E5%86%85%E3%81%AB-office-%E3%83%89%E3%82%AD%E3%83%A5%E3%83%A1%E3%83%B3%E3%83%88%E3%82%92%E8%A1%A8%E7%A4%BA%E3%81%99%E3%82%8B/

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

***knowledge [#g93600f2]
-Office ドキュメントを開くときの認証要求
--http://support.microsoft.com/kb/2019105/
--http://support.microsoft.com/kb/2019105/en-us

-原因~
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を使用した認証を使用

--一度開いたら開きっぱなしにすると認証ダイアログの回数が減る。

--「パスワードを記憶する」を選択しておく。~
http://121ware.com/qasearch/1007/app/servlet/qadoc?QID=010801

--KB838028:[OFF2003] Office 2003 で~
Web サイトからドキュメントを開く方法~
http://support.microsoft.com/kb/838028

---キャッシュ(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)が無効になる。

*その他 [#q061bf6a]

**ZoneID [#g42a0e43]
ネットワーク越しでコピーした場合など、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を削除することができる。

-streamsコマンドでNTFSの代替データ・ストリーム情報を表示/削除する - @IT~
http://www.atmarkit.co.jp/fwin2k/win2ktips/1363streams/streams.html

**2GB制限 [#h23ea62b]
-2GB以上のファイルを扱えないケースがあるので注意する。

-ダウンロードというより[[ファイルシステム]]&APIの使い方に起因する話。
--[[2GB、4GB制限>ファイルシステム#ra88875b]]

***IE [#xb7a9b20]
-[XP] 2GB 以上のファイルのダウンロードに失敗します~
http://answers.microsoft.com/ja-jp/ie/forum/ie8-windows_other/xp-2gb/b9cf38e4-3780-48fa-85a2-8c20c397f35e
--Internet Explorer 6: 2GB
--Internet Explorer 7: 4GB
--Internet Explorer 8: 上限なし

--You cannot download files that are 2 GB or larger~
http://support.microsoft.com/kb/298618/en-us


**フレームワークとの干渉 [#pf06c733]

***Open棟梁 [#y86c8044]

Open棟梁の以下の機能
-不正操作防止機能
-二重送信防止機能(クライアント側)
-ローディング・ダイアログ表示機能

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

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

**ダウンロード処理の例 [#jfbdf115]
以下、.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