- 追加された行はこの色です。
- 削除された行はこの色です。
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();