TP中上传文件,导入并且下载如何实现

1.上传文件(方法):  

public function upload(){

      $upload = new \Think\Upload();// 实例化上传类

      $upload->maxSize = 0 ;// 设置附件上传大小
      $upload->exts = array('csv');// 设置附件上传类型
      $upload->rootPath = './Uploads/'; // 设置附件上传根目录
      $upload->savePath = ''; // 设置附件上传(子)目录
      // 上传文件
      $info = $upload->upload();
      if(!$info) {// 上传错误提示错误信息
          $this->error($upload->getError());
      }else{// 上传成功
        $filename = $info['photo']['savename'];
          if (empty ($filename)) {
            echo '请选择要导入的CSV文件!';
            exit;

      }

注:以上代码是上传文件时的代码,涉及到路径,文件名,如果有一丝错误便会导致导入失败。上传类对文件的上传安全做了支持,如果企图上传非法的文件,系统会提示非法文件。

2.导入文件(方法)

      $encoding=mb_detect_encoding($filename);
      $save=$info['photo']['savepath'];
      $fp=fopen('uploads/'.$save.$filename,'r');
      if($fp){
        $fields=array('no','name','sex');
        $model=M('student');
        $arrNo=$model->getField('no',true);
        // dump($arrNo);
        $arr=array();
        $i=0;
      while (($row=fgetcsv($fp,1000,","))!==false) {
        $row=array_combine($fields, $row);
        // dump($row);
        if (in_array($row['no'], $arrNo)) {
            $tr[].= '第'.$i.'行'.$row['no'].'存在'.PHP_EOL;
        }else{
            $arrNo[]=$row['no'];
            $arr[]=$row;
            $tr[].='第'.$i.'行'.$row['no']."导入成功".PHP_EOL;
        }
        if (count($arr)==1000) {
            $model->addAll($arr);
            unset($arr);
            $this->show('导入成功','student/index');
        }                             
        $i++;
      }
        $data=writelog("myerror",$tr);
            if (count($arr)>0) {
                $model->addAll($arr);
                $this->success('导入成功','index');
            }else{
                $this->error('数据表已存在!');
            }
      }

     }

注:以上是导入文件的部分代码,导入文件的实质是通过一个文件选择控件来选择一个文件将其导入到数据表中,并且最终显示到前台页面。关于去掉重复数据的思路:首先我们从数据表中取出来学号字段$no,并且存放在$arrNo数组里;然后,我们再将csv文件中的学号字段$no取出来,判断学号$no是否存在$arrNo数组;如果学号在$arrNo数组中不存在,则将学号$no追加到$arrNo,然后将最终内容存入$arr数组。如果存在,则不会进行插入。

3.下载日志(方法):
    public function download(){
        $file_dir = "./Logs/myerror/";
        $file_name = date("Ymd",time()).'.log';
         // echo $file_name;
         $rr=$file_dir.$file_name;
         // echo $rr;
         //下载文件名    
         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 ( $filfile_name ) );    
        Header ( "Content-Disposition: attachment; filename=" . $file_name );    
        //输出文件内容     
        //读取文件内容并直接输出到浏览器    
        echo fread ( $file, filesize ( $file_dir . $file_name ) );    
        fclose ( $file );    
        exit ();    
            }

      }


注:下载日志文件方法是将日志文件的路径以及文件名获取出来,然后打开该文件并且读取出来,输入到日志文件中,最终关闭日志文件。


猜你喜欢

转载自blog.csdn.net/k363890296/article/details/79735024