標籤:
一、檔案上傳
檔案上傳需要使用到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(十三)【檔案上傳】