ホームページ >ウェブフロントエンド >jsチュートリアル >一貫した「ロード」イベントが発生しないブラウザでファイルのダウンロード完了を確実に検出するにはどうすればよいですか?

一貫した「ロード」イベントが発生しないブラウザでファイルのダウンロード完了を確実に検出するにはどうすればよいですか?

DDD
DDDオリジナル
2024-12-18 05:56:15881ブラウズ

How Can I Reliably Detect File Download Completion in a Browser without Consistent

ブラウザでのファイルのダウンロード完了の検出

ユーザーにフィードバックを提供する場合、動的なファイルの生成とダウンロードは課題となる場合があります。この記事では、サーバーがリクエストに応じてファイルを生成するが、ブラウザーがダウンロードの完了時期を明確に示さないシナリオを検証します。

問題: イベント検出の制限

作成者は、ファイルが動的に生成され、非表示の iframe に保存されるシナリオで、ダウンロードの完了を検出するのが困難でした。 iframe の「load」イベントはブラウザ間で一貫してトリガーされず、信頼性の低いインジケーターが発生しました。

代替解決策: クライアント側ポーリング

解決策の 1 つは次のとおりです。 JavaScript のクライアント側ポーリング メカニズムを使用します。アルゴリズムは次のように機能します。

  • 一意のトークンが生成され、ダウンロード リクエストに含まれます。
  • ブラウザには「待機中」インジケーターが表示されます。
  • タイマー「fileDownloadToken」という名前の Cookie を定期的にチェックする機能が開始されます。
  • Cookie が存在し、

サーバー側の応答

サーバー側のコードは、「fileDownloadToken」という名前の Cookie を設定することで応答します。 " リクエストに空ではないトークン値が含まれている場合。この Cookie は、ダウンロードが完了したことをクライアント側のコードに通知する信号として機能します。

コードの実装

クライアント側 JavaScript の例:

function blockResubmit() {
  // ...
  downloadTimer = window.setInterval(function() {
    var token = getCookie("fileDownloadToken");

    if (token == downloadToken || attempts == 0) {
      unblockSubmit();
    }

    attempts--;
  }, 1000);
}

サーバー側の例PHP:

$TOKEN = "downloadToken";

// Sets a cookie so that when the download begins the browser can
// unblock the submit button.
$this->setCookieToken($TOKEN, $_GET[$TOKEN], false);

$result = $this->sendFile();

このアプローチの利点

  • サーバー上で一時ファイルを作成する必要はありません。
  • 互換性があります
  • 指定された環境でダウンロードの完了を検出する信頼性の高い方法を提供します。シナリオ。

以上が一貫した「ロード」イベントが発生しないブラウザでファイルのダウンロード完了を確実に検出するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。