Thinkphp解决上传文件的重复问题

                                                      如何解决上传文件的重复问题

       在学习thinkphp过程中发现如果要上传多个文件时就会出现一些重复性的问题,因此我们要避免重复性的问题。举个例子,我们要把一个student表上传到数据库中,上传文件成功后,打开此文件进行解析,先将学号存入一个数组中$arrNo中,并且在循环中判断$row['no']是否在$arrNo中,如果不存在则加入数据库,相反则输出此数据已存在。

 1.首先我们先建一个上传文件的方法

   public function upload(){
        $upload=new \Think\Upload();//实例化上传类
        $upload->maxSize=0;//设置附件上传大小
        $upload->exts=array('csv');//设置附件上传类型
        $upload->rootPath='./Public/Upload/';//设置附件上传根目录
        $upload->savePath='';//设置附件上传(子)目录
        //上传文件
        $info=$upload->upload();
        if(!$info){
            $this->error($upload->getError());
        }else{
            $this->import($upload->rootPath.$info['file']['savepath'].$info['file']['savename']);
        }

    }

2.如果你想设置编码格式为utf-8,可以写如下编码

$encoding=detect_encoding($file);

if($encoding!='UTF-8'){
        $contens=file_get_contents($file);
        $contens=mb_convert_encoding($contens,'utf-8',$encoding);
        file_put_contents($file, $contens);

    }

3.上传文件成功后,打开此文件进行解析,先将学号存入一个数组中$arrNo中,并且在循环中判断$row['no']是否在$arrNo中,如果不存在则加入数据库,相反则输出此数据已存在。

   $fp=fopen($file,'r');//fopen 打开文件后者URL,r:只读方式打开,将文件指针指向文件头
    if($fp){
        $fields=array('no','name','sex');
        $model=M('newstudent');
        $arrNo= $model->getField('no',true); //获取原表中所有的学号存入数组

        $arr=array();

//循环读取CSV文件

while(($row=fgetcsv($fp,1000,","))!==false){

            //fgetcsv — 从文件指针中读入一行并解析 CSV 字段 
            //fgetcsv(一个由 fopen() 、 popen() 或 fsockopen() 产生的有效文件指针,必须大于 CVS 文件内最长的一行,设置字段分界符)
            $row=array_combine($fields,$row);
            //array_combine — 创建一个数组,用一个数组的值作为其键名,另一个数组的值作为其值 ,返回合并的 array ,如果两个数组的单元数不同则返回 FALSE 
            if(in_array($row['no'],$arrNo)){
                echo $row['no'].'已经存在'.PHP_EOL;
                $k++;
            }else{
                $arr[]=$row;
                $arrNo[]=$row['no'];
            }
          
            if(count($arr)==1000){
                $model->addAll($arr);
                unset($arr);
            }
        }
        if(count($arr)>0){
            $model->addAll($arr);
             
        }
        }


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值