ホームページ  >  記事  >  バックエンド開発  >  PHP で TUS プロトコルを使用して、大きなファイルのアップロードをブレークポイントで再開する方法

PHP で TUS プロトコルを使用して、大きなファイルのアップロードをブレークポイントで再開する方法

coldplay.xixi
coldplay.xixi転載
2020-09-01 17:53:252655ブラウズ

PHP で TUS プロトコルを使用して、大きなファイルのアップロードをブレークポイントで再開する方法

[関連する学習の推奨事項: php グラフィック チュートリアル]

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

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

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

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

tus とは何ですか?

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

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

Why use tus?

Vimeo のブログからの引用:

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

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

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

開始

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

$ composer require ankitpokhrel/tus-php

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

Update: 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..

RESTful スタイルに基づくエンドポイント構成:

# 获取有关服务器目前配置的信息\
OPTIONS /files

# 检查上传的文件是否合法\
HEAD /files/{upload-key}

# 创建\
POST /files

# 修改\
PATCH /files/{upload-key}

# 删除\
DELETE /files/{upload-key}

を介して tus ターミナルにアクセスできます。ルーティングの詳細については、「契約の詳細」を参照してください。

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>

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

  1. tus-php クライアント オブジェクトを作成する
// Tus client

$client = new \TusPhp\Tus\Client('http://server.tus.local');

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

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

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

// 设置标识码和文件元数据

$client->setKey($uploadKey)
    ->file($_FILES['tus_file']['tmp_name'], 'your file name');

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

$client->file($_FILES['tus_file']['tmp_name'], 'your file name');

$uploadKey = $client->getKey(); // Unique upload key

3. ファイルを分割してアップロードする

// $chunkSize 是以字节为单位的,例如 5000000 等于 5 MB

$bytesUploaded = $client->upload($chunkSize);

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

// 在下一个请求中续传文件

$bytesUploaded = $client->setKey($uploadKey)->upload($chunkSize);

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

使用 tus-js-client 客户端处理文件上传

tus 协议的团队还开发了一个模块化的文件上传插件  Uppy。这个插件可以在官方 tus-js-client 和 tus-php 服务器之间建立连接。也就是说我们可以使用 php 配合 js 来实现文件上传了。

uppy.use(Tus, {
  endpoint: 'https://server.tus.local/files/', // 你的 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('/path/to/file', 'chunk_a.ext');

// 从第 1000  个字节开始上传 10000 字节
$bytesUploaded = $client->seek(1000)->upload(10000);
$chunkAkey     = $client->getKey();

// 从 第 0 个字节开始上传 10000 字节
$bytesUploaded = $client->setFileName('chunk_b.ext')->seek(0)->upload(1000);
$chunkBkey     = $client->getKey();

// 从第 11000 个字节  (10000 +  1000) 开始上传剩余的字节
$bytesUploaded = $client->setFileName('chunk_c.ext')->seek(11000)->upload();
$chunkCkey     = $client->getKey();

// 把分块上传的文件组合起来
$client->setFileName('actual_file.ext')->concat($uploadKey, $chunkAkey, $chunkBkey, $chunkCkey);

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

总结

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

Happy Coding!

相关学习推荐:php编程(视频)

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

声明:
この記事はlearnku.comで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。