質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
Microsoft Edge

Microsoft Edgeは、マイクロソフト社が開発する新しいWebブラウザです。Windows 10から標準搭載されており、Internet Explorerとは違うレンダリングエンジンが採用されています。

Internet Explorer

Internet Explorer(IE;MSIE)はマイクロソフトが開発したウェブブラウザです。Microsoft Windowsに組み込まれています。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

Ajax

Ajaxとは、Webブラウザ内で搭載されているJavaScriptのHTTP通信機能を使って非同期通信を利用し、インターフェイスの構築などを行う技術の総称です。XMLドキュメントを指定したURLから読み込み、画面描画やユーザの操作などと並行してサーバと非同期に通信するWebアプリケーションを実現することができます。

Q&A

3回答

12289閲覧

IE11で2GBを超えるZIPファイルをダウンロードしたい

nkd

総合スコア10

Microsoft Edge

Microsoft Edgeは、マイクロソフト社が開発する新しいWebブラウザです。Windows 10から標準搭載されており、Internet Explorerとは違うレンダリングエンジンが採用されています。

Internet Explorer

Internet Explorer(IE;MSIE)はマイクロソフトが開発したウェブブラウザです。Microsoft Windowsに組み込まれています。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

Ajax

Ajaxとは、Webブラウザ内で搭載されているJavaScriptのHTTP通信機能を使って非同期通信を利用し、インターフェイスの構築などを行う技術の総称です。XMLドキュメントを指定したURLから読み込み、画面描画やユーザの操作などと並行してサーバと非同期に通信するWebアプリケーションを実現することができます。

0グッド

1クリップ

投稿2020/01/14 08:32

編集2022/01/12 10:55

前提・実現したいこと

サーバに置いてある2Gまたは2Gを超えるZIPファイルをIE11、Edgeブラウザからダウンロードしたいです。
できない場合は公式または参考になるサイトなど理由が知りたいです。

IEについてはダウンロード容量自体はIE8から制限が無いようです。
Microsoft サポート

Chromeについては2GB、4GBともにダウンロードすることができました。

発生している問題・エラーメッセージ

■IE11  2GのZIPファイルがダウンロードできない ■Edge  2GのZIPファイルはダウンロードできた  4GのZIPファイルをダウンロードしようとすると自動的に画面が更新される

該当のソースコード

javascript

