ThinkPHP教程_PHP框架之ThinkPHP(十三)【文件上傳】


一、文件上傳

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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM