Verwenden Sie das TUS-Protokoll in PHP, um einen Haltepunkt zu implementieren und das Herunterladen großer Dateien fortzusetzen

藏色散人
Freigeben: 2023-04-07 12:54:01
nach vorne
3354 Leute haben es durchsucht

Hatten Sie jemals Probleme mit dem Hochladen großer Dateien? Wenn der Datei-Upload-Vorgang aus irgendeinem Grund unterbrochen wird, kann ich dann an der unterbrochenen Stelle mit dem Hochladen fortfahren, ohne die gesamte Datei erneut hochzuladen? Wenn Sie solche Verwirrung haben, lesen Sie bitte weiter unten.

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 Wiederaufnahmefunktion des tus-Protokolls zu verwenden, um dieses Problem zu lösen.

Was ist tus?

Tus ist ein HTTP-basiertes offenes Protokoll für die Datei-Breakpoint-Resume-Übertragung. Das Fortsetzen des Hochladens 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 des Blogs von Vimeo:

Der Grund, warum wir uns für tus entschieden haben, ist, dass es in einer prägnanten und prägnanten Form verwendet werden kann Offenes Formular. Standardisieren Sie den Datei-Upload-Prozess. 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 Telefon oder einem anderen Gerät wechseln können, um mit dem Hochladen derselben Datei fortzufahren, was das Benutzererlebnis erheblich verbessern kann.

Verwenden Sie das TUS-Protokoll in PHP, um einen Haltepunkt zu implementieren und das Herunterladen großer Dateien fortzusetzen

Bild: Tus Grober Workflow

Start

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

$ composer require ankitpokhrel/tus-php
Nach dem Login kopieren

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

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

Erstellen Sie einen Server, der Anfragen verarbeitet

Sie können wie folgt einen Server erstellen.

// server.php
$server   = new \TusPhp\Tus\Server('redis');
$response = $server->serve();
$response->send();
exit(0); // 退出当前 PHP 进程
Nach dem Login kopieren

Sie müssen Ihren Server so konfigurieren, dass er antworten kann zu einem bestimmten Terminal. Wenn Sie Nginx verwenden, können Sie es wie folgt konfigurieren:

# nginx.conf
location /files {
    try_files $uri $uri/ /path/to/server.php?$query_string;
}
Nach dem Login kopieren

Gehen Sie davon aus, dass die URL unseres Servers http://server.tus.local lautet. Daher können wir basierend auf unserer obigen Nginx-Konfiguration http übergeben :// server.tus.local/files. Um auf unser tus-Terminal zuzugreifen.

RESTful-Endpunktkonfiguration:

# 获取有关服务器目前配置的信息\
OPTIONS /files
# 检查上传的文件是否合法\
HEAD /files/{upload-key}
# 创建\
POST /files
# 修改\
PATCH /files/{upload-key}
# 删除\
DELETE /files/{upload-key}
Nach dem Login kopieren

Protokolldetails anzeigen, um weitere Informationen zu erhalten Routing-Informationen.

Wenn Sie ein Framework ähnlich wie Laravel 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. Beginnen wir mit der Erstellung eines einfachen HTML-Formulars, um Eingaben vom Benutzer 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 Login kopieren

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

Erstellen Sie ein tus-php-Clientobjekt

// Tus client
$client = new \TusPhp\Tus\Client(&#39;http://server.tus.local&#39;);
Nach dem Login kopieren

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[&#39;tus_file&#39;][&#39;tmp_name&#39;], &#39;your file name&#39;);
Nach dem Login kopieren

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

$client->file($_FILES[&#39;tus_file&#39;][&#39;tmp_name&#39;], &#39;your file name&#39;);
$uploadKey = $client->getKey(); // Unique upload key
Nach dem Login kopieren

3 Laden Sie die Datei hoch Teile

// $chunkSize 是以字节为单位的,例如 5000000 等于 5 MB
$bytesUploaded = $client->upload($chunkSize);
Nach dem Login kopieren

Wenn Sie die Übertragung des nächsten Blocks fortsetzen möchten, können Sie denselben Identifikationscode-Parameter verwenden, um die Übertragung fortzusetzen.

// 在下一个请求中续传文件
$bytesUploaded = $client->setKey($uploadKey)->upload($chunkSize);
Nach dem Login kopieren

Nachdem alle Dateien hochgeladen wurden, verwendet der Server standardmäßig sha256, um die Dateisumme zu überprüfen, um sicherzustellen, dass keine Dateien verloren gehen.

Verwenden Sie den tus-js-client-Client, um Datei-Uploads zu verwalten

Das Team von tus Protocol hat außerdem ein modulares Datei-Upload-Plug-in Uppy entwickelt. Dieses Plugin kann eine Verbindung zwischen dem offiziellen tus-js-client und den tus-php-Servern herstellen. Mit anderen Worten: Wir können PHP und JS zum Hochladen von Dateien verwenden.

uppy.use(Tus, {
  endpoint: &#39;https://server.tus.local/files/&#39;, // 你的 tus 服务器
  resume: true,
  autoRetry: true,
  retryDelays: [0, 1000, 3000, 5000]
})
Nach dem Login kopieren

更多细节可以查看 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);
Nach dem Login kopieren

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

总结

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

Das obige ist der detaillierte Inhalt vonVerwenden Sie das TUS-Protokoll in PHP, um einen Haltepunkt zu implementieren und das Herunterladen großer Dateien fortzusetzen. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Verwandte Etiketten:
php
Quelle:learnku.com
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage