首页 > 后端开发 > 正文

php7tp框架大文件上传 PHP中如何使用TUS协议来实现大文件的断点续传

2023-10-06 23:24:26 | 我爱编程网

我爱编程网小编给大家带来了php7tp框架大文件上传 PHP中如何使用TUS协议来实现大文件的断点续传相关文章,一起来看一下吧。

php7tp框架大文件上传 PHP中如何使用TUS协议来实现大文件的断点续传

PHP中如何使用TUS协议来实现大文件的断点续传



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



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

在现代网站应用中,上传文件是非常常见的。在任何语言中,通过使用一些工具,都可以实现文件上传的功能。但是,如果处理大文件上传的需求,还是有点麻烦的。
假如你此时正在上传一个很大的文件,大约一个小时过去了,进度是 90%。突然断网了或者浏览器崩溃了,上传的程序退出,你要再全部重新来过。真的很不爽,对不对?还有更让人郁闷的是,如果你的网速很慢,那么,无论你重来多少次,你都不可能上传成功。
在 PHP 中,我们可以尝试利用 tus 协议的断点续传功能来解决这个问题。
什么是 tus?Tus 是一个基于 HTTP 的 文件断点续传开放协议。 断点续传的意思是不管是用户自行中断,还是由于网络等原因的意外中断,都可以从中断的地方继续上传,而不用重新开始。
Tus 协议是在 2017年5月被 Vimeo 采用的。
为什么用 tus?引用 Vimeo 的博客:
我们之所以决定用 tus,是因为它能以简洁开放的形式,将文件上传的过程标准化。这种标准化有利于 API 的开发者更加专注于应用本身的逻辑,而非文件上传的过程。
使用这种方式上传的另一个好处是,你可以在笔记本上开始上传文件,然后又转到手机或者其他设备继续上传同一个文件,这可以极大地提升用户体验。
图片: Tus 大致的工作流程
开始第一步,加载依赖。
$ composer require ankitpokhrel/tus-phptus-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 是 因此, 基于我们上面的 Nginx 配置,我们可以通过 来访问到我们的 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>提交表单后,我们需要按照几个步骤来处理上传。
创建一个 tus-php 客户端对象// Tus client
$client = new TusPhpTusClient('');上面代码中的第一个参数是你的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 key3. 分块上传文件
// $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: ' // 你的 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编程(视频)

php7tp框架大文件上传 PHP中如何使用TUS协议来实现大文件的断点续传

php上传图片并压缩-thinkphp如何做图片压缩呢?

php压缩图片

比如(什么?)上面有不同大小的图片--------语文表达缺主语,含糊导致无法理解。

服务器上面?客户机上面?具体什么软件环境上面?

“有不同大小的图片”,已经存在的图片通常已经压缩过的,像JPEG更是有损压缩。再次压缩必定再次会降低画质。PHP可以再次处理图片,但画质和存储大小不能兼得,画质好就存储大,要存储小就画质差,根据自己的画质需求处理。

thinkphp如何做图片压缩呢?

在上传图片的时候先看看图片有多大,一般来说导航幻灯片的图片单张大小尽量不超100k,产品图不超过20k,这样加载还慢的话就用ajax后加载方法,可以是滚动加载之类,但是对蜘蛛抓取页面并不是很友好。

至于你说的用tp把图片压缩,那只能是将图片的尺寸改成你想要的尺寸,大小的话是web所用格式大小,等页面加载完你又换原图,这样相当于又加载了一遍,还不如做ajax滚动加载。

PHP网站上传图片自动压缩,怎么编程啊,求指

这里会使用到三个文件:

:连接数据库

test_:执行SQL语句

upload_:上传图片并压缩

三个文件代码如下:

连接数据库:

<?php

$db_host='';

$db_user='';

$db_psw='';

$db_name='';

$db_port='';

$sqlconn=new_ysqli($db_host,$db_user,$db_psw,$db_name);

$q="set_ames_tf8;";

$result=$sqlconn->query($q);

if(mysqli_connect_errno())_

_rintf("Connect_ailed:%s\n",_ysqli_connect_error());

_xit();

}

?>

当然使用一些封装的数据库类也是可以的。

执行SQL语句:test_

<?php

require("");

require("upload_");

$real_img=$uploadfile;

$small_img=$uploadfile_resize;

$insert_sql="insert_nto_mg(real_img,small_img)_alues(?,?)";

$result=$sqlconn->_repare($insert_sql);

$result->_ind_param("ss",$real_img,$small_img);

$result->_xecute();

?>

上传图片并压缩:upload_

<?php

//设置文件保存目录

$uploaddir="upfiles/";

//设置允许上传文件的类型

$type=array("jpg","gif","bmp","jpeg","png");

//获取文件后缀名函数

function_ileext($filename)

{

_eturn_ubstr(strrchr($filename,'.'),1);

}

//生成随机文件名函数

function_andom($length)

