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=1;
        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; //文件大小
             filename=file.name
          
              
            // let arr = ['application/zip', 'application/x-zip-compressed'];
             // let index = arr.indexOf(file.type);
              if (filename.indexOf('.zip')==-1) {
                alert('您当前的上传类型不对,请上传zip格式');
                 return false;
              }
            //  if (file.type!='application/zip') {
            //      alert('您当前的上传类型不对,请上传zip格式');
            //      return false;
            //  } else if (file.type!='application/x-zip-compressed') {
            //     alert('您当前的上传类型不对,请上传zip格式');
            //      return false;
            //  }
           
             blockSize = 1024 * 1024 * 10;//块大小
             if (sizes<blockSize) {
                var blockCount = 0;
             } else {
                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 (blockCount==0) {
                                blockCount=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='/ps/project/projectAttachZip?act=do&format=json' method='post' ></form>");
                                 //zipdata.append('proj_id', $("#proj_id").val());//文件名
                                 //zipdata.append('ptype', $("#ptype").val());//文件名
                                 //zipdata.append('file_path', res.Path);//文件名
                                
                                 {literal}
                                 $('#ajaxupload').ajaxSubmit({
                                     url: '/ps/project/projectAttachZip?act=do&format=json',
                                     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>');

                                     },

                                 });
                                 {/literal}

                             }
                            
                             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());
            }
         }
        }
      
posted @ 2019-09-17 08:41  尘梦  阅读(417)  评论(0编辑  收藏  举报