1$(document).on("click", ".download", function(){ 2 showLoading(); // ロード表示 3 4 var filename = "dl_2GB.zip"; 5 var data = {}; 6 data["path"] = "/tmp/dl_2GB.zip"; 7 $.ajax({ 8 type : "POST", 9 url : "check.php", 10 data : data, 11 cache: false, 12 dataType: "json", 13 success : function(obj, dataType) { 14 if(obj.status){ 15 var xhr = new XMLHttpRequest(); 16 var url = 'download.php?&path=' + data["path"]; 17 xhr.open("GET", url, true); 18 xhr.responseType = "blob"; 19 xhr.setRequestHeader('X-Requested-With', 'XMLHttpRequest'); 20 xhr.onload = function(){ 21 if(this.status == 200){ 22 var blob = xhr.response; 23 if (window.navigator.msSaveBlob){ 24 window.navigator.msSaveBlob(blob, filename); 25 }else{ 26 var objectURL = window.URL.createObjectURL(blob); 27 var link = document.createElement("a"); 28 document.body.appendChild(link); 29 link.href = objectURL; 30 link.download = filename; 31 link.click(); 32 document.body.removeChild(link); 33 window.URL.revokeObjectURL(objectURL); 34 } 35 hideLoading(); // ロード非表示 36 return false; 37 }else{ 38 alert("失敗"); 39 hideLoading(); // ロード非表示 40 } 41 }; 42 xhr.send(null); 43 return false; 44 }else{ 45 alert("失敗"); 46 removeLoading(); // ロード非表示 47 } 48 }, 49 error : function(XMLHttpRequest, textStatus, errorThrown) { 50 alert("失敗"); 51 } 52 }); 53});

php

1header('Content-Type: application/zip'); 2header('Content-Disposition: attachment; filename="' . basename($_GET["path"]) . '"'); 3header('X-Content-Type-Options: nosniff'); 4header('Connection: close'); 5 6while(ob_get_level() > 0){ 7 ob_end_clean(); 8} 9ob_start(); 10 11if($file = fopen($_GET["path"], 'rb')){ 12 while(!feof($file) and (connection_status() == 0)) { 13 echo fread($file, '4096'); 14 ob_flush(); 15 } 16 ob_flush(); 17 fclose($file); 18} 19ob_end_clean(); 20exit;

試したこと

header('Content-Type: application/force-download');
header("Content-Type: application/octet-stream");

header("Cache-Control: public");
header("Pragma: public");

上記の様にヘッダーをIEの場合など、変更や追加をしましたがダメでした。
またPHP側のファイル出力をreadfile()で行っても結果は同じでした。

補足情報(FW/ツールのバージョンなど)

開発環境 ローカルPC
CPU:Intel(R) Core(TM) i7-8700 CPU @ 3.2GHz 3.19 GHz
メモリ:16GB
XAMPP:3.2.3
PHP:5.6.40

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2020/01/14 08:43 編集

ダウンロードのかかる(サーバーPHP側)時間時間はいくらくらいでしょうか。PHPの処理時間がかかりすぎているようであれば、実行時間を調整する必要がありそうです。
yambejp

2020/01/14 08:51

DLできたchromeとできないIEは同じマシンですか?
nkd

2020/01/14 09:00

ご質問ありがとうございます。 m6uさん chromeのデベロッパーツールのnetworkタブから確認した場合ダウンロードが始まるまで、2GBで1.3分、4GBで3.2分でした。 実行時間の調整とは具体的にどの様な対策となりますでしょうか? yambejpさん 同じマシンです。 補足にPCスペックを記載しました。
guest

回答3

0

IE10, IE11 でダウンロードに失敗する事象について

原因
当該現象は、下記ブログの記事に該当していると考えられます。

IEInternals : Content-Length and Transfer-Encoding Validation in theIE10 Download Manager
http://blogs.msdn.com/b/ieinternals/archive/2012/07/16/content-length-and-transfer-encoding-validation-in-ie10-download-manager-couldnt-be-downloaded-retry-cancel.aspx

IE9 までは、サーバーからのレスポンスにヘッダー Content-Length が含まれない場合や、"Transfer-Encoding:chunked" が指定されている場合であっても転送データのサイズや終端のチェックを厳密に行っていませんでした。

しかし、IE10 以降のダウンロードマネージャーでは、厳密にチェックを行うよう動作が変更されました。この変更により、レスポンスヘッダーにContent-Length が含まれない場合や、チャンク転送でありながら転送データの終端を示す 0-sized chunk が含まれていない場合にはダウンロードを中断し、情報バーに 「(ファイル名) をダウンロードできませんでした。」を表示します。

なんかあったなぁとおもってたらやっぱりあった。

なので Content-Length を付与してください。

投稿2020/01/14 22:21

退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2020/01/15 01:56 編集

Content-Lengthを足している事例を見つけたので添えてみる: https://qiita.com/fallout/items/3682e529d189693109eb ってか、この記事を参考に見直しするだけで確度上がりそう。
nkd

2020/01/15 02:47

asahina1979さん ご回答ありがとうございます。 Content-Lengthを付与しても挙動は変わりませんでした。 m6uさん コメントありがとうございます。 事例の記事も試してみましたが、動作は変わらずでした。
guest

0

httpd の error_log にエラー情報が記録されているかどうかをまず確認するのと、
ダウンロードにかかる時間で打ち切られるまでの時間を秒単位で計測するのをお試しください。

そのうえで、
下記の設定項目を見直しをかけます。

PHP.ini にて、
PHPの処理時間の上限値である
max_execution_time
が設定されていなければ適切に設定する。
初期値は30秒らしいので、30秒付近で打ち切られるようならこの設定値。
他には、
ignore_user_abort
が初期値FALSEらしいのだけど、これをTRUEにすることで
ユーザーが接続を切っても実行し続けることができるとか。
(これを解説するページが少ないので、有効性は不明。)

それと、
IE11のPCにて、KeepAlive値を調整するのもやるとヨサゲ。
Internet Explorer の既定の Keep-Alive タイムアウト値を変更する方法
レジストリの操作によって変更できるようです。

apache httpd側の設定としては、
TimeOutディレクティブ
通常60秒らしいので60秒付近で打ち切られるようなら、これかもしれないが。


直接関係ないけど、
処理時間を計測するために apache httpdのログ出力をカスタマイズしてみるのはどうだろう。

Apacheのログ出力の要点 - Qiita
Apacheのアクセスログに処理時間を出力する - takami_hiroki’s blog

処理時間が、ChromeからとIE11からとで変わるのかどうか。
その時の access_log の変化を読む。とか。

投稿2020/01/14 08:50

編集2020/01/14 13:46
退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2020/01/14 09:01 編集

というか、このスクリプトめっちゃ危険・・・ ?path=/etc/passwd こわっ
退会済みユーザー

退会済みユーザー

2020/01/14 09:07

httpdアカウントがアクセス可能なファイル、全部抜けますね Windows上だから、そのへんの意識が低いのかもしれませんが。
nkd

2020/01/14 09:09

コメントありがとうございます。 pathはソースを抜粋した時に記載したあてです。 宜しくお願いします。
nkd

2020/01/14 09:20

m6uさん ご回答ありがとうございます。 ご教授頂いた内容を一通り行ってみましたが、改善されませんでした。 error_logには特にエラーは記載されておりませんでした。
退会済みユーザー

退会済みユーザー

2020/01/14 09:25

レジストリの書き換えをしたらPCの再起動もセットで。 ちなみに、セキュリティソフト類使ってる?IEにだけ干渉するってのはあるかどうかわからないけど。
nkd

2020/01/14 09:35

m6uさん コメントありがとうございます。 はい、PCの再起動も行って動作確認を行いました。 仰る通りIEにだけ干渉するとは考え難いですが、セキュリティソフトも切っています。 IE11のデベロッパーツールで見る限り、レスポンスが返って来ていないのでXAMMP側の設定かもしれません。 ただ、それが明確にそうとわからない状況です。
退会済みユーザー

退会済みユーザー

2020/01/14 10:13

サイズを返さないと打ち切るとかなんかあった気もしたけど、どうだっけ
otn

2020/01/14 13:33 編集

> というか、このスクリプトめっちゃ危険・・・ いやこれ、どうみても、障害が起こったので再現テストのサーバー環境を手近のPCにささっと作ったものでしょう。 と思ったけど、私ならZIPファイル名固定のPHPファイルを複数個コピーで作るか。↑違うかも。
kyoya0819

2020/01/14 13:54 編集

可能性は低いけどエンタープライズモードでIE7にしてて、IE7のバグでダウンロードできない。みたいな (想像の想像の話なのでここに書いておきます。) https://support.microsoft.com/ja-jp/help/298618/you-cannot-download-files-that-are-2-gb-or-larger あと、今回とは全く別件ですが、調べてたら 「IE11では4GB以上アップロード不可」 と言ったものがありました。 念のため書いておきます。
退会済みユーザー

退会済みユーザー

2020/01/14 22:10

@otn それでもフルパスを指定しないじゃろ
nkd

2020/01/15 01:39

m6uさん 追加情報ありがとうございます。 apache側の設定を変更する対応が必要になりましたら取り入れたいと思います。
guest

0

IEについてはダウンロード容量自体はIE8から制限が無いようです。

はブラウザのダウンロード機能を使う場合の話でしょう。
IE11のアドレスバーに、download.phpのURLを直接打ち込めばダウンロードできるのでは?

JavaScriptの変数に入れるサイズ上限を調べたほうがいいと思います。

その前にIE11は64bitで動いているでしょうか?
親IEは64bitでもデフォルトでは子IEプロセスは32bit環境で動いているようです。
タスクマネージャの詳細タブでプラットフォームカラムを表示させて、IEプロセスを見てください。
もしプラットフォームカラムが32bitなら、調べるまでもなくJavaScript変数に2GBは入らなそうです。
子64bitにするには、インターネットオプションの詳細設定で「拡張保護モードで64ビットプロセッサを有効にする」をチェックします。

(User-Agentも32/64bitで変化します。32bit→WOW64;、64bit→Win64; x64;です)

投稿2020/01/14 14:05

編集2020/01/14 14:12
otn

総合スコア84421

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

nkd

2020/01/15 02:38

otnさん ご回答ありがとうございます。 ダウンロードのみが目的であれば仰る通り直接叩くことでダウンロードはできました。 JavaScriptの変数に入れるサイズ上限を調べました。 ちょっと確証はないのですが、問題ないのでは無いかと思います。 IEが64bitで動作していると言う点ですが、仰る通り親IEは64bitで子IEは32bitで動作していました。 教えて頂いた通り、「拡張保護モードで64ビットプロセッサを有効にする」をチェック(UAは変わらずWOW64;でした)を入れて実行したところ、ページ自体は64bitで開くのですが、ダウンロードを実行してできるプロセスは32bitでした。 それでも1.5GB当たりでとどまり、その後はその状態を維持する形(1時間監視しました)でダウンロード自体は開始しませんでした。
kaina

2020/01/15 04:59

以下のページによるとWindows 7 で、ユーザー アカウント制御の設定 を [通知しない (無効)] にしている場合、 拡張保護モードを有効にしても、子プロセスは64ビットにならないそうです。 http://utaukitune.ldblog.jp/archives/65719592.html
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問