Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Bagaimanakah Saya Boleh Memantau Kemajuan Muat Naik Fail Masa Nyata Tanpa Menyekat Pelayan atau Pelanggan?

Bagaimanakah Saya Boleh Memantau Kemajuan Muat Naik Fail Masa Nyata Tanpa Menyekat Pelayan atau Pelanggan?

Barbara Streisand
Barbara Streisandasal
2024-10-20 22:03:30359semak imbas

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

Bagaimana untuk memantau kemajuan muat naik fail dalam masa nyata tanpa menyekat pelayan atau klien?

Latar Belakang:
Apabila muat naik fail berlaku, kemajuan fail yang ditulis ke pelayan boleh dijejaki. Ini boleh dilakukan tanpa menyekat pelayan atau pelanggan, membolehkan pengalaman pengguna yang lancar dan cekap.

Masalah:
Pelaksanaan semasa menetapkan objek Fail sebagai badan pengambilan permintaan. Walau bagaimanapun, untuk memantau kemajuan dalam masa nyata, pendekatan berbeza diperlukan.

Keperluan:
Paparkan saiz fail fail yang sedang ditulis ke pelayan sebagai teks/acara -strim. Proses harus diteruskan sehingga semua bait yang disediakan sebagai parameter rentetan pertanyaan telah ditulis.

Penyelesaian:

Pelaksanaan PHP:

<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();
}

Pelaksanaan JavaScript:

<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>

Atas ialah kandungan terperinci Bagaimanakah Saya Boleh Memantau Kemajuan Muat Naik Fail Masa Nyata Tanpa Menyekat Pelayan atau Pelanggan?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn