php 断点续传以及100% 后台zip解压

mac2022-06-30  22

前台部分

<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_url}ps/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()); } } }

转载于:https://www.cnblogs.com/mengluo/p/11531440.html

最新回复(0)