{

$hash='CR-';

$chars='ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789abcdefghijklmnopqrstuvwxyz';

$max=_trlen($chars)-1;

_t_srand((double)microtime()*1000000);

_or($i=0;$i<$length;$i++)

_

_$hash.=$chars[mt_rand(0,$max)];

_

_eturn$hash;

}

$a=strtolower(fileext($_FILES['filename']['name']));

//判断文件类型

if(!in_array(strtolower(fileext($_FILES['filename']['name'])),$type))

{

$text=implode(",",$type);

$ret_code=3;//文件类型错误

$page_result=$text;

$retArray=_rray('ret_code'=>$ret_code,'page_result'=>$page_result);

$retJson=_son_encode($retArray);

_cho$retJson;

_eturn;

}

//生成目标文件的文件名

else

{

$filename=explode(".",$_FILES['filename']['name']);

_o

_

_$filename[0]=random(10);//设置随机数长度

_$name=implode(".",$filename);

_//$name1=$name.".Mcncc";

_$uploadfile=$uploaddir.$name;

_

_hile(file_exists($uploadfile));

_f(move_uploaded_file($_FILES['filename']['tmp_name'],$uploadfile))

_

_if(is_uploaded_file($_FILES['filename']['tmp_name']))

_{

_$ret_code=1;//上传失败

_}

_lse

_//上传成功

_$ret_code=0;

_

_

$retArray=_rray('ret_code'=>$ret_code);

$retJson=_son_encode($retArray);

echo$retJson;

}

//压缩图片

$uploaddir_resize="upfiles_resize/";

$uploadfile_resize=$uploaddir_resize.$name;

//$pic_width_max=120;

//$pic_height_max=90;

//以上与下面段注释可以联合使用,可以使图片根据计算出来的比例压缩

$file_type=$_FILES["filename"]['type'];

function_esizeImage($uploadfile,$maxwidth,$maxheight,$name)

{

//取得当前图片大小

$width=_magesx($uploadfile);

$height=_magesy($uploadfile);

$i=0.5;

//生成缩略图的大小

_f(($width>$maxwidth)_|($height>$maxheight))

_

_/*

_$widthratio=$maxwidth/$width;

_$heightratio=$maxheight/$height;

_

_if($widthratio<$heightratio)

_{

_$ratio=$widthratio;

_}

_else

_{

__$ratio=$heightratio;

_}

_

_$newwidth=$width*$ratio;

_$newheight=$height*$ratio;

_*/

_$newwidth=$width*$i;

_$newheight=$height*$i;

_if(function_exists("imagecopyresampled"))

_{

_$uploaddir_resize=_magecreatetruecolor($newwidth,$newheight);

__magecopyresampled($uploaddir_resize,$uploadfile,0,0,0,0,$newwidth,$newheight,$width,$height);

_}

_else

_{

_$uploaddir_resize=_magecreate($newwidth,$newheight);

__magecopyresized($uploaddir_resize,$uploadfile,0,0,0,0,$newwidth,$newheight,$width,$height);

_}

_

_ImageJpeg($uploaddir_resize,$name);

_ImageDestroy($uploaddir_resize);

_

_lse

_

_ImageJpeg($uploadfile,$name);

_

}

if($_FILES["filename"]['size'])

{

_f($file_type=="image/pjpeg"||$file_type=="image/jpg"|$file_type=="image/jpeg")

_

_//$im=_magecreatefromjpeg($_FILES[$upload_input_name]['tmp_name']);

_$im=_magecreatefromjpeg($uploadfile);

_

_lseif($file_type=="image/x-png")

_

_//$im=_magecreatefrompng($_FILES[$upload_input_name]['tmp_name']);

_$im=_magecreatefromjpeg($uploadfile);

_

_lseif($file_type=="image/gif")

_ 我爱编程网

_//$im=_magecreatefromgif($_FILES[$upload_input_name]['tmp_name']);

_$im=_magecreatefromjpeg($uploadfile);

_

_lse//默认jpg

_

_$im=_magecreatefromjpeg($uploadfile);

_

_f($im)

_

_ResizeImage($im,$pic_width_max,$pic_height_max,$uploadfile_resize);

_

_ImageDestroy($im);

_

}

?>

请按照现实情况更改,test_中对应的信息。

望采纳,谢谢。

php7tp框架大文件上传 PHP中如何使用TUS协议来实现大文件的断点续传

thinkPHP3.2.3文件上传类多张图片上传怎么只有第一张图片被上传

