最近一个项目中用到在线zip上传并解压入库,找了网上一些资料,根据自身项目结合,代码如下,如果你也需要,请读懂原理后修改成自己的代码。

先来看下相关函数:

2016510102332506.png

1、上传代码示例:

压缩包图片上传(注意“<,>”符号,真实使用,请替换为<和>)
		<input name="file" onchange="upfile({log:'upload',val:this.value,obj:this})" type="file">

2、上传ph预处理代码:

nocache();
$upid=arg('upid','get','txt');
if($_FILES["file"]["error"]>0){
	echo '';
	exit;
	}
$fsize=$_FILES['file']['size']/1024;
if($fsize>(1024*1024*100)){
	echo '';
	exit;
	}
$oldname=pathinfo($_FILES['file']['name'],PATHINFO_BASENAME);
$typename=strtolower(pathinfo($_FILES['file']['name'],PATHINFO_EXTENSION));
if($typename&&!in_array($typename,array('jpg','jpeg','gif','png','zip'))){
	echo '';
	exit;
	}
$path='';
if($typename=='zip'){
	//$filename=pathinfo($_FILES['file']['name'],PATHINFO_BASENAME);
	$path=setup_upfolder.$web['id'].'/'.setup_uptemp;
	if(!function_exists('zip_open')){
		echo '';
		exit;
	}
	$name=iconv("utf-8","utf-8",$_FILES['file']['name']);//中文文件名
	$oldname=$cook['uid'].'_'.date('YmdHis').'_'.randomkeys(6).$oldname;
	move_uploaded_file($_FILES['file']['tmp_name'],$path.$oldname);
	echo '';
}

3、js示例:

var upfile_callback=null;
var upfile_callback_new=null;
function upfile(args){
var log=args.log || "load";
switch(log){	
    case "upload_zip_success"://zip压缩包处理
        PZ.load({log:"close"});
        if(upfile_callback){
            upfile_callback(args.path);
            //upfile_callback=null;
            return;
        };
        if(upfile_callback_new){
            upfile_callback_new(args);
            return;
        }
        break;
    case "upload_zip_error":
        PZ.load({log:"close"});
        PZ.e({ico:"error",msg:args.msg});
        break;
	case "upload_success":
		if(upfile_callback){
			upfile_callback(args.file,args.path);
			//upfile_callback=null;
			return;
			};
		if(upfile_callback_new){
			upfile_callback_new(args);
			return;
			}
		PZ.load({log:"close"});
		var id=args.id || "qyk_upfile";
		var num=$("#"+id).data("num");
		var html="";
		$("#"+id+">.click").before(html);
		if($("#"+id+">img").length>=num){
			$("#"+id+">.click").hide();
			};
	break;
	case "upload_error":
		PZ.load({log:"close"});
		PZ.e({ico:"error",msg:args.msg});
	break;
	case "get":
		var id=args.id || "qyk_upfile";
		var res="";
		$("#"+id+">img").each(function(){
			if(res!="")res+="|";
			var url=$(this).attr("data");
			res+=url
			});
		return res;
	break;
	}
};

4、上传后js处理:

