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

Barbara Streisand
Lepaskan: 2024-10-20 22:03:30
asal
432 orang telah melayarinya

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();
}
Salin selepas log masuk

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>
Salin selepas log masuk

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!

sumber:php
Kenyataan Laman Web ini
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
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan