返回

PHP中的TUS协议:可恢复文件上传的新途径

见解分享

在PHP的世界中,处理文件上传是一个常见的任务。然而,当涉及到大文件上传时,事情可能会变得复杂,特别是当上传过程因网络中断或服务器错误而中断时。传统的解决方案涉及到重新上传整个文件,这既耗时又令人沮丧。

为了解决这一痛点,TUS(The Upload Service)协议应运而生。TUS是一个开放标准,它允许可恢复的文件上传,即使在中断的情况下也是如此。通过使用TUS,您可以从中断的地方继续上传,而无需从头开始。

在本文中,我们将深入探讨如何在PHP中使用TUS协议实现可恢复文件上传。我们将介绍TUS协议的基础知识,并逐步指导您完成实现它的过程。

TUS协议概述

TUS协议的工作原理是将文件分解成较小的块,并逐个上传这些块。每个块都有一个唯一的标识符,服务器会跟踪已上传的块。如果上传过程中断,客户端可以简单地从中断的地方继续上传,而无需重新上传整个文件。

TUS协议定义了几个关键概念:

  • 上传会话: 一个包含有关文件上传状态和元数据的容器。
  • 块: 文件被分解成的较小部分。
  • 块标识符: 每个块的唯一标识符。
  • 偏移量: 块在文件中的起始位置。

在PHP中使用TUS

在PHP中实现TUS协议需要以下步骤:

1. 安装TUS库

首先,您需要安装PHP的TUS库。您可以使用Composer通过运行以下命令来做到这一点:

composer require league/tus-server-middleware

2. 创建上传会话

上传过程从创建上传会话开始。您可以使用Tus\Server\TusServer类来创建会话:

use League\Tus\Server\TusServer;

$tusServer = new TusServer();
$sessionId = $tusServer->create();

3. 上传块

一旦创建了上传会话,您就可以开始逐个上传块。您可以使用Tus\Client\TusClient类来做到这一点:

use League\Tus\Client\TusClient;

$tusClient = new TusClient('http://example.com/api/tus');
$tusClient->upload($sessionId, 'path/to/file.txt', [
    'onProgress' => function ($progress) {
        // 监视上传进度
    },
]);

4. 完成上传

当所有块都上传后,您需要完成上传。您可以使用Tus\Server\TusServer类的complete()方法来做到这一点:

$tusServer->complete($sessionId);

实际案例:使用Laravel

在Laravel中使用TUS协议非常简单。您可以使用Intervention的tus-sdk包:

composer require intervention/tus-sdk

config/filesystems.php中添加以下配置:

'disks' => [
    'tus' => [
        'driver' => 'tus',
        'base_uri' => 'http://example.com/api/tus',
    ],
],

然后,您就可以使用Laravel的文件系统API轻松上传文件:

$file = $request->file('file');
$path = $file->store('path/to/file.txt', 'tus');

结论

TUS协议为PHP中的大文件上传提供了优雅且高效的解决方案。通过可恢复上传的能力,您可以避免因中断而导致的重新上传,从而简化了文件上传过程。本文提供了有关如何在PHP中使用TUS协议的分步指南,并讨论了实际案例,以帮助您立即开始。