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

xiaoxiao2021-02-28  23

用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'); } }

                 

                  

                  

    

转载请注明原文地址: https://www.6miu.com/read-1750313.html

最新回复(0)