你是否曾经为大文件上传而苦恼?如果文件上传的过程中,因为某种原因中断了,是否可以从中断的位置继续上传,而不用重新上传整个文件?如果你有这样的困惑,那么请继续阅读下面的内容。
在现代网站应用中,上传文件是非常常见的。在任何语言中,通过使用一些工具,都可以实现文件上传的功能。但是,如果处理大文件上传的需求,还是有点麻烦的。
假如你此时正在上传一个很大的文件,大约一个小时过去了,进度是 90%。突然断网了或者浏览器崩溃了,上传的程序退出,你要再全部重新来过。真的很不爽,对不对?还有更让人郁闷的是,如果你的网速很慢,那么,无论你重来多少次,你都不可能上传成功。
在 PHP 中,我们可以尝试利用 tus 协议的断点续传功能来解决这个问题。
什么是 tus?
Tus 是一个基于 HTTP 的 文件断点续传开放协议。 断点续传的意思是不管是用户自行中断,还是由于网络等原因的意外中断,都可以从中断的地方继续上传,而不用重新开始。
Tus 协议是在 2017 年5月被 Vimeo 采用的。
为什么用 tus?
引用 Vimeo 的博客:
我们之所以决定用 tus,是因为它能以简洁开放的形式,将文件上传的过程标准化。这种标准化有利于 API 的开发者更加专注于应用本身的逻辑,而非文件上传的过程。
使用这种方式上传的另一个好处是,你可以在笔记本上开始上传文件,然后又转到手机或者其他设备继续上传同一个文件,这可以极大地提升用户体验。
图片: Tus 大致的工作流程
开始
第一步,加载依赖。
$ composer require ankitpokhrel/tus-php
tus-php 是用于 tus 断点续传协议 v1.0.0 的一个的纯 PHP 框架,完美实现了 服务端与客户端的交互 。
更新: 现在 Vimeo 官方 PHP 库 的 v3 用的是 TusPHP。
创建一个处理请求的服务端
你可以像下面这样创建一个服务端.
// server.php$server = new \TusPhp\Tus\Server('redis');$response = $server->serve();$response->send();exit(0); // 退出当前 PHP 进程
你需要配置你的服务器以便能对特定的终端进行响应。如果使用 Nginx 的话你可以像下面这样配置:
# nginx.conflocation /files { <strong style="color:transparent">本文来源gaodai#ma#com搞@@代~&码*网/</strong><strong>搞gaodaima代码</strong> try_files $uri $uri/ /path/to/server.php?$query_string;}
假设我们服务端的 URL 是 http://server.tus.local. 因此,基于我们上面的 Nginx 配置,我们可以通过 http://server.tus.local/files. 来访问到我们的 tus 终端.
基于 RESTful 风格的端点配置:
# 获取有关服务器目前配置的信息\OPTIONS /files# 检查上传的文件是否合法\HEAD /files/{upload-key}# 创建\POST /files# 修改\PATCH /files/{upload-key}# 删除\DELETE /files/{upload-key}
查看 协议细则 获取更多关于路由的信息。
如果你是用类似于 Laravel 的框架,那么你就不需要在配置文件里定义这些了, 可以直接定义路由来访问 tus 的基础端点。我们会在另外的教程里介绍相关细节。