thinkphp3.2.3文件上传下载及去重

上传文件:

设置好上传的参数后,可以调用 Think\Upload 类的upload方法进行附件上传,如果失败,返回false,
并且用getError方法获取错误提示信息;如果上传成功,就返回成功上传的文件信息数组。

代码如下:

$upload = new \Think\Upload();// 实例化上传类
$upload->maxSize = 3145728 ;// 设置附件上传大小
$upload->exts = array('jpg', 'gif', 'png', 'jpeg');// 设置附件上传类型
$upload->rootPath = './Uploads/'; // 设置附件上传根目录
$upload->savePath = ''; // 设置附件上传(子)目录
// 上传文件
$info = $upload->upload();
if(!$info) {// 上传错误提示错误信息
$this->error($upload->getError());
}else{// 上传成功 获取上传文件信息
foreach($info as $file){
echo $file['savepath'].$file['savename'];
}

}

下载文件:

需要下载的是一个文件名为xxx.rar的文件,首先创建文件是download.php的PHP文件。需要使用PHP的文件处理API函数。它是通过fread()函数把文件直接输出到浏览器提示用户下载,这样所有的处理都是在服务器端完成的,因此用户就无法获得文件具体存储位置信息的,示例代码如下:

$file_name = "xxx.rar";     //下载文件名    

$file_dir = "./up/";        //下载文件存放目录    

//检查文件是否存在    

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 ();    

}    

?> 

其实文件上传下载都不难,可以说有固定代码,只要会用就行。最难的还是去重问题,这个比较有困难!

比如:解决学号去重问题

           首先,将原有数据表中的所有学员存入一个数组$arrNo中。然后,读取文件中的一条数据。其次,检测该行中的学号在数组arrno中是否存在,如果不存在,写入二位数组$arr,并且把学号追加到arrNo中;如果存在则继续读取下一行,最后仍然是,读取下一行...

示例代码如下:

        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);
}
//解析csv
$fp=fopen($file,'r');
if($fp){
$fields=array('no','name','sex');
$model=M('newstudent');
   //解决学号去重问题
            //将原有数据表中的所有学员存入一个数组$arrNo中,
            // 读取文件中的一条数据
            // 检测该行中的学号在数组arrno中是否存在,如果不存在,写入二位数组$arr,并且把学号追加到arrNo中;如果存在则继续读取下一行
            // 读取下一行...
$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 $row['no']."该学号已存在".'
';
                }else{
                    $arr[]=$row;
                    $arrNO[]=$row['no'];
                }
if(count($arr)==1000){
$model->addAll($arr);
unset($arr);
}
}
if(count($arr)>0){
$model->addAll($arr);
}
$this->show('添加成功','utf8');
}
}

最终完整代码如下:

  public function upload(){
      $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->success('上传成功!');
        $this->import($upload->rootPath . $info['file']['savepath']. $info['file']['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);
      }
     //解析csv
      $fp=fopen($file,'r');
      if($fp){
        $fields=array('no','name','sex');
        $model=M('student');
        $arrNO= $model->getField('no',true);
        $arr=array();
        $file="./Public/file/student.txt";
        $fp2 = fopen($file, 'w');
        while (($row=fgetcsv($fp,1000,","))!==false) {
          $row=array_combine($fields, $row);
           if(in_array($row['no'],$arrNO)){
                $str .= $row['no']."该学号已存在".PHP_EOL;
          }else{
                $arr[]=$row;
                $arrNO[]=$row['no'];
                $str .= $row['no']."该学号可以导入".PHP_EOL;
          }
          fwrite($fp2, $str);
          if(count($arr)==1000){
            $model->addAll($arr);
            unset($arr);
          }
        }
        fclose($fp2);
        if(count($arr)>0){
          $model->addAll($arr);
        }
        // $this->show('添加成功','utf8').PHP_EOL; 
        $this->up($file);     
      }
    }
        public function up($file){ 
          $file_name = "student.txt";   //下载文件名    
          $file_dir = "./Public/file/";   //下载文件存放目录
          //检查文件是否存在  
        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 ();    
        }    
    }

你可能感兴趣的:(thinkphp3.2.3文件上传下载及去重)