PHP で TUS プロトコルを使用してブレークポイントを実装し、大きなファイルのダウンロードを再開します

藏色散人
リリース: 2023-04-07 12:54:01
転載
3353 人が閲覧しました

大きなファイルのアップロードで苦労したことはありますか?ファイルのアップロードプロセスが何らかの理由で中断された場合、ファイル全体を再アップロードせずに、中断された時点からアップロードを続行できますか?このような混乱がある場合は、以下を読み続けてください。

最近の Web サイト アプリケーションでは、ファイルをアップロードすることが非常に一般的です。どの言語でも、何らかのツールを利用することでファイルアップロード機能を実現できます。ただし、大きなファイルをアップロードする必要があるのはまだ少し面倒です。

現時点で大きなファイルをアップロードしているとします。約 1 時間が経過し、進行状況は 90% です。インターネットが突然切断されたり、ブラウザがクラッシュした場合、アップロードされたプログラムは終了し、最初からやり直す必要があります。本当に不快ですよね?さらに憂鬱なのは、インターネット速度が非常に遅い場合、何度再試行してもアップロードが成功しないことです。

PHP では、tus プロトコルのブレークポイント再開関数を使用して、この問題を解決することができます。

tus とは何ですか?

Tus は、ファイル ブレークポイント再開転送用の HTTP ベースの open プロトコルです。アップロードの再開とは、ユーザーによって中断された場合でも、ネットワークやその他の理由により予期せずアップロードが中断された場合でも、最初からやり直すことなく、中断されたところからアップロードを再開できることを意味します。

Tus プロトコルは、2017 年 5 月に Vimeo によって採用されました。

なぜ tus を使うのか?

Vimeo のブログから引用:

なぜ tus を使用することにしたかというと、簡潔で簡潔な文で使用できるからです。フォームを開く ファイルのアップロード プロセスを標準化します。この標準化により、API 開発者はファイルのアップロード プロセスではなく、アプリケーション自体のロジックに重点を置くことができます。

この方法でアップロードするもう 1 つの利点は、ラップトップでファイルのアップロードを開始し、携帯電話または他のデバイスに移動して同じファイルのアップロードを継続できることです。これにより、ユーザー エクスペリエンスが大幅に向上します。

PHP で TUS プロトコルを使用してブレークポイントを実装し、大きなファイルのダウンロードを再開します

図: 大まかなワークフロー

開始

最初のステップは、依存関係をロードすることです。

$ composer require ankitpokhrel/tus-php
ログイン後にコピー

tus-php は、tus ブレークポイント再開プロトコル v1.0.0 に使用される純粋な PHP フレームワークで、サーバーとクライアント間の対話を完全に実現します。

更新: 現在、Vimeo

公式 PHP ライブラリ の v3 は TusPHP を使用しています。

リクエストを処理するサーバーの作成

次のようにサーバーを作成できます。

// server.php
$server   = new \TusPhp\Tus\Server('redis');
$response = $server->serve();
$response->send();
exit(0); // 退出当前 PHP 进程
ログイン後にコピー

サーバーが応答できるように構成する必要があります。特定の端末に。 Nginx を使用する場合は、次のように設定できます:

# nginx.conf
location /files {
    try_files $uri $uri/ /path/to/server.php?$query_string;
}
ログイン後にコピー

サーバーの URL が http://server.tus.local であるとします。したがって、上記の Nginx 設定に基づいて、http を渡すことができます。 ://server.tus.local/files。tus ターミナルにアクセスするには。

RESTful スタイルのエンドポイント構成:

# 获取有关服务器目前配置的信息\
OPTIONS /files
# 检查上传的文件是否合法\
HEAD /files/{upload-key}
# 创建\
POST /files
# 修改\
PATCH /files/{upload-key}
# 删除\
DELETE /files/{upload-key}
ログイン後にコピー

View

プロトコルの詳細 ルーティングに関する詳細情報を取得します。情報。

Laravel と同様のフレームワークを使用している場合は、設定ファイルでこれらを定義する必要はなく、tus の基本エンドポイントにアクセスするためのルートを直接定義できます。関連する詳細については、別のチュートリアルで紹介します。

tus-php クライアントを使用してアップロードを処理する

サーバーを配置すると、クライアントはファイルを分割してアップロードできます。まずは、ユーザーからの入力を取得するための単純な HTML フォームを作成しましょう。

