Maison  >  Article  >  développement back-end  >  Utilisez le protocole TUS en PHP pour implémenter le téléchargement de reprise de point d'arrêt de fichiers volumineux

Utilisez le protocole TUS en PHP pour implémenter le téléchargement de reprise de point d'arrêt de fichiers volumineux

藏色散人
藏色散人avant
2019-09-24 09:20:503362parcourir

Avez-vous déjà eu du mal à télécharger des fichiers volumineux ? Si le processus de téléchargement du fichier est interrompu pour une raison quelconque, puis-je continuer le téléchargement à partir du point interrompu sans télécharger à nouveau l'intégralité du fichier ? Si vous avez une telle confusion, continuez à lire ci-dessous.

Dans les applications de sites Web modernes, le téléchargement de fichiers est très courant. Dans n'importe quelle langue, en utilisant certains outils, la fonction de téléchargement de fichiers peut être réalisée. Cependant, il reste un peu difficile de gérer la nécessité de télécharger des fichiers volumineux.

Supposons que vous téléchargiez un fichier volumineux à ce moment-là. Environ une heure s'est écoulée et la progression est de 90 %. Si Internet est soudainement déconnecté ou si le navigateur plante, le programme téléchargé se fermera et vous devrez tout recommencer. Vraiment inconfortable, non ? Ce qui est encore plus déprimant, c'est que si votre vitesse Internet est très lente, peu importe le nombre de fois que vous réessayez, vous ne pourrez jamais télécharger avec succès.

En PHP, on peut essayer d'utiliser la fonction de reprise du protocole tus pour résoudre ce problème.

Qu'est-ce que tus ?

Tus est un protocole ouvert basé sur HTTP pour le transfert de reprise de point d'arrêt de fichier. Reprendre le téléchargement signifie que, qu'il soit interrompu par l'utilisateur ou de manière inattendue en raison du réseau ou pour d'autres raisons, le téléchargement peut être repris là où il a été interrompu sans recommencer.

Le protocole Tus a été adopté par Vimeo en mai 2017.

Pourquoi utiliser tus ?

Citation du blog de Vimeo :

La raison pour laquelle nous avons décidé d'utiliser tus est parce qu'il peut être utilisé de manière concise et formulaire ouvert. Standardisez le processus de téléchargement de fichiers. Cette standardisation aide les développeurs d'API à se concentrer davantage sur la logique de l'application elle-même plutôt que sur le processus de téléchargement de fichiers.

Un autre avantage du téléchargement de cette manière est que vous pouvez commencer à télécharger des fichiers sur votre ordinateur portable, puis passer à votre téléphone ou autre appareil pour continuer à télécharger le même fichier, ce qui peut grandement améliorer l'expérience utilisateur.

Utilisez le protocole TUS en PHP pour implémenter le téléchargement de reprise de point darrêt de fichiers volumineux

Image : Votre workflow approximatif

Démarrer

La première étape consiste à charger les dépendances.

$ composer require ankitpokhrel/tus-php

tus-php est un framework PHP pur pour le protocole tus CV v1.0.0, qui réalise parfaitement l'interaction entre le serveur et le client.

Mise à jour : la v3 de la bibliothèque PHP officielle de Vimeo utilise désormais TusPHP.

Créez un serveur qui gère les requêtes

Vous pouvez créer un serveur comme ci-dessous.

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

Vous devez configurer votre serveur pour qu'il puisse répondre vers un terminal spécifique. Si vous utilisez Nginx, vous pouvez le configurer comme suit :

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

Supposons que l'URL de notre serveur soit http://server.tus.local. Par conséquent, sur la base de notre configuration Nginx ci-dessus, nous pouvons transmettre http. :// server.tus.local/files. Pour accéder à notre terminal tus.

Configuration du point de terminaison de style RESTful :

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

Affichez les Détails du protocole pour obtenir plus d'informations sur informations de routage.

Si vous utilisez un framework similaire à Laravel, vous n'avez pas besoin de les définir dans le fichier de configuration. Vous pouvez définir directement des routes pour accéder aux points de terminaison de base de tus. Nous présenterons les détails pertinents dans un autre tutoriel.

Utilisez le client tus-php pour gérer les téléchargements

Avec le serveur en place, les clients peuvent télécharger des fichiers en morceaux. Commençons par créer un formulaire HTML simple pour obtenir les commentaires de l'utilisateur.

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

Après avoir soumis le formulaire, nous devons suivre quelques étapes pour traiter le téléchargement.

Créez un objet client tus-php

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

Le premier paramètre dans le code ci-dessus est l'adresse de votre serveur tus.

2. Initialisez le client à l'aide des métadonnées du fichier

Afin de garantir l'unicité des fichiers téléchargés, nous devons identifier de manière unique chaque fichier téléchargé. De cette manière, lorsque le fichier est interrompu puis transmis, le serveur peut clairement identifier quels fragments appartiennent au même fichier. Ce code d'identification peut être spécifié par vous-même ou généré par le système.

// 设置标识码和文件元数据
$client->setKey($uploadKey)
    ->file($_FILES[&#39;tus_file&#39;][&#39;tmp_name&#39;], &#39;your file name&#39;);

Si vous ne souhaitez pas spécifier le code d'identification, vous pouvez l'écrire comme ceci, et le système le générera automatiquement :

$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);

Quand Lorsque vous souhaitez reprendre la transmission du bloc suivant, vous pouvez apporter le même paramètre de code d'identification pour reprendre la transmission.

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

Une fois tous les fichiers téléchargés, par défaut, le serveur utilisera sha256 pour vérifier la somme des fichiers afin de garantir qu'aucun fichier n'est perdu.

Utilisez le client tus-js-client pour gérer les téléchargements de fichiers

L'équipe du protocole tus a également développé un plug-in modulaire de téléchargement de fichiers Uppy. Ce plugin peut établir une connexion entre les serveurs officiels tus-js-client et tus-php. En d’autres termes, nous pouvons utiliser php et js pour télécharger des fichiers.

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 文件夹里,有三个不同的例子供你参考。如果任何问题或者建议,欢迎留言交流。

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer