Heim >Web-Frontend >js-Tutorial >Wie kann ich den Abschluss des Dateidownloads in einem Browser ohne konsistente „Lade'-Ereignisse zuverlässig erkennen?

Wie kann ich den Abschluss des Dateidownloads in einem Browser ohne konsistente „Lade'-Ereignisse zuverlässig erkennen?

DDD
DDDOriginal
2024-12-18 05:56:15881Durchsuche

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

Erkennen des Abschlusses des Datei-Downloads in Browsern

Dynamisches Generieren und Herunterladen von Dateien kann eine Herausforderung sein, wenn es darum geht, Benutzern Feedback zu geben. In diesem Artikel wird ein Szenario untersucht, in dem ein Server als Antwort auf eine Anfrage eine Datei generiert, der Browser jedoch keinen klaren Hinweis darauf liefert, wann der Download abgeschlossen ist.

Das Problem: Einschränkungen bei der Ereigniserkennung

Der Autor hatte Schwierigkeiten, den Download-Abschluss in seinem Szenario zu erkennen, in dem die Datei dynamisch generiert und in einem versteckten Iframe gespeichert wurde. Das „load“-Ereignis auf dem Iframe wurde nicht konsistent in allen Browsern ausgelöst, was zu einem unzuverlässigen Indikator führte.

Alternative Lösung: Clientseitiges Polling

Eine Lösung beinhaltet Verwendung eines clientseitigen Abfragemechanismus in JavaScript. Der Algorithmus funktioniert wie folgt:

  • Ein eindeutiges Token wird generiert und in die Download-Anfrage eingefügt.
  • Der Browser zeigt eine „Warten“-Anzeige an.
  • Ein Timer wird gestartet, das regelmäßig nach einem Cookie mit dem Namen „fileDownloadToken“ sucht.
  • Wenn das Cookie vorhanden ist und mit dem Token übereinstimmt, wird das „Warten“ Indikator ist ausgeblendet.

Serverseitige Antwort

Der serverseitige Code antwortet, indem er ein Cookie mit dem Namen „fileDownloadToken“ setzt, wenn die Anfrage ein enthält nicht leerer Tokenwert. Dieses Cookie dient als Signal an den clientseitigen Code, dass der Download abgeschlossen ist.

Code-Implementierung

Beispiel für clientseitiges JavaScript:

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

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

    attempts--;
  }, 1000);
}

Beispiel für serverseitiges 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();

Vorteile davon Ansatz

  • Es ist keine temporäre Dateierstellung auf dem Server erforderlich.
  • Es ist mit mehreren Browsern kompatibel.
  • Es bietet eine zuverlässige Möglichkeit zur Erkennung Download-Abschluss im angegebenen Szenario.

Das obige ist der detaillierte Inhalt vonWie kann ich den Abschluss des Dateidownloads in einem Browser ohne konsistente „Lade'-Ereignisse zuverlässig erkennen?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn