[精选] 大文件断点续传,怎么搞

本文介绍了如何使用tus协议解决大文件上传的问题,通过PHP的tus-php库创建服务端,利用tus-js-client或Uppy进行客户端上传,支持断点续传和分块上传,提高用户体验。
 

在现代网站应用中,上传文件是非常常见的。在任何语言中,通过使用一些工具,都可以实现文件上传的功能。但是,如果处理大文件上传的需求,还是有点麻烦的。

假如你此时正在上传一个很大的文件,大约一个小时过去了,进度是 90%。突然断网了或者浏览器崩溃了,上传的程序退出,你要再全部重新来过。真的很不爽,对不对?还有更让人郁闷的是,如果你的网速很慢,那么,无论你重来多少次,你都不可能上传成功。

在 PHP 中,我们可以尝试利用 tus 协议的断点续传功能来解决这个问题。

什么是 tus?

Tus 是一个基于 HTTP 的 文件断点续传开放协议。断点续传的意思是不管是用户自行中断,还是由于网络等原因的意外中断,都可以从中断的地方继续上传,而不用重新开始。

Tus 协议是在 2017 年5月被 Vimeo 采用的。

为什么用 tus?

引用 Vimeo 的博客:

我们之所以决定用 tus,是因为它能以简洁开放的形式,将文件上传的过程标准化。这种标准化有利于 API 的开发者更加专注于应用本身的逻辑,而非文件上传的过程。

使用这种方式上传的另一个好处是,你可以在笔记本上开始上传文件,然后又转到手机或者其他设备继续上传同一个文件,这可以极大地提升用户体验。

你提到的“断点下载发”是指 **断点续传下载(Resume Download)**,它是一种在网络连接中断后可以从中断位置继下载的技术,而不是从头开始重新下载。 --- ## ✅ 为什么需要断点续传? | 场景 | 说明 | |------|------| | 网络不稳定 | 下载大文件(如 `train2014.zip`)时容易断线 | | 节省时间 | 避免每次断线后重新开始下载 | | 节省带宽 | 对于有限流量的用户很重要 | --- ## ✅ Python 实现断点续传下载(使用 `requests`) 下面是一个完整的 Python 函数,它支持断点续传下载: ```python import os import requests def download_file_resume(url, filename, chunk_size=1024 * 1024): """ 支持断点续传的下载函数 :param url: 文件 URL :param filename: 本地保存路径 :param chunk_size: 每次写入文件的块大小(默认 1MB) """ headers = {} if os.path.exists(filename): # 获取已下载的文件大小 downloaded_size = os.path.getsize(filename) print(f"⏳ 检测到已下载 {downloaded_size / (1024 * 1024):.2f} MB") headers['Range'] = f'bytes={downloaded_size}-' else: downloaded_size = 0 # 发起请求并获取文件总大小 response = requests.get(url, stream=True, headers=headers) total_size = int(response.headers.get('content-length', 0)) + downloaded_size mode = 'ab' if downloaded_size > 0 else 'wb' with open(filename, mode) as f: print(f"📥 开始下载(从 {downloaded_size / (1024 * 1024):.2f} MB 开始)...") for chunk in response.iter_content(chunk_size=chunk_size): if chunk: f.write(chunk) downloaded_size += len(chunk) print(f"📊 已下载: {downloaded_size / (1024 * 1024):.2f} MB / {total_size / (1024 * 1024):.2f} MB", end='\r') print("\n✅ 下载完成!") ``` ### ✅ 使用方式: ```python url = 'http://images.cocodataset.org/zips/train2014.zip' filename = 'train2014.zip' download_file_resume(url, filename) ``` --- ## ✅ 示例:使用断点下载 COCO 数据集 你可以将上面的函数集成到你的 `coco_download_and_prepare` 中,替换原有的 `download_file` 函数。 --- ## ✅ 注意事项 | 事项 | 说明 | |------|------| | 服务器是否支持 Range 请求 | 有些服务器不支持断点续传(如某些 GitHub 链接),此时无法使用 | | 文件名不能变 | 如果你改变了文件名,就无法 | | 适用于大文件 | 对于 `captions.zip`(200MB)意义不大,但对 `train2014.zip`(13GB)非常有用 | --- ##
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值