在一个项目中除了增删改查非常重要之外,导入文件也是不可缺少的,接下来我就根据我所学的跟大家分享一下。
thinkphp有自己的上传实例化类,代码如下:
public function upload(){ if(IS_GET){ $this->display(); exit(); } $upload=new \Think\Upload();//实例化上传类 $upload->maxSize=0;//设置附件上传文件大小,0为不限大小 $upload->exts=array('jpg','gif','png','jpeg','csv');//设置附属上传文件类型 $upload->rootPath="./Public/Upload/";//设置附属文件的根目录 $upload->savPath='';//设置附件上传子目录 //上传文件 $info=$upload->upload(); if(!$info) {// 上传错误提示错误信息 $this->error($upload->getError()); }else{// 上传成功 获取上传文件信息 $data=$this->import($upload->rootPath . $info['excelFile']['savepath'] . $info['excelFile']['savename']); } }
接下来需要将上传大的文件导入到数据库中,代码如下:
public function import($file){ $encoding=detect_encoding($file); //如果不是utf8格式转化为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','pinyin'); $model=M('student'); $arrNo=$model->getField('no',true); $arr=array(); while(($row = fgetcsv($fp,1000,","))!== false) { $py=$row[1]; $row['pinyin']=SpGetPinyin($py);//生成拼音 $row = array_combine($fields,$row); if(in_array($row['no'], $arrNo)){ //去重,避免重复上传 $data[]=$row['no'] . '数据已存在' . '<br>'; }else{ $arrNo[] = $row['no']; $arr[] = array_combine($fields, $row); $data[]= $row['no'] . '添加成功' . '<br>'; } if(count($arr)==1000){ $model->addAll($arr); unset($arr); } } if(count($arr)>0){ $model->addAll($arr); } $data=implode(' ',$data); $this->frame($data); } }
这样写完所有代码,虽然可以成功上传文件并导入到数据中,但运行并不完美,我们在调用一个下载文件的方法,将运行结果下载在一个日志文件中,相关管代码如下:
public function frame($str){ // 下载文件 $file_name='123.log';//下载文件名 $file_dir='';//下载文件存放目录 // dump($file_dir); // exit(); //检查文件是否存在 if (! file_exists ( $file_dir . $file_name )) { echo "文件找不到"; exit (); } else { //打开文件 $file = fopen ( $file_dir . $file_name, "r" ); //输入文件标签 file_put_contents($file, $this->show($str),'utf8'); 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 ); exit (); }
这样就完成了文件上传了,接下来就只需要在前台的表单中post提交就完成了,大家学会了吗?以上就是我对thinkPHP文件上传的所有内容了,希望对大家有所帮助。