- 先搭建好上传的界面
- 通过点击上传按钮,将所上传的表选中
- 再进行导入
- 数据读取
- 依次将读取的数据存入数据库( 将数据进行筛选)
- 最后导入完毕下载日志文件供需要的用户
代码展示如下:
//上传方法
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();//☆ 此处调用tp自带的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('form');
$arrNo =$model->getField('no',true);//获得学号
$arr = array();
while (($row = fgetcsv($fp,1000,","))!==false) {
$row = array_combine($fields,$row);//写入数据
//此处过滤重复值。
//若数据库存在则continue;
// 若数据库中不存在就追加在上面查询的学号一维数组中 并继续执行程序且写入日志文件
if (in_array($row['no'],$arrNo)) {// echo "已存在";
$file='./Public/demo.txt';
$str.=$row['no']."已存在"."\r\n";
file_put_contents($file, $str);
}else{
$arrNo[]=$row['no'];
$arr[]=$row;
$file='./Public/demo.txt';
$str2.=$row['no']."导入成功"."\r\n";
file_put_contents($file, $str2);
}
//批量写入addAll
if (count($arr)==1000) {
$model->addAll($arr);
unset($arr);
}
}
if (count($arr)>0) {
$model->addAll($arr);
}
$this->show('添加成功','utf8');
$this->xiazai();
exit;
}
}
//下载日志文件
function xiazai(){
$file_name ="demo.txt";
$file_dir = "./Public/";//检查文件是否存在
if (! file_exists ( $file_dir . $file_name )) {
echo "文件找不到";
exit ();
} else {
//打开文件
$file = fopen ( $file_dir . $file_name, "r" );
//输入文件标签
Header ( "Content-type: application/octet-stream" );
Header ( "Accept-Ranges: bytes" );
Header ( "Accept-Length: " . filesize ( $file_dir . $file_name ) );
Header ( "Content-Disposition: attachment; filename=" . $file_name );
//输出文件内容
//读取文件内容并直接输出到浏览器
echo fread ( $file, filesize ( $file_dir . $file_name ) );
fclose ( $file );
}
}
至此导入数据库就完成了!不过总感觉代码有瑕疵 ,每次执行while循环语句file_put_contents()此函数每每打开关闭,运行程序不仅繁琐还会占用时间,在写程序中这是忌讳的,望大家能提出一个好建议!