サーバーまたはクライアントをブロックせずに、ファイルのアップロードの進行状況をリアルタイムで監視するにはどうすればよいですか?

Barbara Streisand
リリース: 2024-10-20 22:03:30
オリジナル
356 人が閲覧しました

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

サーバーやクライアントをブロックせずに、ファイルのアップロードの進行状況をリアルタイムで監視するにはどうすればよいですか?

背景:
ファイルのアップロードが発生すると、サーバーに書き込まれるファイルの進行状況を追跡できます。これはサーバーやクライアントをブロックすることなく実行できるため、スムーズで効率的なユーザー エクスペリエンスが可能になります。

問題:
現在の実装では、File オブジェクトがフェッチの本体として設定されています。リクエスト。ただし、進行状況をリアルタイムで監視するには、別のアプローチが必要です。

要件:
サーバーに書き込まれているファイルのサイズをテキスト/イベントとして表示します。 -ストリーム。このプロセスは、クエリ文字列パラメータとして指定されたすべてのバイトが書き込まれるまで継続する必要があります。

解決策:

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();
}
ログイン後にコピー

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>
ログイン後にコピー

以上がサーバーまたはクライアントをブロックせずに、ファイルのアップロードの進行状況をリアルタイムで監視するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート
私たちについて 免責事項 Sitemap
PHP中国語ウェブサイト:福祉オンライン PHP トレーニング,PHP 学習者の迅速な成長を支援します!