1. 程式人生 > >TP中上傳檔案,匯入並且下載如何實現

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

      }


注:下載日誌檔案方法是將日誌檔案的路徑以及檔名獲取出來,然後開啟該檔案並且讀取出來,輸入到日誌檔案中,最終關閉日誌檔案。