ThinkPHP中文件上传和去除重复

本文介绍使用TP框架进行文件上传的方法,包括设置上传参数、处理上传文件及将CSV文件内容导入数据库的过程,并生成日志文件。

      1. 上传文件:在上传文件时,可使用TP自带的函数upload直接调用。设置附件上传的大小,类型,根目录,子目录的大小,然后实现上传,并将路径改为相对路径,不是绝对路径。

代码如下:

     public function upload(){
		if(IS_GET){
			$this->display();
			exit;
		}

		$upload=new \Think\Upload();//实例化上传类
		$upload->maxSize=0;//设置附件上传大小
		$upload->exts=array('csv');//设置附件上传类型
		$upload->rootPath='./Public/Upload/';//设置附件上传根目录
		$upload->savePath='';//设置附件上传(子)目录
		//上传文件
		$info=$upload->upload();
		if(!$info){
			$this->error($upload->getError());
		}else{
			$this->import($upload->rootPath.$info['file']['savepath'].$info['file']['savename']);
		}

	}

         2.使用import方法,将上传的文件导入数据库中,并生成日志文件。

              第一步:首先将文件读入一个字符串,将一个字符串写入文件,并用fopen打开文件。

              第二步:使用fwrite写入日志文件。(注:写日志文件文件换行使用\r\n)。

             第三步:使用in_array函数判断是否重复,如果重复,则提醒已存在,如果不重复,提醒导入成功。

代码如下:

public function import($file){
        // $file="./Public/Upload/2018-03-21/5ab1b65184cc6.csv";
        $encoding=detect_encoding($file);
        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('student');
            $arrNo=$model->getField('no',true);
            // dump($arrNo);
            // exit;

            $arr=array();
            $filename="./Public/Logs/load.txt";
            $fop=fopen($filename,'w');
            while(($row=fgetcsv($fp,1000,","))!==false){//从文件指针中读入一行并解析 CSV 字段 
                // $arr[]=array_combine($fields, $row);//创建一个数组,一个为键,一个为值
                // dump($row);
                // exit;
                $row=array_combine($fields,$row);
                // dump($row);
                // exit;
                $name=$row['name'];
                $row['py']=SpGetPinyin($name);
                // dump($row);
                // exit;
                if(in_array($row['no'], $arrNo)){
                    $data .= $row['no']."已存在\r\n";
                   
                }else{
                    $arr[]=$row;
                    $arrNo[]=$row['no'];
                    $data.= $row['no']."导入成功\r\n";
                   
               }


                if(count($arr)==1000){
                    $model->addAll($arr);
                    unset($arr);//释放给定的变量
                
              } 
          }
                if(count($arr)>0){
                    $model->addAll($arr);
                }
                $this->show('添加成功','utf8');
        }  
            $fwrite=fwrite($fop,$data);
            $file_name = "load.txt";     //下载文件名    
            $file_dir = "./Public/Logs/";        //下载文件存放目录    
            //检查文件是否存在    
            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 );    
                // exit ();    
            }  
            
    }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值