用thinkphp实现上传文件到数据库的功能并且文件内容不可以重复

用thinkphp实现上传文件到数据库的功能并且文件内容不可以重复

  1.前台表单页面

表单里要写一个属性是 enctype="multipart/form-data 可以上传完整的文件

enctype就是encodetype翻译成中文就是编码类型的意思!multipart/form-data是指表单数据有多部分构成:既有文本数据,又有文件等二进制数据的意思。

2.定义upload方法判断是否上传成功

     第一步 实例化上传类后要支持上传类型(csv纯文本数据),文件大小,上传路径 ,支持保存上传文件到日期子目录里,支持批量上传。

     第二步  引用类文件的upload()方法实现上传文件的功能

3.定义import方法为了编码文件格式为utf8

     第一步  解析csv,为导入数据库做准备

                 编码文件格式目的:不同的人用不同的打开方式去看上传的文件,所以我们先要把编码格式弄一致都弄成utf8的,这样才可以看到数据库里每个字段里的值(自定义函数);

    第二步  读取文件内容

                 用到了fgetcsv()函数读取一行并且解析字段生成数组;再用while循环读取全部信息,读取到最后一个返回的是false则证明读取完毕;(用到的函数有array_combine让键为数据表里的字段名,让值为解析的csv信息);

4.  引入数据库中

                   上传文件的信息量很大,如果只用我们以前学过的add()导入则在工作效率上是非常低的,所以要用到ALLadd()方法;

                   这样可以达到在他执行create()之后sql语句就变成了insert into ’student‘ value(值就是所有解析csv的信息)要注意给获取的全部信息先备住一个大数组;                

                    但用这个Alladd()批量写入也是有限制的,如果最后结束截取到某个字段值的时候,则不能成功导入数据库。怎么办?????方法就是先运行前500行,1000行都可以之后再清楚数据unset(),再运行后面的数据。

5.数据库里的信息和再一次选择文件的信息如果重复怎么办??

数据库的学号用getField()读取到信息。

成功上传的文件里的学号提出来。

in_array($A,$B)判断$B中是否有$A。如果没有重复的就导进数据表里,如果有重复的则输出来看是哪一个。





具体代码

//上传文件
     public function upload(){
                $upload = new \Think\Upload();// 实例化上传类
                $upload->maxSize = 0 ;// 设置附件上传大小
                $upload->exts = array('csv');// 设置附件上传类型
                $upload->rootPath = './Public/Upload/'; // 设置附件上传根目录
                $upload->savePath = ''; // 设置附件上传(子)目录
                // 上传文件
                $info = $upload->upload();
                // $upload->savePath => string '2018-03-22/';
                // dump($info);
                // exit;
                if(!$info) {// 上传错误提示错误信息
                $this->error($upload->getError());
                }else{// 上传成功 获取上传文件信息
                  $this->import($upload->rootPath.$info['file']['savepath'].$info['file']['savename']);
                  // exit;
                  // rootPath设置附件上传根目录
                  // echo ($upload->rootPath.$info['file']['savepath'].$info['file']['savename']);
                  // exit;
                  // $this->success('上传成功');
                 }
           }
 //选择文件(文件已经验证完了直接下载就行)
      function import($file){
           $encoding = detect_encoding($file);
           if($encoding != 'UTF-8') {
             $contents = file_get_contents($file);
             $contents = mb_convert_encoding($contents,'utf-8',$encoding);
             // dump($contents);
             // exit;
             file_put_contents($file,$contents);  
           }

          $fp = fopen($file,'r');
          if ($fp) {
            //作为键名
            $fields = array('no','name','sex');
            $model = M('newstudent');
            // $arrNo = $model->getField('no',true);
            //作为键值
            // $row = fgetcsv($fp);
            // dump($row);
            // exit;
            $arr = array();
            while(($row = fgetcsv($fp,1000,",")) !== false){
               $row = array_combine($fields,$row);
               $ret = in_array($row['no'],$arrNo);
               if($ret == false){
                //不存在
                  $arrNo[] = $row['no'];
                  $arr[] = $row;
               }else{
                echo $row['no'].'存在'.'<br>';
                  continue;
               }

              if(count($arr) == 1000){
                  $model->addAll($arr);
                  unset($arr);//清楚记录
                 }
               

            }
                  // $model->addAll($arr);
                  if (count($arr)>0) {
                    $model->addAll($arr);
                  }
          
           $this->show('添加成功啦','utf8');
          }

      }
	






                 


                  

                  

    




版权声明:本文为user_3011原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。