thinkphp的学生表的上传以及导入

学生信息存储在一个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;
	}
?>
这样这道题就迎刃而解啦。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值