獲取上傳類
ThinkPHP的擴展中提供了文件上傳類庫UploadFile,可以在在http://www.thinkphp.cn/extend/224.html下載,或者下載官方的完整擴展包(http://www.thinkphp.cn/down/253.html)里面也已經包含上傳擴展類了。如果是單獨下載的上傳類庫,把解壓后的UploadFile.class.php 放入ThinkPHP/Extend/Library/ORG/Net/(如果沒有請手動創建)目錄下面。
最新版本的上傳類包含的功能如下(有些功能需要結合ThinkPHP系統其他類庫):
- 基本上傳功能
- 支持批量上傳
- 支持生成圖片縮略圖
- 自定義參數上傳
- 上傳檢測(包括大小、后綴和類型)
- 支持覆蓋方式上傳
- 支持上傳類型、附件大小、上傳路徑定義
- 支持哈希或者日期子目錄保存上傳文件
- 支持動態定義子目錄保存文件
- 上傳圖片的安全性檢測
- 支持上傳文件命名規則
- 支持對上傳文件的Hash驗證
如果你需要使用上傳圖片生成縮略圖功能的話,還需要下載圖像處理擴展類http://www.thinkphp.cn/extend/225.html,解壓后的Image.class.php放入ThinkPHP/Extend/Library/ORG/Util/目錄下面。
上傳表單
上傳表單無需特別處理,下面是一個最簡單的單文件上傳表單:
<form id="upload" method='post' action="!-URL-!/upload/" enctype="multipart/form-data">
<input name="image" type="file" />
<input type="submit" value="提交" >
</form>
注意,表單必須添加
enctype="multipart/form-data"屬性才能支持文件上傳功能。
上傳操作
接下來就是定義上傳操作了,我們在Action控制器中添加upload操作方法如下:
// 文件上傳
public function upload() {
import('ORG.Net.UploadFile');
$upload = new UploadFile();// 實例化上傳類
$upload->maxSize = 3145728 ;// 設置附件上傳大小
$upload->allowExts = array('jpg', 'gif', 'png', 'jpeg');// 設置附件上傳類型
$upload->savePath = './Public/Uploads/';// 設置附件上傳目錄
if(!$upload->upload()) {// 上傳錯誤提示錯誤信息
$this->error($upload->getErrorMsg());
}else{// 上傳成功
$this->success('上傳成功!');
}
}
系統提供的文件上傳類對圖片文件的上傳安全做了支持,如果企圖上傳非法的圖像文件,系統會提示“非法圖像文件”。
參數設置
要使用上傳功能,首先第一步就是實例化上傳類:
import('ORG.Net.UploadFile');
$upload = new UploadFile();// 實例化上傳類
接下來,就是設置上傳屬性(參數),支持的上傳參數有:
maxSize | 文件上傳的最大文件大小(以字節為單位)默認為-1 不限大小 |
savePath | 文件保存路徑(必須) |
saveRule | 上傳文件的保存規則,必須是一個無需任何參數的函數名,例如可以是 time、 uniqid com_create_guid 等,但必須能保證生成的文件名是唯一的,默認是uniqid |
hashType | 上傳文件的哈希驗證方法,默認是md5_file |
autoCheck | 是否自動檢測附件,默認為自動檢測 |
uploadReplace | 存在同名文件是否是覆蓋 |
allowExts | 允許上傳的文件后綴(留空為不限制),使用數組設置,默認為空數組 |
allowTypes | 允許上傳的文件類型(留空為不限制),使用數組設置,默認為空數組 |
thumb | 是否需要對圖片文件進行縮略圖處理,默認為false |
thumbMaxWidth | 縮略圖的最大寬度,多個使用逗號分隔 |
thumbMaxHeight | 縮略圖的最大高度,多個使用逗號分隔 |
thumbPrefix | 縮略圖的文件前綴,默認為thumb_ |
thumbSuffix | 縮略圖的文件后綴,默認為空 |
thumbPath | 縮略圖的保存路徑,留空的話取文件上傳目錄本身 |
thumbFile | 指定縮略圖的文件名 |
thumbExt | 指定縮略圖的擴展名 |
thumbRemoveOrigin | 生成縮略圖后是否刪除原圖 |
autoSub | 是否使用子目錄保存上傳文件 |
subType | 子目錄創建方式,默認為hash,可以設置為hash、date或者custom |
subDir | 子目錄名稱 subType為custom方式后有效 |
dateFormat | 子目錄方式為date的時候指定日期格式 |
hashLevel | 子目錄保存的層次,默認為一層 |
上傳參數的設置方法如下:
//設置附件上傳目錄
$upload->savePath = './Uploads/';
//設置需要生成縮略圖,僅對圖像文件有效
$upload->thumb = true;
//設置需要生成縮略圖的文件后綴
$upload->thumbPrefix = 'm_,s_'; //生產2張縮略圖
//設置縮略圖最大寬度
$upload->thumbMaxWidth = '200,50';
//設置縮略圖最大高度
$upload->thumbMaxHeight = '200,50';
另外一種方式是,在實例化的同時傳入上傳參數,例如:
import('ORG.Net.UploadFile');
$config['savePath'] = './Uploads/';
$config['thumb'] = true;
$config['thumbPrefix'] = 'm_,s_';
$config['thumbMaxWidth'] = '200,50';
$config['thumbMaxHeight'] = '200,50';
$upload = new UploadFile($config);// 實例化上傳類并傳入參數
無論采用何種方式,設置好上傳的參數后,就可以調用UploadFile類的upload方法進行附件上傳,如果失敗,返回false,并且用
getErrorMsg方法獲取錯誤提示信息;如果上傳成功,可以通過調用
getUploadFileInfo方法獲取成功上傳的附件信息列表。getUploadFileInfo方法的返回值是一個二維數組,其中的每個元素就是上傳的附件信息。每個附件信息又是一個記錄了下面信息的數組,包括:
key | 附件上傳的表單名稱 |
savepath | 上傳文件的保存路徑 |
name | 上傳文件的原始名稱 |
savename | 上傳文件的保存名稱 |
size | 上傳文件的大小 |
type | 上傳文件的MIME類型 |
extension | 上傳文件的后綴類型 |
hash | 上傳文件的哈希驗證字符串 |
文件上傳成功后,就可以通過這些附件信息來進行其他的數據存取操作,例如保存到當前數據表或者單獨的附件數據表都可以。
例如,下面表示把上傳信息保存到數據表的字段:
//取得成功上傳的文件信息
$info = $upload->getUploadFileInfo();
$model = M('Photo');
//保存當前數據對象
$data['image'] = $info[0]['savename'];
$data['create_time'] = NOW_TIME;
$model->add($data);
官網示例中的圖像上傳示例可以查看上傳和顯示效果:

