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