FuelPHP - 檔案上傳



檔案上傳是表單程式設計中最常用的功能之一。FuelPHP 提供了一個特殊的類 **Upload** 來處理檔案上傳。在本節中,我們將學習如何使用 Upload 類上傳檔案。

配置

Upload 類可以透過單獨的配置檔案 **fuel/app/config/upload.php** 進行配置。重要的配置項如下:

  • **max_size** - 設定要上傳檔案的最大大小。“0” 表示無限上傳大小

  • **ext_whitelist** - 設定允許的副檔名

  • **ext_blacklist** - 設定不允許的副檔名

  • **type_whitelist** - 設定允許的檔案型別。例如,對於 mime 型別“text/plain”,設定為“text”

  • **type_blacklist** - 設定不允許的檔案型別

  • **mime_whitelist** - 設定允許的 mime 檔案型別。例如,“text/plain”

  • **mime_blacklist** - 設定不允許的 mime 檔案型別

  • **prefix** - 在將上傳的檔案儲存到伺服器時,要新增到檔名之前的字串

  • **suffix** - 在將上傳的檔案儲存到伺服器時,要新增到檔名之後的字串

  • **extension** - 要設定的上傳檔案的副檔名

  • **create_path** - 是否建立檔案路徑,如果不存在

  • **overwrite** - 是否在儲存上傳的檔案時覆蓋現有檔案

  • **auto_rename** - 是否透過新增序列號來重新命名檔案,以便儲存上傳的檔案

  • **randomize** - 是否建立隨機的 32 字元名稱以儲存上傳的檔案

Upload 方法

Upload 類提供用於處理和儲存使用者上傳檔案的選項。每個處理後的檔案(在儲存之前)都將在結果陣列中包含以下資訊。

  • **field** - 表單欄位的名稱

  • **name** - 上傳的檔名

  • **type** - 瀏覽器定義的檔案型別

  • **mimetype** - Upload 類定義的檔案型別

  • **file** - 上傳檔案的臨時位置的完全限定名稱

  • **filename** - 上傳的檔名

  • **extension** - 上傳檔案的副檔名

  • **size** - 上傳檔案的以位元組為單位的大小

  • **errors** - 包含錯誤程式碼和訊息的錯誤陣列

  • **error** - 是否設定包含上傳失敗原因的錯誤陣列(如果上傳失敗)

一旦檔案儲存在伺服器上,結果陣列也將包含以下資訊。

  • **saved_to** - 上傳檔案儲存到的完全限定路徑

  • **saved_as** - 儲存的檔名

  • **errors** - 更新後的錯誤陣列

現在,讓我們看看 Upload 類的使用方法。

is_valid

如果使用者上傳了任何有效檔案,則 is_valid 返回 true。

// do we have any uploaded files to save? 
if (Upload::is_valid()) { 
   // process  
} 

get_files

get_files 返回所有上傳的檔案作為多維陣列。如果指定了表單檔案輸入的索引/名稱,則它將僅返回與指定檔案輸入相關的上傳檔案。

foreach(Upload::get_files() as $file) { 
   // do something with the file info 
}  
if ( Upload::get_files(0)) { 
   // do something 
}

get_errors

如果上傳一個或多個檔案失敗,則 get_errors 返回一個錯誤陣列。如果指定了表單檔案輸入名稱的索引/名稱,則它將僅返回與指定檔案輸入相關的錯誤。

foreach(Upload::get_errors() as $file) { 
   // do something with the file info 
}  
if (Upload::get_errors('myimage')) { 
   // do something 
} 

Process

process 指的是收集有關上傳檔案的資訊的實際過程。我們可以使用陣列提供新的自定義配置。如果未指定配置,則它將使用 fuel/app/config/upload.php 中定義的配置。

Upload::process (array( 
   'auto_rename' => false, 
   'overwrite'   => true 
));

save

save 指的是將所有已驗證的檔案儲存到正確位置的實際過程。我們可以指定索引以僅儲存該特定條目。

Upload::save();
Upload::save(0);
Upload::save(0, 3); 

工作示例

讓我們在我們的員工示例中建立一個新的控制器 Controller_Upload 來測試上傳功能。

**步驟 1** - 建立一個檔案 **fuel/app/classes/controller/upload.php**。建立上傳控制器。

<?php 
   class Controller_Upload extends Controller { 
   }

**步驟 2** - 建立一個新的動作 get_upload。

<?php  
   class Controller_Upload extends Controller { 
      public function get_index() { 
         return \View::forge("upload/index"); 
      } 
   }

**步驟 3** - 為建立的動作建立一個新的檢視。

<!DOCTYPE html> 
<html> 
   <body> 
   
      <form action = "/upload/index" method = "post" enctype = "multipart/form-data"> 
         Select image to upload: 
         <input type = "file" name = "fileToUpload" id = "fileToUpload"> 
         <input type = "submit" value = "Upload Image" name = "submit"> 
      </form>  
      
   </body> 
</html> 

**步驟 4** - 建立一個新的動作 post_action 來處理上傳的檔案。

<?php  
   class Controller_Upload extends Controller { 
      public function get_index() { 
         return \View::forge("upload/index"); 
      }  
      public function post_index(){ 
         $config = array( 
            'path' => DOCROOT.'files', 
            'randomize' => true, 
            'ext_whitelist' => array('img', 'jpg', 'jpeg', 'gif', 'png'), 
         );  
         Upload::process($config);  
         // if there are any valid files 
         
         if (Upload::is_valid()) { 
            Upload::save(); 
            echo "success"; 
         } else { 
            // and process any errors 
            foreach (Upload::get_errors() as $file) { 
               echo var_dump($file); 
            } 
         } 
      } 
   }      

最後,透過請求 URL **https://:8080/upload/index** 執行應用程式,並嘗試上傳檔案。

結果

Upload File
廣告

© . All rights reserved.