可以遍历传过来的FILES数组,然后用循环调用UPLOAD类
public function upload(){
$upload = new \Think\Upload();// 实例化上传类
$upload->maxSize = 2000000 ;// 设置附件上传大小
$upload->exts = array('jpg', 'gif', 'png', 'jpeg');// 设置附件上传类
$upload->rootPath = ''./Uploads/';
$upload->savePath = date('Y').'/'.date('m').'/'.date('d').'/';
$upload->subName = array('date', 'H');
$upload->saveName = md5(uniqid());
$info = $upload->upload();
if(!$info) { // 上传错误提示
$this->error($upload->getError());
}else{ // 上传成功
return $info;
//$this->success('上传成功!');
}

}
//调用
foreach($_FILES["banner_index"]["size"] as $key=>$val){
if($val>0){
$info=$this->upload(); //判断上传文件大小大于0,调用upload
foreach($info as $v){
echo $v["savepath"].$v["savename"]; }
}
}

以上就是我爱编程网小编给大家带来的php7tp框架大文件上传 PHP中如何使用TUS协议来实现大文件的断点续传,希望能对大家有所帮助。
与“php7tp框架大文件上传 PHP中如何使用TUS协议来实现大文件的断点续传”相关推荐
python文本怎么输入输出?python文本输入输出方法
python文本怎么输入输出?python文本输入输出方法

用Python从键盘输入一个有中文和英文的字符串,编程分别输出中文和英文,并统?fromstringimportascii_lettersx=input("输入字符串:")hz=[]zm=[]forxxinx:ifxxin([chr(j)forjinrange(19968,40867)]):hz.append(xx)print(f"汉字:{xx}")eli

2023-12-12 11:48:42
如何使用Python计算两个数字的乘积或平方?
如何使用Python计算两个数字的乘积或平方?

怎样用python编出乘法算式?print('\n'.join([''.join(['%sx%s=%-2s'%(y,x,x*y)foryinrange(1,x+1)])forxinrange(1,10)]))Python写出输入二个数,求这二个数的加、减、乘、除、取余、取整、幂的值并输?当你想要让用户输入两个数字,并计算它们的加法、减法、乘法、除法、取余、取整、幂运算的结果,可以

2023-12-12 13:00:59
python xlwt excel 单元格边框,如何才能有如下的加黑边框
python xlwt excel 单元格边框,如何才能有如下的加黑边框

pythonxlwtexcel单元格边框,如何才能有如下的加黑边框borders = xlwt.Borders()borders.left = 1borders.right = 1borders.top = 1borders.bottom = 1borders.bottom_colour=0x3A    style = xlwt.XFStyle()style.borders = border

2023-12-12 18:09:59
python编程问题? 大学生入门Python看这四个阶段就够了
python编程问题? 大学生入门Python看这四个阶段就够了

python编程问题?可以使用Python的itertools模块来生成所有可能的组合,然后再计算每个组合的和。以下是示例代码:在此代码中,我们首先使用itertools.combinations()函数生成了所有可能的组合,并将它们存储在一个名为combinations的列表中。然后,我们对列表中的每个组合求和,将它们存储在另一个名为sums的列表中。最后,我们通过将sums转换为

2023-12-13 13:15:43
Python中如何添加注释
Python中如何添加注释

Python中如何添加注释任何语言都有注释一说,Python也有注释,如何添加呢?Python添加注释很简单,在文件开头加入一个#即可。如下图所示,因为前面有个#,代码并没有被执行再入下图所示,第二行代码加入了#,所以第一行代码被执行,第三行被执行,第二行没有被执行那么,我们为什么要在代码中添加注释呢?代码中的注释又没有被运行,看起来没有任何意义啊?首先,作为使用者,是

2023-12-14 01:49:51
如何在python IDLE Shell窗口中编写程序计算圆的周长?
如何在python IDLE Shell窗口中编写程序计算圆的周长?

如何在pythonIDLEShell窗口中编写程序计算圆的周长?可以按照以下步骤在PythonIDLEShell窗口中编写计算圆周长的程序:打开PythonIDLEShell窗口。在窗口中输入以下代码:pythonCopycoderadius=float(input("请输入圆的半径:"))circumference=2*3.14159*radiuspr

2023-12-13 02:25:56
如何用python turtle画奥运五环?
如何用python turtle画奥运五环?

如何用pythonturtle画奥运五环?首先画第一环,用虚线画出半径,取该半径的中点,然后从此中点延长虚线,且廷长到的终点是第一环的半径长度。终点便是第二环的圆心,半径为这条延长线。第三环同用此法。下面要说说第二行第一个环,因为上面已有两个环啦,而且两环的半径之间已有一条虚线,那么就在这条虚线做垂直平分线,然后做一个倒的等腰三角形,它的腰是圆的半径,它的顶点是该环的圆心,第五环皆用此法。

2023-12-13 05:43:27
我的世界如何写代码
我的世界如何写代码

我的世界如何写代码以下是按要求改动的代码:编写代码以制作我的世界(Minecraft)模组是一项既有趣又有挑战性的任务。首先,你需要选择一个编程语言来编写Minecraft模组。目前,最常用的语言是Lua,因为Minecraft的开发者也使用它来编写游戏逻辑。如果你熟悉Python,也可以尝试使用Python编写模组,但Lua更为常见。一、获取Minecraft

2023-12-13 17:05:15