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

思想:首先上传文件,在检测内容的编码格式,更改成UTF8的格式,再打开文件,写入文件,首先把原表中的数据传入到一个数组,然后用循环(循环条件:产生有效的文件指针必须大于cvs文件内最长的一行,设置字段分解符)把数据写入文件中,其中循环中要判断原表中的数组与插入数据的数组是否存在相同的数据,如果有相同的数据则输出‘传入失败’,否则写入成功。

首先,写一个方法上传文件(代码):

 

     public function upload(){
           if(IS_GET){
                 $this->display();
                 exit;
           }
                 $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->success('上传成功'.$info['file']['savepath'].$info['file']['savename']);
                 // echo$upload->rootPath.$info['file']['savepath'].$info['file']['savename'],'utf8';
                      $this->import($upload->rootPath.$info['file']['savepath'].$info['file']['savename']);
                        }

      }

写一个写入文件的方法,把上边的文件参数传到此方法中,

public functionimport($file){
           //检测文件编码格式
            $encoding = detect_encoding($file);//检测文件是什么编码格式
           // dump($encoding);
           //如果不是utf8则转换为utf8
           if ($encoding!='utf-8') {
                 $content=file_get_contents($file);//将整个文件读入一个字符串
                 $content=mb_convert_encoding($content,'utf-8',$encoding);//将‘gbk'转换为'utf-8'.
                 file_put_contents($file,$content);//将一个字符串写入文件
                 
           }
           //解析csv
           $fp=fopen($file, 'r');//只读方式打开,将文件指针指向文件头
           if ($fp) {
                 $arrNo=M('student')->getField('no',true);//一位数组获取原表所有的no存入数组
                 $filed=array('no','name','sex');//新建一个数组
                 $model=M('student');//实例化数据表
                 $arr=array();//创建一个空数组
                 while(($row=fgetcsv($fp,1000,','))){
                      //去重复
                if(in_array($row['0'],$arrNo)){
                  $file="text.txt";
                    $content=$row['0'] . "学号已经存在!";
                    echo$content;
                   //file_put_contents($file,$content);
                }else{
                    $arr[] =array_combine($filed, $row);
                   $arrNo[]=$row['0'];
                   $file="text.txt";

                    //$fp=fopen($file,'r');
                   $content=$row['0'].'导入成功';
                    echo$content;
                   //file_put_contents($file,$content);
                }
                      if(count($arr)==1000) {
                            $model->addAll($arr);
                            unset($arr);
                      }
                 }
                 // fclose($file);
            if (count($arr)>0) {
              $model->addAll($arr);
            }
      
             $this->success('上传成功');
           }    

      }

构图:

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值