php 断点续传以及100% 后台zip解压
Posted mengluo
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了php 断点续传以及100% 后台zip解压相关的知识,希望对你有一定的参考价值。
前台部分
<div class="col-md-12">
<div class="form-group">
<label class="control-label col-sm-2">申请人材料zip包</label>
<div class="input-box col-sm-6">
<input class="btn btn-default" type="file" name="zipupload" id='zipupload' >
<input type="hidden" id="file_zip_path" value=''/>
<span>
foreach from=$upfiles[2] item=item
<span>
<a href="$item.dir" target="_blank">$item.file_name</a>
<a href="javascript:void(0);" class="btn btn-default btn-sm" title="删除"<i class="glyphicon glyphicon-trash"></i></a>
</span>
/foreach
</span>
<span class="text-danger">上传的文件类型只支持zip格式</span>
</div>
<div class="zipparse" id="zipparse"></div>
<div class="input-prompt col-sm-4 zipupload_error" for="research_field">
<div class="progress progress-striped">
<div id="filebar" class="progress-bar progress-bar-success" role="progressbar"
aria-valuenow="0" aria-valuemin="0" aria-valuemax="100"
style="width: 0%;">
0%
</div>
</div>
zip格式
</div>
</div>
</div>
<input type="hidden" name="url_class" id="url_class" value="ps/project">
<input type="hidden" name="url_func" id="url_func" value="modify">
<input type="hidden" name="proj_id" id="proj_id" value="$proj_id">
<input type="hidden" name="ptype" id="ptype" value="$ptype">
js部分
<script type="text/javascript">
var index=0;
var uploadId="";
$(function()
//onchange="getImg(this, '$base_urlps/project/projectAttachZip',4,$proj_id,$ptype)"
var zipfiles=$("#zipupload");
zipfiles.change(function()
var files = this.files; //获取上传文件的对象
var file = files[0];
sizes = file.size; //文件大小
if (file.type!='application/zip')
alert('您当前的上传类型不对,请上传zip格式');
return false;
blockSize = 1024 * 1024 * 2;//块大小
var blockCount = Math.ceil(sizes / blockSize);//总块数
//创建FormData对象
var formData = new FormData();
formData.append('fileName', file.name);//文件名
formData.append('total', blockCount);//总块数
formData.append('index', index);//当前上传的块下标
formData.append('uploadId', uploadId);//块文件名
formData.append('data', null);
UploadFile(file, formData, sizes, blockCount, blockSize);
);
);
function UploadFile(file, formData, sizes, blockCount, blockSize)
var start=index*blockSize;
var end = Math.min(sizes, start + blockSize);//获取结束块的大小
if (sizes<blockSize)
var block = file.slice(0, sizes); //分割块
else
var block = file.slice(start, end); //分割块
formData.set('proj_id', $('#proj_id').val()); //评审id
formData.set('ptype', $('#ptype').val());//评审类型
formData.set('data', block); //块
formData.set('index', index); //当前块
formData.set('uploadId', uploadId); //块id
$.ajax(
url: '/ps/project/ziptests',
type: 'post',
data: formData,
processData: false, //数据转换为对象
contentType: false, //数据类型
dataType:'json',
success: function (res)
block = null;
if (res.Code === 1)
if (index === 1)
uploadId = res.UploadID;
$('#filebar').css('width',(index / blockCount * 100).toFixed(2) + '%');
$('#filebar').text((index / blockCount * 100).toFixed(2) + '%');
//上传完毕后开始解析文件内容
if ((index / blockCount * 100).toFixed(2)==100)
$("#file_zip_path").val(res.Path);
$("#zipparse").wrap("<form id='ajaxupload' action='#' method='post' ></form>");
literal
$('#ajaxupload').ajaxSubmit(
url: '#',
dataType: "json", //返回结果格式
type: 'post',
data: file_path:$("#file_zip_path").val(),proj_id:$("#proj_id").val(),ptype:$("#ptype").val(), //请求数据
success: function (json)
$('.zipupload_error').html('<img src="/app/static/smartadmin/1.9.1/img/select2-spinner.gif" style="width: 50px"><span style="color: red">解析中......</span>');
$.smallBox(
title : json.message,
content : "<i class='fa fa-clock-o'></i> 解析成功",
color : "#739e73",
iconSmall: "fa fa-times fadeInRight",
timeout : 4000
);
$('.zipupload_error').html('<span>'+json.message+'</span>');
,
);
if (index < blockCount)
index++;
UploadFile(file, formData, sizes, blockCount, blockSize);
);
</script>
后台部分
//header('Content-type: application/json');
$post=$this->input->post();
$UploadID='';
//首次上传
if ($post['UploadID']=='')
$UploadID=$post['index'];
//文件名称
$blockName = $UploadID.'.block';
//文件上传路径
$dir=APPPATH.'data/zip/'.intval($post['proj_id']).'/';
$dir_path='/data/zip/'.intval($post['proj_id']).'/';
mkDirs($dir);
if (file_exists($dir.$post['fileName']))
unlink($dir.$post['fileName']);
//块文件
$blockpath=$dir.$blockName;
if (file_exists($blockpath))
echo json_encode(["Code"=>1, "Msg" => "文件已经存在~"]);
$data=file_get_contents($_FILES['data']['tmp_name']);
//写块文件
file_put_contents($blockpath,$data);
//合并块文件
if ($post['index']==$post['total'])
$bloacks='';
$ext=pathinfo($post['fileName'],PATHINFO_EXTENSION);
$filename=$dir.date('ymdhis',time()).'.'.$ext;
$filename_path=$dir_path.date('ymdhis',time()).'.'.$ext;
for($i=0;$i<=$post['total'];$i++)
$bloacks.=file_get_contents($dir.$i.'.block');
unlink($dir.$i.'.block');
//echo $dir.md5($i).'_'.$i.'.block';
file_put_contents($filename,$bloacks);
echo json_encode(["Code"=>1, "Msg" => "上传成功~",'Path'=>$filename_path]);
zip解压部分
/**
* 文件编码
*
* @param [type] $fileName
* @return void
*/
function encodesutf8($name)
$encoding = mb_detect_encoding($name,['UTF-8','GBK','BIG5','CP936']); //获取编码 然后转换
if (DIRECTORY_SEPARATOR == '/') //linux widnwos下面是/
$filename = iconv($encoding,'UTF-8',$fileName);
else //win
$filename = iconv($encoding,'GBK',$fileName);
return $filename;
header('content-type:text/html;charset=utf-8');
$proj_id=(int)$this->input->get('proj_id');
$ptype=(int)$this->input->get('ptype');
if($this->input->get('act') == 'do')
// $config['upload_path'] = FCPATH.'data/upload/zip/';
// mkDirs($config['upload_path']);
// $config['allowed_types']= array('zip');
// $config['file_name'] = time().$_FILES['zipupload']['name'];
// $this->load->library('upload',$config);
// if(!$this->upload->do_upload('zipupload'))
// $this->smarty->error('评审意见表文件格式不符合规定');
//
// $data=array(
// 'filename'=>$_FILES['zipupload']['name'],
// 'filepath'=>'/data/upload/zip/'.$this->upload->file_name,
// );
$proj_id=(int)$this->input->post('proj_id');
$ptype=(int)$this->input->post('ptype');
$file_path=$this->input->post('file_path');
$path=APPPATH.'data/upload/upfile/';
$zip = new \ZipArchive;
//$zipfile = APPPATH.'/data/upload/zip/'.$this->upload->file_name;
$zipfile=APPPATH.$file_path;
if (file_exists($zipfile))
$zip->open($zipfile);
$prefix_path="/data/upload/upfile/";
if(!file_exists($path))
mkDirs($path);
$docnum = $zip->numFiles;
$annex=[
'proj_id'=>$proj_id,
'type'=>$ptype,
];
$num_co=0;
for($i = 0; $i < $docnum; $i++)
//获取所有的文件
//$statInfo = $zip->getNameIndex($i);
$statInfos = $zip->statIndex($i,\ZipArchive::FL_ENC_RAW);
$statInfo=$this->transcoding($statInfos['name']);
$exit=array_filter(explode('/',$statInfo));
//第一个是项目名称 第二个是申请名称 第三个是 附件材料
if (count($exit)>=3)
$file_name=$exit[count($exit)-2]; //不用pathinfo是因为中文处理不好
$file_arr=explode('_',$file_name);
//获取是否出现以编号为结尾的文件夹名称
if (empty($per_info))
continue;
copy('zip://'.$zipfile.'#'.$zip->getNameIndex($i), $path.$statInfo);
else
continue;
if (count($bool)==$num_co)
$this->smarty->success(basename($file_path),"#/ps/person/lists?proj_id=".$proj_id."&ptype=".$ptype);
else
$this->smarty->error($this->$oObject->data_error());
以上是关于php 断点续传以及100% 后台zip解压的主要内容,如果未能解决你的问题,请参考以下文章
PHP 大文件上传,支持断点续传,求具体方案、源码或者文件上传插件