Wie kann ich den Datei-Upload-Fortschritt in Echtzeit überwachen, ohne den Server oder Client zu blockieren?

Barbara Streisand
Freigeben: 2024-10-20 22:03:30
Original
357 Leute haben es durchsucht

How Can I Real-Time Monitor File Upload Progress Without Blocking the Server or Client?

Wie kann ich den Fortschritt eines Datei-Uploads in Echtzeit überwachen, ohne den Server oder Client zu blockieren?

Hintergrund:
Wenn ein Wenn eine Datei hochgeladen wird, kann der Fortschritt des Schreibens der Datei auf den Server verfolgt werden. Dies kann ohne Blockierung des Servers oder Clients erfolgen, was eine reibungslose und effiziente Benutzererfahrung ermöglicht.

Problem:
Die aktuelle Implementierung legt das File-Objekt als Hauptteil eines Abrufs fest Anfrage. Um den Fortschritt jedoch in Echtzeit zu überwachen, ist ein anderer Ansatz erforderlich.

Anforderung:
Anzeige der Dateigröße der Datei, die als Text/Ereignis auf den Server geschrieben wird -Strom. Der Prozess sollte fortgesetzt werden, bis alle als Abfragezeichenfolgenparameter bereitgestellten Bytes geschrieben wurden.

Lösung:

PHP-Implementierung:

<code class="php">// stream.php
header("Content-Type: text/event-stream");
header("Cache-Control: no-cache");
header("Connection: keep-alive");

$lastId = isset($_SERVER["HTTP_LAST_EVENT_ID"]) ? intval($_SERVER["HTTP_LAST_EVENT_ID"]) : 0;
$upload = $_GET["filename"];
$data = 0;
// Ignore file size if it's already there
$wasLess = $lastId != 0;
while ($data < $_GET["filesize"] || !$wasLess) {
    clearstatcache(true, $upload);
    $data = filesize($upload);
    $wasLess |= $data < $_GET["filesize"];
    if ($wasLess) {
        sendMessage($lastId, $data);
        $lastId++;
    }
    usleep(20000);
}

function sendMessage($id, $data)
{
    echo "id: $id\n";
    echo "data: $data\n\n";
    ob_flush();
}
Nach dem Login kopieren

JavaScript-Implementierung:

<code class="javascript">const [url, stream, header] = ["data.php", "stream.php", "x-filename"];

input.addEventListener("change", (event) => {
  const [file] = input.files;
  const [{ size: filesize, name: filename }, headers, params] = [file, new Headers(), new URLSearchParams()];

  headers.append(header, filename);
  progress.value = 0;
  progress.max = filesize;
  const [request, source] = [
    new Request(url, { method: "POST", headers, body: file }),
    new EventSource(`${stream}?${params.toString()}`)
  ];

  source.addEventListener("message", (e) => {
    progress.value = e.data;
    // Close the source when the data equals the filesize
    if (e.data == filesize) {
      source.close();
    }
  });
  fetch(request);
});</code>
Nach dem Login kopieren

Das obige ist der detaillierte Inhalt vonWie kann ich den Datei-Upload-Fortschritt in Echtzeit überwachen, ohne den Server oder Client zu blockieren?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Quelle:php
Erklärung dieser Website
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
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage
Über uns Haftungsausschluss Sitemap
Chinesische PHP-Website:Online-PHP-Schulung für das Gemeinwohl,Helfen Sie PHP-Lernenden, sich schnell weiterzuentwickeln!