学生信息存储在一个csv格式的文件,如何实现上传文件并解析数据,批量添加到数据库中?
解题思路:
首先在控制器写一个上传的方法upload;之后再写一个导入的方法import。
upload方法(上传):
实例化一个上传类,写相应的上传文件的属性,如:上传文件的大小,上传文件的类型,上传文件的路径等等,上传文件。
最后有(上传成功/上传失败)提示信息。
import方法(导入):
首先判断上传文件的格式(utf-8/gbk),用function.php中自己写的detect_encoding()方法来判断;再将上传的文件格式改为utf-8格式;打开文件(只读模式),将学生表数据写到newstudent,
用while循环将数据写进去批量写入,在此需要判断写入的数据是否与上传的文件有重复,获得newstudent中本来就存在/不存在的数据,去除重复值,若之前存在,则不导入数据,否则,导入数据。
最后将upload方法和import方法连起来。
<?php
//上传文件
public function upload(){
if (IS_GET) {
$this->display();
exit();
}
$upload = new \Think\Upload();//实例化上传类
$upload->maxSize = 0;//设置上传文件大小
$upload->exts = array('csv');//设置上传文件类型
$upload->rootPath = './Public/Uploads/';//设置根目录
$upload->savePath = '';//设置子目录
//上传文件
$info = $upload->upload();
if (!$info) {
$this->error($upload->getError());
}else{
$this->import($upload->rootPath . $info['file']['savepath'] . $info['file']['savename']);
}
}
//导入
public function import($file){
//检测文件编码
$encoding = detect_encoding($file);
//将格式转化为UTF8
if ($encoding != 'UTF-8') {
$contens = file_get_contents($file);//适合小文件
$contens = mb_convert_encoding($contens, 'utf-8',$encoding);
file_put_contents($file, $contens);
}
$fp = fopen($file,'r');
if ($fp) {
$fields = array('no','name','sex');
$model = M('newstudent');
$arrNo =$model->getField('no',true);//获得学号
$arr = array();
while (($row = fgetcsv($fp,1000,","))!==false) {
$row = array_combine($fields,$row);//写入数据
if (in_array($row['no'],$arrNo)) {
echo "已存在";
}else{
echo "bucunzai";
$arrNo[]=$row['no'];
$arr[]=$row;
}
//批量写入addAll
if (count($arr)==1000) {
$model->addAll($arr);
unset($arr);
}
dump($arr);
exit();
}
if (count($arr)>0) {
$model->addAll($arr);
}
$this->show('添加成功','utf8');
}
}
?>
function.php中的detect_encoding方法,代码如下:
<?php
//检测编码格式,$file为文件名
function detect_encoding($file){
$list = array('GBK','UTF-8');
$str = file_get_contents($file);
foreach ($list as $item) {
$tmp = mb_convert_encoding($str,$item,$item);
if (md5($tmp) == md5($str)) {
return $item;
}
}
return null;
}
?>
这样这道题就迎刃而解啦。