upfile_callback_new=function(args){
var file=args.file;
var oldname=args.oldname;
var types=args.id;
if (types=='zip'){
//    PZ.e({msg:"上传完成,点击“确 定”解压。",btn:[
//        {text:"确 定",close:"ok",css:"out2",callback:function(){
            var path=args.path;
    		var name=args.name;
            var data="types="+types+"&numbers="+numbers+"&filename="+file+"&path="+path+"&name="+name;
            //PZ.e({ico: "error",msg:data});exit;
            PZ.load({log: "open"});
            $.ajax({
                type: "POST",
                url: "/?log=post&desc=unzip_zip_file",
                data:data,
                cache: false,
                dataType: "json",
                success: function (res) {
                    PZ.load({log: "close"});
                    switch (res.status) {
                        case 0:
                            PZ.e({msg:res.data,btn:[
                                {text:"确 定",close:"ok",css:"out2",callback:function(){
                                    PZ.load({log: "open"});
                                    location.href="/?log=member&desc=orders_photo_edit&numbers="+numbers;
                                }}
                            ]});
                            break;
                        default:
                            PZ.e({ico: "error",msg: res.data});
                            break;
                    }
                }
            });
//        }},
//        {text:"取 消",close:"ok"}
//    ]});
};

5、解压及入库处理:

$types=arg('types','post','url');//zip
$numbers=arg('numbers','post','url');//订单号
$filename=arg('filename','post','url');//文件名  file.zip
$path=arg('path','post','url');//文件路径 upload/10001/temp/
$name=arg('name','post','url');//中文文件名  中文文件名.zip

$zipfull=$path.$filename;  //完整文件路径 upload/10001/temp/testest.zip

if(!file_exists($zipfull)){
	ajaxreturn(1,'没有该zip压缩包文件,请重新上传!');
}
if(!function_exists('zip_open')){
	ajaxreturn(1,'不支持zip_open函数,请检查PHP环境是否支持ZZIPlib库');
	exit;
}

$starttime = explode(' ',microtime()); //解压开始的时间
$pass_file='';
$resource=zip_open($zipfull);
if($resource){
	$i = 1;
	$nums=0;
	//遍历读取压缩包里面的一个个文件
	while ($dir_resource = zip_read($resource)) {
		//如果能打开则继续
		if (zip_entry_open($resource,$dir_resource)) {
			//获取当前项目的名称,即压缩包里面当前对应的文件名
			$typename=strtolower(pathinfo(zip_entry_name($dir_resource),PATHINFO_EXTENSION));//后辍
			$file_temp_name = date('dHis').'_'.randomkeys(6).'_{size}.'.$typename;//格式化文件名
			$file_name = $path.$file_temp_name;//新文件路径及文件名称
			$old_filename = $path.zip_entry_name($dir_resource);//原文件路径及文件名称
			//以最后一个“/”分割,再用字符串截取出路径部分
			$file_path = substr($file_name,0,strrpos($file_name, "/"));
			//如果路径不存在,则创建一个目录,true表示可以创建多级目录
			if(!is_dir($file_path)){
				mkdir($file_path,0777,true);
			}
			//如果不是目录,则写入文件
			if(!is_dir($file_name)){
				//读取这个文件
				$file_size = zip_entry_filesize($dir_resource);
				//最大读取6M,如果文件过大,跳过解压,继续下一个【暂定】
				if($file_size<(1024*1024*100)){
					$file_content = zip_entry_read($dir_resource,$file_size);
					file_put_contents($file_name,$file_content);
					//图片入库
					$houzhui = substr(strrchr($old_filename, '.'), 1);
					$title = basename($old_filename,".".$houzhui);
					$cover=getcover($file_temp_name);
					$arr=array(
						'webid'=>$web['id'],
						'user_id'=>$cook['uid'],
						'numbers'=>$numbers,
						'cover'=>$cover,
						'time_add'=>time(),
						'status'=>1,
						'title'=>$title,
						'content'=>''
					);
					db_intoarr('member_orders_photo',$arr);
					$nums++;
				}else{
					$pass_file= $i++." 此文件已被跳过,原因:文件过大, -> ".iconv("gb2312","utf-8",$file_name);
				}
			}
			zip_entry_close($dir_resource);//关闭当前
		}
	}
	zip_close($resource);//关闭压缩包
	$endtime = explode(' ',microtime()); //解压结束的时间
	$thistime = $endtime[0]+$endtime[1]-($starttime[0]+$starttime[1]);
	$thistime = round($thistime,3); //保留3为小数
	ajaxreturn(0, $name.'解压完毕!
本次解压花费:'.$thistime.' 秒。
共解压 '.$nums.' 个文件,'.$pass_file); }else{ ajaxreturn(1,'无法解压文件,请检查PHP环境是否支持ZZIPlib库'); }

测试解压了一个300多KB的小文件,花了0.115秒,测试解压了一个30多MB的(网页文件,小文件比较多),花了20多秒。

点赞(0) 打赏

Comment list 共有 0 条评论

暂无评论

微信小程序

微信扫一扫体验

立即
投稿

微信公众账号

微信扫一扫加关注

发表
评论
返回
顶部