FuelPHP - 文件上传


文件上传是表单编程中最常用的功能之一。FuelPHP 提供了一个特殊的类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 文件类型。例如,“文本/纯文本”

  • mime_blacklist - 设置不允许的 mime 文件类型

  • prefix - 将上传的文件保存到服务器时文件名中的前缀字符串

  • suffix - 将上传的文件保存到服务器时文件名中后缀的字符串

  • 扩展名- 要设置的上传文件的扩展名

  • create_path - 是否创建文件路径(如果不可用)

  • overwrite - 保存上传文件时是否覆盖现有文件

  • auto_rename - 保存上传文件时是否通过添加序列号来重命名文件

  • randomize - 是否创建一个随机的 32 个字符的名称来保存上传的文件

上传方式

Upload类提供处理和保存用户上传的文件的选项。每个处理的文件(保存之前)将在结果数组中包含以下信息。

  • field - 表单字段的名称

  • name - 上传的文件的名称

  • type - 浏览器定义的文件类型

  • mimetype - 由 Upload 类定义的文件类型

  • file - 上传文件的临时位置的完全限定名称

  • filename - 上传文件的文件名

  • 扩展名- 上传文件的扩展名

  • size - 上传文件的大小(以字节为单位)

  • 错误- 具有错误代码和消息的错误数组

  • error - 是否设置数组错误以及上传失败的原因(如果上传失败)

文件保存到服务器后,结果数组还将包含以下信息。

  • save_to - 保存上传文件的完全限定路径

  • save_as - 保存的文件的名称

  • 错误- 更新的错误数组

现在,让我们看看Upload类的方法。

已验证

如果用户上传了任何有效文件,is_valid 返回 true。

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

获取文件

get_files 以多维数组形式返回所有上传的文件。如果指定了表单文件输入的索引/名称,则它将仅返回与指定文件输入相关的上传文件。

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

获取错误

如果上传一个或多个文件失败,get_errors 将返回一组错误。如果指定了表单文件输入名称的索引/名称,则它将仅返回与指定文件输入相关的错误。

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

过程

process 是指收集有关上传文件的信息的实际过程。我们可以使用数组提供新的自定义配置。如果没有指定配置,那么它将使用在fuel/app/config/upload.php中定义的配置

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

节省

保存是指将所有经过验证的文件保存到适当位置的实际过程。我们可以指定索引来仅保存该特定条目。

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 http://localhost:8080/upload/index来运行应用程序并尝试上传文件。

结果

上传文件