Heim  >  Artikel  >  Backend-Entwicklung  >  So verwenden Sie das TUS-Protokoll in PHP, um das Hochladen großer Dateien am Haltepunkt fortzusetzen

So verwenden Sie das TUS-Protokoll in PHP, um das Hochladen großer Dateien am Haltepunkt fortzusetzen

coldplay.xixi
coldplay.xixinach vorne
2020-09-01 17:53:252675Durchsuche

So verwenden Sie das TUS-Protokoll in PHP, um das Hochladen großer Dateien am Haltepunkt fortzusetzen

【Verwandte Lernempfehlungen: php-Grafik-Tutorial


In modernen Website-Anwendungen ist das Hochladen von Dateien weit verbreitet. In jeder Sprache kann die Datei-Upload-Funktion mithilfe einiger Tools realisiert werden. Allerdings ist das Hochladen großer Dateien immer noch etwas mühsam.

Angenommen, Sie laden zu diesem Zeitpunkt eine große Datei hoch und der Fortschritt beträgt 90 %. Wenn die Internetverbindung plötzlich unterbrochen wird oder der Browser abstürzt, wird das hochgeladene Programm beendet und Sie müssen von vorne beginnen. Wirklich unangenehm, oder? Was noch deprimierender ist: Wenn Ihre Internetgeschwindigkeit sehr langsam ist, können Sie den Upload nie erfolgreich durchführen, egal wie oft Sie es noch einmal versuchen.

In PHP können wir versuchen, die Breakpoint-Resume-Funktion des tus-Protokolls zu verwenden, um dieses Problem zu lösen.

Was ist tus?

Tus ist ein offenes Protokoll zur Dateiwiederaufnahme auf Basis von HTTP. Das Hochladen fortsetzen bedeutet, dass der Upload an der Stelle fortgesetzt werden kann, an der er unterbrochen wurde, unabhängig davon, ob er vom Benutzer oder unerwartet aus Netzwerk- oder anderen Gründen unterbrochen wird, ohne von vorne beginnen zu müssen.

Das Tus-Protokoll wurde im Mai 2017 von Vimeo übernommen.

Warum tus verwenden?

Zitat aus dem Blog von Vimeo:

Der Grund, warum wir uns für tus entschieden haben, liegt darin, dass es den Datei-Upload-Prozess in einer prägnanten und offenen Form standardisieren kann. Diese Standardisierung hilft API-Entwicklern, sich mehr auf die Logik der Anwendung selbst zu konzentrieren als auf den Datei-Upload-Prozess.

Ein weiterer Vorteil des Hochladens auf diese Weise besteht darin, dass Sie mit dem Hochladen von Dateien auf Ihrem Laptop beginnen und dann zu Ihrem Mobiltelefon oder einem anderen Gerät wechseln können, um mit dem Hochladen derselben Datei fortzufahren, was das Benutzererlebnis erheblich verbessern kann.

Bild: Dieser grobe Workflow

Start

Der erste Schritt besteht darin, Abhängigkeiten zu laden.

$ composer require ankitpokhrel/tus-php

tus-php

ist ein reines PHP-Framework für das tus-Resume-Protokoll v1.0.0, das die Interaktion zwischen Server und Client perfekt realisiert.

Update

: v3 der offiziellen PHP-Bibliothek von Vimeo verwendet jetzt TusPHP.

Erstellen Sie einen Server zur Bearbeitung von Anfragen

Sie können einen Server wie folgt erstellen.

// server.php

$server   = new \TusPhp\Tus\Server('redis');
$response = $server->serve();

$response->send();

exit(0); // 退出当前 PHP 进程

Sie müssen Ihren Server so konfigurieren, dass er auf ein bestimmtes Terminal reagiert. Wenn Sie Nginx verwenden, können Sie ihn wie folgt konfigurieren:

# nginx.conf

location /files {
    try_files $uri $uri/ /path/to/server.php?$query_string;
}

Angenommen dass die URL unseres Servers

http://server.tus.local

ist. Daher können wir basierend auf unserer Nginx-Konfiguration über http://server.tus.local/files darauf zugreifen. Gehen Sie zu unserem tus-Terminal. Endpunktkonfiguration im RESTful-Stil:

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

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

# 创建\
POST /files

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

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

Weitere Informationen zum Routing finden Sie in den Protokolldetails.

Wenn Sie ein Laravel-ähnliches Framework verwenden, müssen Sie diese nicht in der Konfigurationsdatei definieren. Sie können Routen direkt definieren, um auf die grundlegenden Endpunkte von tus zuzugreifen. Die relevanten Details werden wir in einem weiteren Tutorial vorstellen.

Verwenden Sie den tus-php-Client, um Uploads zu verwalten.

Wenn der Server eingerichtet ist, können Clients Dateien in Blöcken hochladen. Erstellen wir zunächst ein einfaches HTML-Formular, um Benutzereingaben zu erhalten.

<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>

Nach dem Absenden des Formulars müssen wir einige Schritte befolgen, um den Upload zu verarbeiten.

    Erstellen Sie ein tus-php-Clientobjekt
  1. // Tus client
    
    $client = new \TusPhp\Tus\Client('http://server.tus.local');
  2. Der erste Parameter im obigen Code ist Ihre tus-Serveradresse.

2.

Initialisieren Sie den Client mithilfe von Dateimetadaten

Um die Einzigartigkeit der hochgeladenen Dateien sicherzustellen, müssen wir jede hochgeladene Datei eindeutig identifizieren. Auf diese Weise kann der Server beim Unterbrechen und anschließenden Übertragen der Datei eindeutig erkennen, welche Fragmente zur selben Datei gehören. Dieser Identifikationscode kann von Ihnen selbst vorgegeben oder vom System generiert werden.

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

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

Wenn Sie den Identifikationscode nicht angeben möchten, können Sie ihn wie folgt schreiben und das System generiert ihn automatisch:

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

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

3.

Dateien in Blöcken hochladen

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

$bytesUploaded = $client->upload($chunkSize);
Wenn Sie die Datei fortsetzen möchten Im nächsten Block können Sie denselben Identifikationscode-Parameter verwenden, um die Übertragung fortzusetzen.

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

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

Nachdem alle Dateien hochgeladen wurden, verwendet der Server standardmäßig

, um die Summe der Dateien zu überprüfen, um sicherzustellen, dass keine Dateien fehlen.

使用 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编程(视频)

Das obige ist der detaillierte Inhalt vonSo verwenden Sie das TUS-Protokoll in PHP, um das Hochladen großer Dateien am Haltepunkt fortzusetzen. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Dieser Artikel ist reproduziert unter:learnku.com. Bei Verstößen wenden Sie sich bitte an admin@php.cn löschen