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

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

ただいまの
回答率

88.62%

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

受付中

回答 3

投稿 編集

  • 評価
  • クリップ 1
  • VIEW 1,826

nkd

score 10

前提・実現したいこと

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

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

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

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

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

該当のソースコード

$(document).on("click", ".download", function(){
    showLoading(); // ロード表示

    var filename = "dl_2GB.zip";
    var data = {};
    data["path"] = "/tmp/dl_2GB.zip";
    $.ajax({
        type : "POST",
        url : "check.php",
        data : data,
        cache: false,
        dataType: "json",
        success : function(obj, dataType) {
            if(obj.status){
                var xhr = new XMLHttpRequest();
                var url = 'download.php?&path=' + data["path"];
                xhr.open("GET", url, true);
                xhr.responseType = "blob";
                xhr.setRequestHeader('X-Requested-With', 'XMLHttpRequest');
                xhr.onload = function(){
                    if(this.status == 200){
                        var blob = xhr.response;
                        if (window.navigator.msSaveBlob){
                            window.navigator.msSaveBlob(blob, filename);
                        }else{
                            var objectURL = window.URL.createObjectURL(blob);
                            var link = document.createElement("a");
                            document.body.appendChild(link);
                            link.href = objectURL;
                            link.download = filename;
                            link.click();
                            document.body.removeChild(link);
                            window.URL.revokeObjectURL(objectURL);
                        }
                        hideLoading(); // ロード非表示
                        return false;
                    }else{
                        alert("失敗");
                        hideLoading(); // ロード非表示
                    }
                };
                xhr.send(null);
                return false;
            }else{
                alert("失敗");
                removeLoading(); // ロード非表示
            }
        },
        error : function(XMLHttpRequest, textStatus, errorThrown) {
            alert("失敗");
        }
    });
});
header('Content-Type: application/zip');
header('Content-Disposition: attachment; filename="' . basename($_GET["path"]) . '"');
header('X-Content-Type-Options: nosniff');
header('Connection: close');

while(ob_get_level() > 0){
  ob_end_clean();
}
ob_start();

if($file = fopen($_GET["path"], 'rb')){
    while(!feof($file) and (connection_status() == 0)) {
        echo fread($file, '4096');
        ob_flush();
    }
    ob_flush();
    fclose($file);
}
ob_end_clean();
exit;

試したこと

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

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • m6u

    2020/01/14 17:42 編集

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

    キャンセル

  • yambejp

    2020/01/14 17:51

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

    キャンセル

  • nkd

    2020/01/14 18:00

    ご質問ありがとうございます。

    m6uさん
    chromeのデベロッパーツールのnetworkタブから確認した場合ダウンロードが始まるまで、2GBで1.3分、4GBで3.2分でした。
    実行時間の調整とは具体的にどの様な対策となりますでしょうか?

    yambejpさん
    同じマシンです。
    補足にPCスペックを記載しました。

    キャンセル

回答 3

+4

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 22:53 編集

    可能性は低いけどエンタープライズモードでIE7にしてて、IE7のバグでダウンロードできない。みたいな

    (想像の想像の話なのでここに書いておきます。)

    https://support.microsoft.com/ja-jp/help/298618/you-cannot-download-files-that-are-2-gb-or-larger



    あと、今回とは全く別件ですが、調べてたら
    「IE11では4GB以上アップロード不可」
    と言ったものがありました。
    念のため書いておきます。

    キャンセル

  • 2020/01/15 07:10

    @otn

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

    キャンセル

  • 2020/01/15 10:39

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

    キャンセル

+4

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/15 10:56 編集

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

    キャンセル

  • 2020/01/15 11:47

    asahina1979さん
    ご回答ありがとうございます。
    Content-Lengthを付与しても挙動は変わりませんでした。

    m6uさん
    コメントありがとうございます。
    事例の記事も試してみましたが、動作は変わらずでした。

    キャンセル

+3

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/15 11:38

    otnさん
    ご回答ありがとうございます。
    ダウンロードのみが目的であれば仰る通り直接叩くことでダウンロードはできました。

    JavaScriptの変数に入れるサイズ上限を調べました。
    ちょっと確証はないのですが、問題ないのでは無いかと思います。

    IEが64bitで動作していると言う点ですが、仰る通り親IEは64bitで子IEは32bitで動作していました。
    教えて頂いた通り、「拡張保護モードで64ビットプロセッサを有効にする」をチェック(UAは変わらずWOW64;でした)を入れて実行したところ、ページ自体は64bitで開くのですが、ダウンロードを実行してできるプロセスは32bitでした。
    それでも1.5GB当たりでとどまり、その後はその状態を維持する形(1時間監視しました)でダウンロード自体は開始しませんでした。

    キャンセル

  • 2020/01/15 13:59

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

    キャンセル

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

  • ただいまの回答率 88.62%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る