Maison  >  Article  >  développement back-end  >  Comment utiliser le protocole TUS en PHP pour obtenir un point d'arrêt de reprise du téléchargement de fichiers volumineux

Comment utiliser le protocole TUS en PHP pour obtenir un point d'arrêt de reprise du téléchargement de fichiers volumineux

coldplay.xixi
coldplay.xixiavant
2020-09-01 17:53:252647parcourir

Comment utiliser le protocole TUS en PHP pour obtenir un point d'arrêt de reprise du téléchargement de fichiers volumineux

[Recommandations d'apprentissage associées : Tutoriel graphique php]

Avez-vous déjà été gêné par le téléchargement de 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 est encore 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. C'est vraiment inconfortable, n'est-ce pas ? 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 pour le transfert de reprise de point d'arrêt de fichiers basé sur HTTP. 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. .

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éer un serveur qui gère les requêtes

Vous pouvez créer un serveur comme suit.

// 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 gérer des requêtes spécifiques. Le terminal répond. 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 Donc basé. sur notre configuration Nginx ci-dessus, nous pouvons accéder à notre terminal tus via http://server.tus.local/files.

Configuration du point de terminaison basée sur le style RESTful :

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

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

# 创建\
POST /files

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

# 删除\
DELETE /files/{upload-key}
<.> Consultez les détails de l'accord pour plus d'informations sur le 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. Créons d'abord 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.

  1. Créez un objet client tus-php
  2. // Tus client
    
    $client = new \TusPhp\Tus\Client('http://server.tus.local');
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 le caractère unique 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['tus_file']['tmp_name'], 'your file name');
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['tus_file']['tmp_name'], 'your file name');

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

Télécharger les fichiers en plusieurs parties.

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

pour vérifier la somme des fichiers afin de s'assurer qu'aucun fichier n'est perdu. 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编程(视频)

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