<form action="upload.php" method="post" enctype="multipart/form-data">
    <input type="file" name="tus_file" id="tus-file" />
    <input type="submit" value="Upload" />
</form>
ログイン後にコピー

フォームを送信した後、いくつかの手順に従ってアップロードを処理する必要があります。

tus-php クライアント オブジェクトを作成する

// Tus client
$client = new \TusPhp\Tus\Client(&#39;http://server.tus.local&#39;);
ログイン後にコピー

上記のコードの最初のパラメーターは、tus サーバーのアドレスです。

2. ファイル メタデータを使用してクライアントを初期化する

アップロードされたファイルの一意性を確保するには、アップロードされた各ファイルを一意に識別する必要があります。このようにして、ファイルが中断されて送信された場合、サーバーはどのフラグメントが同じファイルに属しているかを明確に識別できます。この識別コードは、自分で指定することも、システムによって生成することもできます。

// 设置标识码和文件元数据
$client->setKey($uploadKey)
    ->file($_FILES[&#39;tus_file&#39;][&#39;tmp_name&#39;], &#39;your file name&#39;);
ログイン後にコピー

識別コードを指定したくない場合は、次のように記述すると、システムが自動的に識別コードを生成します:

$client->file($_FILES[&#39;tus_file&#39;][&#39;tmp_name&#39;], &#39;your file name&#39;);
$uploadKey = $client->getKey(); // Unique upload key
ログイン後にコピー

3. ファイルを次の場所にアップロードします。 Parts

// $chunkSize 是以字节为单位的,例如 5000000 等于 5 MB
$bytesUploaded = $client->upload($chunkSize);
ログイン後にコピー

When 次のブロックの送信を再開したい場合は、同じ識別コードパラメータを持ち込んで送信を再開できます。

// 在下一个请求中续传文件
$bytesUploaded = $client->setKey($uploadKey)->upload($chunkSize);
ログイン後にコピー

すべてのファイルがアップロードされた後、デフォルトでは、サーバーは sha256 を使用してファイルの合計を検証し、ファイルが失われていないことを確認します。

tus-js-client クライアントを使用してファイルのアップロードを処理する

tus プロトコルのチームは、モジュール式のファイル アップロード プラグイン Uppy も開発しました。このプラグインは、公式の tus-js-client と tus-php サーバー間の接続を確立できます。つまり、php と js を使用してファイルをアップロードできます。

uppy.use(Tus, {
  endpoint: &#39;https://server.tus.local/files/&#39;, // 你的 tus 服务器
  resume: true,
  autoRetry: true,
  retryDelays: [0, 1000, 3000, 5000]
})
ログイン後にコピー

更多细节可以查看 uppy 的文档, 这里 还有些例子可以供你参考。

分块上传

tus-php 服务器支持 concatenation 扩展,可以把多次上传的文件合为一个文件。因此,我们可以在客户端支持并行上传以及非连续的分块文件上传。

使用 tus-php 实现分块上传

tus-partial-upload.php

<?php
// 文件唯一标识码
$uploadKey = uniqid();
$client->setKey($uploadKey)->file(&#39;/path/to/file&#39;, &#39;chunk_a.ext&#39;);
// 从第 1000  个字节开始上传 10000 字节
$bytesUploaded = $client->seek(1000)->upload(10000);
$chunkAkey     = $client->getKey();
// 从 第 0 个字节开始上传 10000 字节
$bytesUploaded = $client->setFileName(&#39;chunk_b.ext&#39;)->seek(0)->upload(1000);
$chunkBkey     = $client->getKey();
// 从第 11000 个字节  (10000 +  1000) 开始上传剩余的字节
$bytesUploaded = $client->setFileName(&#39;chunk_c.ext&#39;)->seek(11000)->upload();
$chunkCkey     = $client->getKey();
// 把分块上传的文件组合起来
$client->setFileName(&#39;actual_file.ext&#39;)->concat($uploadKey, $chunkAkey, $chunkBkey, $chunkCkey);
ログイン後にコピー

分块上传的完整例子 在这里.

总结

由于 tus-php 项目 本身还出于初级阶段,后面可能还会有一些改动。在 example 文件夹里,有三个不同的例子供你参考。如果任何问题或者建议,欢迎留言交流。

以上がPHP で TUS プロトコルを使用してブレークポイントを実装し、大きなファイルのダウンロードを再開しますの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

関連ラベル:
php
ソース:learnku.com
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
最新の問題
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート