一、文件上傳
文件上傳需要使用到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 ?>