[[Open棟梁Project>http://opentouryo.osscons.jp/]] - [[マイクロソフト系技術情報 Wiki>http://techinfoofmicrosofttech.osscons.jp/]] * 目次 [#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編)を確認ください。~ https://github.com/OpenTouryoProject/OpenTouryoDocuments/blob/master/documents/1_User_Guide/ja-JP/7_User_Guide%28BetterUse_and_FAQ%29.doc **ダウンロード処理の例 [#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();