ThinkPHP教程_PHP架構之ThinkPHP(十三)【檔案上傳】

來源:互聯網
上載者:User

標籤:

一、檔案上傳

  檔案上傳需要使用到ORG類庫包中的Net.UploadFile類,所以得通過import()函數引入該類

  1、準系統

  也就是ORG.Net.UploadFile類的準系統,不過有些功能(對上傳的圖片檔案產生縮圖)得結合ThinkPHP的ORG.Util.Image類實現,不過ORG.Util.Image類不需要手動引入,而是在UploadFile類中upload方法自動引入的!

    ·基本上傳(單檔案上傳)

    ·批量上傳

    批量上傳相對於基本上傳,只需要修改下表單即可

    

    UploadFile類會自動識別批量上傳,所以基本上傳和批量上傳有關UploadFile類的操作是一樣的,主要是上傳成功之後返回的檔案資訊有細微差異。返回的都是一個包含上傳檔案的資訊的二維數組(檔案資訊在內層數組中),只不過基本上傳返回的二維數組只包含一個元素,而批量上傳返回的二維數組包含多個元素!進而影響將上傳的檔案資訊儲存到資料庫中的操作而已,其實也沒多差別,反正都是二維數組,直接使用addAll()方法批量插入即可

    ·支援圖片產生縮圖

    如果上傳的檔案是圖片,則可以產生縮圖進行儲存

    ·自訂參數上傳

    ·上傳檢測

    比如檔案大小、檔案尾碼、檔案類型等等。ps,檔案尾碼與檔案類型不是一回事

    ·支援覆蓋方式

    ·支援上傳類型、附件大小、上傳路徑定義

    ·支援子目錄儲存上傳檔案

    開啟子目錄儲存上傳檔案後,會自動產生子目錄,且子目錄的產生方式有hash日期兩種,且如果是日期,還可以定義日期格式

    ·支援上傳檔案的hash驗證

  2、上傳表單

    

    特別注意,必須要在表單中添加enctype="multipart/form-data"屬性,否則該表單不支援檔案上傳功能

  3、上傳動作

  為了結構最佳化,將上傳動作分為兩個部分,即在FileAction模組中定義兩個private方法,分別是up()方法和keepToDb()方法,然後在upload動作中依次調用這兩個方法!

  

    ·up()方法

    主要功能就是上傳檔案

    

    ps,UploadFile類的一些屬性的功能可以參考源碼或手冊,但是個人建議看源碼,因為注釋得很明白!

      #maxSize:檔案上傳的最大檔案大小,以位元組為單位,預設為-1,表示不限大小

      #savePath:檔案儲存路徑(必須)

      #saveRule:上傳檔案的儲存規則,必須是一個無需任何參數的函數名,例如可以是 time、uniqid、com_create_guid等,但必須能保證產生的檔案名稱是唯一的,預設是uniqid。實際上這裡就是指定一個回呼函數,來產生一個唯一的字串作為儲存檔案的檔案名稱,所以完全可以自訂一個回呼函數,只要能保證產生的字串是唯一的即可

      #hashType:上傳檔案的雜湊驗證方法,預設是md5_file。也可以是sha1_file,同理也是指定一個回呼函數!

      #autoCheck:是否自動檢測附件,預設為自動檢測,即值為true

      #uploadReplace:存在同名檔案是否覆蓋,預設為不覆蓋,即值為false

      #allowExts:允許上傳的檔案尾碼,預設為空白數組,不做尾碼檢查

      #allowTypes:允許上傳的檔案類型,預設為空白數組,不做尾碼檢查

      #autoSub:是否使用子目錄儲存檔案,預設不使用,即值為false

      以下3項是在開啟子目錄儲存檔案是生效

      #subType:子目錄建立方式,預設為hash,可以設定為hash或date

      #dateFormat:date方式建立子目錄時,日期格式,預設為Ymd

      #hashLevel:hash方式建立子目錄時,子目錄層數,預設為1層

      ------

      #thumb:如果上傳的檔案是圖片,是否產生縮圖,預設為不產生,即值為false

      以下6項是在開縮圖產生時生效

      #thumbMaxWidth:縮圖的最大寬度,如果產生多個(根據每一張圖產生多個),則用,分隔

      #thumbMaxHeight:縮圖的最大高度,如果產生多個(同理),則用,分隔

      #thumbPrefix:縮圖檔案名稱首碼,預設為thumb_,如果多個(同理),則用,分隔,否則其它的沒有首碼

      #thumbFixfix:縮圖檔案名稱尾碼,預設為空白

      #thumbPath:縮圖的儲存路徑,預設為空白,留空的則為savePath

      #thumbFile:縮圖的檔案名稱,預設為為空白,即為上傳檔案名稱加上前尾碼(指定了的話)

      #thumbRemoveOrigin:產生縮圖之後是否刪除原圖,預設為不刪除,即值為false

    設定好上傳的參數後,就可以調用UploadFile類的upload方法進行附件上傳,如果失敗,返回false,那麼可以用getErrorMsg方法擷取錯誤提示資訊;如果上傳成功,返回true,則可以通過調用getUploadFileInfo方法擷取成功上傳的附件資訊列表。因此getUploadFileInfo方法的傳回值是一個二維數組,其中外層元素就是上傳的附件資訊。每個附件資訊又是一個記錄了下面資訊的數組

      #key:附件上傳的表單名稱

      #savepath:上傳檔案的儲存路徑

      #name:上傳檔案的原始名稱,即在用戶端機器中儲存的檔案名稱

      #savename:上傳檔案的儲存名稱,即在伺服器端機器中儲存的檔案名稱

      #size:上傳檔案的大小

      #type:上傳檔案的MIME類型

      #extension:上傳檔案的尾碼類型

      #上傳檔案的雜湊驗證字串

    那麼就可以通過擷取到附加資訊寫入到資料庫中,通常只需要savepath,當然也可以將其他資訊寫入!附件資訊有兩種儲存方式,一是就儲存到當前資料表(即與表單中其它資訊一同存入一張表中,比如說將使用者名稱、姓名、連絡方式、簡曆附件savepath存入一張表)、二是單獨儲存到附件表格中(即表單中其它資訊如使用者名稱、姓名、連絡方式存入資訊表中,而簡曆附件savepath存入附件表格,再在附件表格中設定一個欄位與資訊表關聯即可)

    ·keepToDb()方法

    

  4、源碼 

 

 1 <html> 2     <head> 3         <title>檔案上傳</title> 4     </head> 5     <body> 6         <volist name=‘files‘ id=‘file‘> 7             <img src="__PUBLIC__/Uploads/{$file.file_path}"/> 8         </volist> 9         <form action="__URL__/upload" method="post" enctype="multipart/form-data">10             使用者名稱:<input type="text" name="username"/><br/>11             選擇檔案:<input type="file" name="file[]"/><br/>12                      <input type="file" name="file[]"/><br/>13             <input type="submit" value="上傳"/>14         </form>15     </body>16 </html>
 1 <?php 2     class FileAction extends Action{ 3         public function index(){ 4             $File=new Model(‘File‘); 5  6             $files=$File->select(); 7              8             $this->assign("files",$files); 9 10             $this->display();11         }12 13         public function upload(){14             if(empty($_FILES)){15                 $this->error("請選擇上傳的檔案");16             }else{17                 $file=$this->up();18 19                 if($this->keepToDb($file)){20                     $this->success(‘上傳成功‘);21                 }else{22                     $this->error(‘寫入資料庫失敗‘);23                 }24             }25         }26 27         // 檔案上傳28         private function up(){29             import(‘ORG.Net.UploadFile‘);30             $upload = new UploadFile();// 執行個體化上傳類31             $upload->maxSize  = 3145728 ;// 設定附件上傳大小32             $upload->allowExts  = array(‘jpg‘, ‘gif‘, ‘png‘, ‘jpeg‘);// 設定附件上傳類型33             $upload->savePath =  ‘./Public/Uploads/‘;// 設定附件上傳目錄34             $upload->saveRule=‘uniqid‘;//設定儲存檔案名稱產生方式35             $upload->autoSub=true;//開啟子目錄儲存檔案36             $upload->subType=‘date‘;//設定子目錄名產生方式37 38                //與縮圖有關39                $upload->thumb=true;//開啟儲存縮圖功能40             $upload->thumbMaxWidth=‘400,200‘;//設定縮圖大小41             $upload->thumbMaxHeight=‘200,100‘;42 43                $upload->uploadReplace=true;44 45                $upload->thumbPrefix=‘m_,s_‘;//設定縮圖檔案名稱首碼46 47                $upload->thumbPath=‘./Public/Uploads/Thumb/‘;//設定縮圖儲存路徑48 49             if(!$upload->upload()) {// 上傳錯誤提示錯誤資訊50                 $this->error($upload->getErrorMsg());51 52             }else{// 上傳成功53                 return $upload->getUploadFileInfo();//上傳成功返回上傳檔案的資訊54             }55         }56 57         private function keepToDb($file){58             $File=M(‘File‘);59 60             /**61              *將所要插入的資料倒騰到$data[][]中62             */63             for($i=0;$i<count($file);$i++){64 65                 $data[$i][‘file_path‘]=$file[$i][‘savename‘];66             }67             return $File->addAll($data);68         }69     }70 71 ?>

 

ThinkPHP教程_PHP架構之ThinkPHP(十三)【檔案上傳】

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.