如何解决上传文件的重复问题
在学习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);
}
}