文件上传(File Uploading)
文件上传是表单编程中最常用的功能之一。 FuelPHP提供了一个特殊的类, Upload来处理文件的上传。 让我们在本章中学习如何使用Upload类上传文件。
配置 (Configuration)
可以使用单独的配置文件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 - 将上载的文件保存到服务器时,在文件名中作为prefix字符串
suffix - 将上载的文件保存到服务器时,文件名中的suffix字符串
extension - 要设置的上传文件的extension
create_path - 是否创建文件路径(如果不可用)
overwrite - 是否在保存上载文件时覆盖现有文件
auto_rename - 是否通过在保存上载文件时添加序列号来重命名文件
randomize - 是否创建随机的32个字符的名称来保存上传的文件
上传方法
上传类提供了处理和保存用户上传的文件的选项。 每个已处理的文件(保存之前)将在结果数组中包含以下信息。
field - 表单域的名称
name - 上载文件的名称
type - 浏览器定义的文件类型
mimetype - Upload类定义的文件类型
file - 上载文件临时位置的完全限定名称
filename - 上载文件的文件名
extension - 上传文件的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
进程是指收集上传文件信息的实际过程。 我们可以使用数组提供新的自定义配置。 如果未指定配置,则它将使用fuel/app/config/upload.php中定义的配置
Upload::process (array(
'auto_rename' => false,
'overwrite' => true
));
save
save是指将所有经过验证的文件保存在适当位置的实际过程。 我们可以指定索引以仅保存该特定条目。
Upload::save();
Upload::save(0);
Upload::save(0, 3);
工作示例 (Working Example)
让我们在员工示例中创建一个新的控制器Controller_Upload来测试上传功能。
Step 1 - 创建一个文件, fuel/app/classes/controller/upload.php 。 创建上传控制器。
<?php
class Controller_Upload extends Controller {
}
Step 2 - 创建一个新的动作get_upload。
<?php
class Controller_Upload extends Controller {
public function get_index() {
return \View::forge("upload/index");
}
}
Step 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>
Step 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运行应用程序并尝试上传文件。