大きなファイルのアップロードで苦労したことはありますか?ファイルのアップロードプロセスが何らかの理由で中断された場合、ファイル全体を再アップロードせずに、中断された時点からアップロードを続行できますか?このような混乱がある場合は、以下を読み続けてください。
最近の Web サイト アプリケーションでは、ファイルをアップロードすることが非常に一般的です。どの言語でも、何らかのツールを利用することでファイルアップロード機能を実現できます。ただし、大きなファイルをアップロードする必要があるのはまだ少し面倒です。
現時点で大きなファイルをアップロードしているとします。約 1 時間が経過し、進行状況は 90% です。インターネットが突然切断されたり、ブラウザがクラッシュした場合、アップロードされたプログラムは終了し、最初からやり直す必要があります。本当に不快ですよね?さらに憂鬱なのは、インターネット速度が非常に遅い場合、何度再試行してもアップロードが成功しないことです。
PHP では、tus プロトコルのブレークポイント再開関数を使用して、この問題を解決することができます。
tus とは何ですか?
Tus は、ファイル ブレークポイント再開転送用の HTTP ベースの open プロトコルです。アップロードの再開とは、ユーザーによって中断された場合でも、ネットワークやその他の理由により予期せずアップロードが中断された場合でも、最初からやり直すことなく、中断されたところからアップロードを再開できることを意味します。
Tus プロトコルは、2017 年 5 月に Vimeo によって採用されました。なぜ tus を使うのか?
Vimeo のブログから引用:なぜ tus を使用することにしたかというと、簡潔で簡潔な文で使用できるからです。フォームを開く ファイルのアップロード プロセスを標準化します。この標準化により、API 開発者はファイルのアップロード プロセスではなく、アプリケーション自体のロジックに重点を置くことができます。 この方法でアップロードするもう 1 つの利点は、ラップトップでファイルのアップロードを開始し、携帯電話または他のデバイスに移動して同じファイルのアップロードを継続できることです。これにより、ユーザー エクスペリエンスが大幅に向上します。 図: 大まかなワークフロー開始
最初のステップは、依存関係をロードすることです。$ 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.conf location /files { try_files $uri $uri/ /path/to/server.php?$query_string; }
# 获取有关服务器目前配置的信息\ OPTIONS /files # 检查上传的文件是否合法\ HEAD /files/{upload-key} # 创建\ POST /files # 修改\ PATCH /files/{upload-key} # 删除\ DELETE /files/{upload-key}
プロトコルの詳細 ルーティングに関する詳細情報を取得します。情報。
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 client $client = new \TusPhp\Tus\Client('http://server.tus.local');
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. ファイルを次の場所にアップロードします。 Parts
// $chunkSize 是以字节为单位的,例如 5000000 等于 5 MB $bytesUploaded = $client->upload($chunkSize);
// 在下一个请求中续传文件 $bytesUploaded = $client->setKey($uploadKey)->upload($chunkSize);
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 文件夹里,有三个不同的例子供你参考。如果任何问题或者建议,欢迎留言交流。
以上がPHP で TUS プロトコルを使用してブレークポイントを実装し、大きなファイルのダウンロードを再開しますの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。