注册 | 登录
欢迎注册会员

当前位置:首页 > 狗万 怎么玩 > PHP技术 > 正文

PHP大文件分割上传(分片上传)

来源:程序人生 【 】 浏览:669 添加日期:2017-11-17 15:38:59 我要评论(0)

服务端为什么不能直接传大文件?跟php.ini里面的几个配置有关


upload_max_filesize?=?2M?//PHP最大能接受的文件大小
post_max_size?=?8M?//PHP能收到的最大POST值'
memory_limit?=?128M?//内存上限
max_execution_time?=?30?//最大执行时间

当然不能简单粗暴的把上面几个值调大,否则服务器内存资源吃光是迟早的问题。


解决思路

好在HTML5开放了新的FILE API,也可以直接操作二进制对象,我们可以直接在浏览器端实现文件切割,按照以前的做法就得用Flash的方案,实现起来会麻烦很多。


JS思路

1.监听上传按钮的onchange事件

2.获取文件的FILE对象

3.把文件的FILE对象进行切割,并且附加到FORMDATA对象中

4.把FORMDATA对象通过AJAX发送到服务器

5.重复3、4步骤,直到文件发送完。


PHP思路

1.建立上传文件夹

2.把文件从上传临时目录移动到上传文件夹

3.所有的文件块上传完成后,进行文件合成

4.删除文件夹

5.返回上传后的文件路径


DEMO代码


前端部分代码




????
????
????
????Document
????



????
???? ????

PHP部分代码


tmpPath?=??$tmpPath;
????????$this->blobNum?=??$blobNum;
????????$this->totalBlobNum?=??$totalBlobNum;
????????$this->fileName?=??$fileName;
????????
????????$this->moveFile();
????????$this->fileMerge();
????}
????
????//判断是否是最后一块,如果是则进行文件合成并且删除文件块
????private?function?fileMerge(){
????????if($this->blobNum?==?$this->totalBlobNum){
????????????$blob?=?'';
????????????for($i=1;?$i<=?$this->totalBlobNum;?$i++){
????????????????$blob?.=?file_get_contents($this->filepath.'/'.?$this->fileName.'__'.$i);
????????????}
????????????file_put_contents($this->filepath.'/'.?$this->fileName,$blob);
???????????$this->deleteFileBlob();
????????}
????}
????
???//删除文件块
????private?function?deleteFileBlob(){
????????for($i=1;?$i<=?$this->totalBlobNum;?$i++){
????????????@unlink($this->filepath.'/'.?$this->fileName.'__'.$i);
????????}
????}
????
????//移动文件
????private?function?moveFile(){
????????$this->touchDir();
????????$filename?=?$this->filepath.'/'.?$this->fileName.'__'.$this->blobNum;
????????move_uploaded_file($this->tmpPath,$filename);
????}
????
????//API返回数据
????public?function?apiReturn(){
????????if($this->blobNum?==?$this->totalBlobNum){
????????????????if(file_exists($this->filepath.'/'.?$this->fileName)){
????????????????????$data['code']?=?2;
????????????????????$data['msg']?=?'success';
????????????????????$data['file_path']?=?'http://'.$_SERVER['HTTP_HOST'].dirname($_SERVER['DOCUMENT_URI']).str_replace('.','',$this->filepath).'/'.?$this->fileName;
????????????????}
????????}else{
????????????????if(file_exists($this->filepath.'/'.?$this->fileName.'__'.$this->blobNum)){
????????????????????$data['code']?=?1;
????????????????????$data['msg']?=?'waiting?for?all';
????????????????????$data['file_path']?=?'';
????????????????}
????????}
????????header('Content-type:?application/json');
????????echo?json_encode($data);
????}
????
????//建立上传文件夹
????private?function?touchDir(){
????????if(!file_exists($this->filepath)){
????????????return?mkdir($this->filepath);
????????}
????}
}
//实例化并获取系统变量传参
$upload?=?new?Upload($_FILES['file']['tmp_name'],$_POST['blob_num'],$_POST['total_blob_num'],$_POST['file_name']);
//调用方法,返回结果
$upload->apiReturn();
?>



你浏览的文章是 - 《PHP大文件分割上传(分片上传)》!
文章出处:https://www.procedurelife.com/content/akkjhj.html
PHP 文件 上传 对象 文件夹 停止 切割 代码 返回 进行 目录 直接 删除 思路 服务器 移动 合成 方法 实现 部分 建立
66.67% (2)
33.33% (1)
评论0
头像 游客
1 2