多文件上傳
上傳類默認就支持多文件上傳,只需要修改表單頁面:
如果需要使用多個文件上傳,只需要修改表單,把
<input type='file' name='image'>
改為
<input type='file' name='image1'>
<input type='file' name='image2'>
<input type='file' name='image3'>
或者
<input type='file' name='image[]'>
<input type='file' name='image[]'>
<input type='file' name='image[]'>
兩種方式的多附件上傳表單文件上傳類都可以自動識別。
上傳成功后,還是使用getUploadFileInfo方法獲取成功上傳的附件信息。
單個上傳
上傳類還提供了單個上傳的方法
import("ORG.Net.UploadFile");
$upload = new UploadFile();
foreach ($_FILES as $key=>$file){
if(!empty($file['name'])) {
$upload->autoSub = true;
$upload->subType = 'date';
$info = $upload->uploadOne($file);
if($info){ // 保存附件信息
M('Photo')->add($info);
}else{ // 上傳錯誤
$this->error($upload->getErrorMsg());
}
}
}
uploadOne方法表示每次執行只上傳指定的一個文件,并且如果上傳成功的話uploadOne方法的返回值就是成功上傳的文件信息,和getUploadFileInfo方法不同的是,這個文件信息是一個僅包含單個文件信息的一維數組。如果發生錯誤,依然是通過getErrorMsg方法獲取錯誤信息。
上傳文件的命名規范
上傳文件的命名規范用于確保文件不會產生沖突或者覆蓋的情況。而命名規范的定義又需要根據你的業務邏輯來調整,不是固定的。例如,如果你采用時間戳的方式來定義命名規范,那么在同時上傳多個文件的時候可能產生沖突(因為同一秒內可以上傳多個文件),因此你需要根據你的業務需求來設置合適的上傳命名規則。這里順便來說下saveRule參數的具體用法。
一、采用函數方式
如果傳入的字符串是一個函數名,那么表示采用函數動態生成上傳文件名(不包括文件后綴),例如:
$upload->saveRule = 'time'; // 采用時間戳命名
$upload->saveRule = 'com_create_guid'; // 采用GUID序列命名
也可以采用用戶自定義函數:
$upload->saveRule = 'myfun'; // 采用自定義函數命名
二、直接設置上傳文件名
如果傳入的參數不是一個函數名,那么就會直接當做是上傳文件名,例如:
$upload->saveRule = time().'_'.mt_rand();
三、保持上傳文件名不變
如果你想保持上傳的文件名不變,那么只需要設置命名規范為空即可,例如:
$upload->saveRule = '';
一般來說不建議保持不變,因為會導致相同的文件名上傳后被覆蓋的情況。
子目錄保存
saveRule只是用于設置文件的保存規則,不涉及到目錄,如果希望采用子目錄保存上傳文件,可以使用下面的三種方式設置子目錄:
一、哈希子目錄$upload->subType = 'hash';
$upload->hashLevel = 2;
設置后,會自動對上傳文件進行哈希編碼后的第一個和第二個字母分別作為一級和二級子目錄名稱保存。如果hashLevel不設置,則默認為一級子目錄。
二、日期子目錄這種方式也比較常用,用日期作為子目錄名稱,
$upload->subType = 'date';
$upload->dateFormat = 'Y-m-d';
dateFormat參數則用于配合設置日期的格式,如果不設置,則默認為Ymd。
三、自定義子目錄這種方式作為一種更靈活的子目錄保存方式,是最新添加的功能支持。
$upload->subType = 'custom';
$upload->subDir = get_user_id();
自定義子目錄方式的優勢在于,可以動態設置子目錄名稱,上面的定義就采用了當前用戶ID作為子目錄名稱。
生成縮略圖
縮略圖功能需要Image擴展類的支持,所以確保你已經有了這個擴展類。
然后設置如下參數:
//設置需要生成縮略圖,僅對圖像文件有效
$upload->thumb = true;
//設置需要生成縮略圖的文件前綴
$upload->thumbPrefix = 'm_,s_'; //生產2張縮略圖
//設置縮略圖最大寬度
$upload->thumbMaxWidth = '200,50';
//設置縮略圖最大高度
$upload->thumbMaxHeight = '200,50';
//設置生成縮略圖后移除原圖
$upload->thumbRemoveOrigin = true;
縮略圖的前(后)綴數量必須和寬度數量對應,表示生成多個縮略圖。
生成的縮略圖默認位于保存文件的實際所在目錄(包括子目錄的情況),當然你也可以指定統一的縮略圖保存路徑,例如:
$upload->thumbPath = './Uploads/thumb/';
這里的thumbPath參數必須用“/”結尾。
我們可以設置縮略圖采用統一的文件后綴,例如:
// 設置縮略圖的固定后綴
$upload->thumbExt = 'jpg';
更多的上傳類用法可以通過上傳參數的設置來完成,留給大家慢慢挖掘了。