问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

关于PHP断点续传的问题

发布网友 发布时间:2022-04-06 03:19

我来回答

3个回答

懂视网 时间:2022-04-06 07:40

【相关学习推荐:php图文教程】

你是否曾经为大文件上传而苦恼?如果文件上传的过程中,因为某种原因中断了,是否可以从中断的位置继续上传,而不用重新上传整个文件?如果你有这样的困惑,那么请继续阅读下面的内容。

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

假如你此时正在上传一个很大的文件,大约一个小时过去了,进度是 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 TusPhpTusServer('redis');
$response = $server->serve();

$response->send();

exit(0); // 退出当前 PHP 进程

你需要配置你的服务器以便能对特定的终端进行响应. 如果使用 Nginx 的话你可以像下面这样配置:

# nginx.conf

location /files {
 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 的基础端点。我们会在另外的教程里介绍相关细节。

使用 tus-php 客户端处理上传

服务器到位后,客户端可以块的形式上传文件。 让我们首先创建一个简单的HTML表单来获取用户的输入。

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

提交表单后,我们需要按照几个步骤来处理上传。

  1. 创建一个 tus-php 客户端对象
// Tus client

$client = new TusPhpTusClient('http://server.tus.local');

上面代码中的第一个参数是你的tus服务器地址。

2. 使用文件元数据初始化客户端

为了确保上传文件的唯一性,我们需要给每个上传的文件以唯一标识。这样在文件中断后续传的时候,服务器就可以很清晰地辨识出,哪几个片段是属于同一个文件得。这个标识码可以自己指定,也可以由系统生成。

// 设置标识码和文件元数据

$client->setKey($uploadKey)
 ->file($_FILES['tus_file']['tmp_name'], 'your file name');

如果不想指定标识码,可以这样写,由系统会自动生成:

$client->file($_FILES['tus_file']['tmp_name'], 'your file name');

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

3. 分块上传文件

// $chunkSize 是以字节为单位的,例如 5000000 等于 5 MB

$bytesUploaded = $client->upload($chunkSize);

当你想要续传下一块的时候,就可以带上同样的标识码参数来续传。

// 在下一个请求中续传文件

$bytesUploaded = $client->setKey($uploadKey)->upload($chunkSize);

文件全部上传完成后,默认情况下,服务器会使用 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编程(视频)

热心网友 时间:2022-04-06 04:48

软件简介什么是 BitComet(比特彗星) BitComet(比特彗星)是一个完全免费的BitTorrent(BT)下载管理软件,也称BT下载客户端,同时也是一个集BT/HTTP/FTP为一体的下载管理器。BitComet(比特彗星)拥有多项领先的BT下载技术,有边下载边播放的独有技术,也有方便自然的使用界面。最新版又将BT技术应用到了普通的HTTP/FTP下载,可以通过BT技术加速您的普通下载。 BitComet(比特彗星) 的特点 * BT下载 - 高速而且功能强大 o 从P2SP下载: 创新的跨协议下载,BT任务可以从P2SP的种子下载,从而提高下载速度.(0.86新功能) o 种子市场: 用户可以共享任务列表,也可以浏览下载其他人共享的任务.(0.86新功能) o 边下载边播放: 在下载 MP3, rmvb, wmv等视频文件过程中可以边下载边播放. o 智能连接优化: 自动根据您的网络连接优化下载. o 智能磁盘缓存: 使用内存作下载缓存, 有效减小硬盘读写速度, 延长其使用寿命. o 智能文件扫描: 续传作种均无需再次扫描文件. o 智能磁盘分配: 有效减少磁盘碎片产生。 o 内网互联: 突破网关,自动实现不同内网间的互联传输。 o 支持通过公用DHT网络,实现无TrackerTorrent文件下载。(详细信息) o 自动防火墙配置,全自动配置XP网络连接防火墙(ICF)和网络连接共享(ICS)。 o 自动配置路由器端口映射,采用UPnP技术实现内网免配置(要求路由器支持UPnP,操作系统XP)。 o 兼容Windows XP SP2的TCP/IP*,并对tcpip.sys补丁有调整选项。 o 支持多Tracker协议,UTF-8扩展,UDP Tracker v2协议。 * HTTP/FTP下载 - 创新的P2P技术 o 边下载边播放: 在下载 MP3, rmvb, wmv等视频文件过程中可以边下载边播放. o 断点续传: 安全可靠的断点续传技术,保证下载文件的完整性。 o 多线程下载: 文件被分成多点同时从服务器下载,提高下载速度。 o 多镜像下载: 自动寻找文件镜像,同时从多个服务器下载,提高下载速度。 o P2P下载: 将BT的P2P技术与HTTP/FTP融合,自动寻找其他下载用户进行P2P下载,即不增加服务器负担,又能提高下载速度。 o 多语言支持: 能正确处理多语言操作系统多语言网页,多语言路径编码过的网址。 * 任务管理 o 可以*全局和单任务的上传下载速度 o 时段限速 o 用户可自定义分类 * 方便易用而且免费! o 完全免费并且不包含任何间谍软件或第三方软件(用户可选的Google工具条除外) o 使用非常容易简单,我们尽力使所有复杂的技术细节自动优化,而不劳烦用户来研究

热心网友 时间:2022-04-06 06:06

这个改以下php.ini的配置就可以了
file_uploads = On ;打开文件上传选项
upload_max_filesize = 2m
改为
upload_max_filesize = 8m (500M ;上传文件上限)

如果要上传比较大的文件,仅仅以上两条还不够,必须把服务器缓存上限调大,把脚本最大执行时间变长
post_max_size = 500M ;post上限
max_execution_time = 1800 ; Maximum execution time of each script, in seconds脚本最大执行时间
max_input_time = 1800 ; Maximum amount of time each script may spend parsing request data
memory_limit = 128M ; Maximum amount of memory a script may consume (128MB)内存上限追问我是万网的虚拟主机, 不能更改php.ini 并且.hatccess的 upload_max_filesize啥的都被禁止了。

追答那这个就不是太清楚了

声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
在公交车上实施扒窃,会受到怎样的处罚? 交通违法行为识别 公交车扒窃会如何处罚? 郑州鱼缸清洗找哪家公司做得比较好? 郑州有没有专业维修鱼缸,清洗鱼缸的? ...的鱼缸,放在办公室养些鱼水草之类的。郑州哪里有卖这样的鱼缸。_百... 我们公司想要定做个观赏鱼缸,不知道郑州哪家公司最专业? 谁知道郑州生态鱼缸定做哪家做的效果最好? 联想电脑启用无线功能的功能键? 笔记本电脑怎么连接网笔记本电脑怎样连接无线网 PHP 大文件上传,支持断点续传,求具体方案、源码或者文件上传插件 求php 以上超大文件上传和断点续传服务器的实现 python 解析json文件 使用configparser么 怎样用python解析json 如何在python代码中引用json格式 cjson python 怎么用 python中的json序列化,用处在什么地方 php正则如何匹配替换这样的代码? PHP 有没有办法按条件替换[]里的文字? 请教PHP正则表达式大神,如何从文本中取出所有符合同样条件的字符串? php替换符合条件的字符,最好用正则表达式,其它方法也可以。 请问用PHP怎么在文件中替换字符串 php替换指定位置字符 电脑开机显示status:0xc000000e如何解决 电脑开机蓝屏出现0×000000ED怎么办??? 电脑开机蓝屏错误代码0x000000ED steam平台的交易期限怎么看,就是用新设备登陆后哪天可以交易,有地方可以查吗? steam平台的交易期限怎么看? 求解,steam新号可以交易吗 steam怎么查看自己的账号是否可以交易? 在PHP中如何实现大文件上传功能(最大可到2G) php可以用ftp扩展做文件的断点续传么 php的curl如何使用head协议来获取资源的大小等信息 thinkphp 上传大文件时如果网络慢的时候就只能上传部分数据,是否是超时引起?又要如何设置!谢谢 php超大下载类 怎么使用 php中在循环外部如何强制结束循环? openstack的HA应该怎么做 用essamp配置php环境,第一次mysql可以启动,为什么第二次就不能启动了呢。急,谢谢 关于在php中使用mysql的自定义函数的问题 php对于mysql数据库的操作 php中用mysql调用数据并显示出来 怎么使用php代码建立mysql数据库 PHP访问MySQL数据库的步骤。 实现功能:MySQL+php实现新闻列表以及浏览功能,简单就可以,谢谢了!!! 如何在PHP中调用MYSQL数据并将其显示在页面中? PHP+MySql要如何做才能上传图片后在数据库中显示图片路径,要能用的! php文件上传的时候如何把jpeg变成jpg。 php 插入图片 路径显示没有后缀。jpg 怎么才能显示 求给我修改下 谢谢各路大神 怎么样把图片的后缀名改成.JPG? PHP图片怎么转换为JPEG格式的啊