獲取上傳類
ThinkPHP的擴展中提供了文件上傳類庫UploadFile,可以在在http://www.thinkphp.cn/extend/224.html下載,或者下載官方的完整擴展包(http://www.thinkphp.cn/down/253.html)里面也已經(jīng)包含上傳擴展類了。如果是單獨下載的上傳類庫,把解壓后的UploadFile.class.php 放入ThinkPHP/Extend/Library/ORG/Net/(如果沒有請手動創(chuàng)建)目錄下面。
最新版本的上傳類包含的功能如下(有些功能需要結(jié)合ThinkPHP系統(tǒng)其他類庫):
-
基本上傳功能
-
支持批量上傳
-
支持生成圖片縮略圖
-
自定義參數(shù)上傳
-
上傳檢測(包括大小、后綴和類型)
-
支持覆蓋方式上傳
-
支持上傳類型、附件大小、上傳路徑定義
-
支持哈希或者日期子目錄保存上傳文件
-
支持動態(tài)定義子目錄保存文件
-
上傳圖片的安全性檢測
-
支持上傳文件命名規(guī)則
-
支持對上傳文件的Hash驗證
如果你需要使用上傳圖片生成縮略圖功能的話,還需要下載圖像處理擴展類http://www.thinkphp.cn/extend/225.html,解壓后的Image.class.php放入ThinkPHP/Extend/Library/ORG/Util/目錄下面。
上傳表單
上傳表單無需特別處理,下面是一個最簡單的單文件上傳表單:
注意,表單必須添加
enctype="multipart/form-data"屬性才能支持文件上傳功能。
上傳操作
接下來就是定義上傳操作了,我們在Action控制器中添加upload操作方法如下:
// 文件上傳
public function upload() {
import('ORG.Net.UploadFile');
$upload = new UploadFile();// 實例化上傳類
$upload->maxSize = 3145728 ;// 設(shè)置附件上傳大小
$upload->allowExts = array('jpg', 'gif', 'png', 'jpeg');// 設(shè)置附件上傳類型
$upload->savePath = './Public/Uploads/';// 設(shè)置附件上傳目錄
if(!$upload->upload()) {// 上傳錯誤提示錯誤信息
$this->error($upload->getErrorMsg());
}else{// 上傳成功
$this->success('上傳成功!');
}
}
系統(tǒng)提供的文件上傳類對圖片文件的上傳安全做了支持,如果企圖上傳非法的圖像文件,系統(tǒng)會提示“非法圖像文件”。
參數(shù)設(shè)置
要使用上傳功能,首先第一步就是實例化上傳類:
import('ORG.Net.UploadFile');
$upload = new UploadFile();// 實例化上傳類
接下來,就是設(shè)置上傳屬性(參數(shù)),支持的上傳參數(shù)有:
maxSize
|
文件上傳的最大文件大小(以字節(jié)為單位)默認為-1 不限大小
|
savePath
|
文件保存路徑(必須)
|
saveRule
|
上傳文件的保存規(guī)則,必須是一個無需任何參數(shù)的函數(shù)名,例如可以是 time、 uniqid com_create_guid 等,但必須能保證生成的文件名是唯一的,默認是uniqid
|
hashType
|
上傳文件的哈希驗證方法,默認是md5_file
|
autoCheck
|
是否自動檢測附件,默認為自動檢測
|
uploadReplace
|
存在同名文件是否是覆蓋
|
allowExts
|
允許上傳的文件后綴(留空為不限制),使用數(shù)組設(shè)置,默認為空數(shù)組
|
allowTypes
|
允許上傳的文件類型(留空為不限制),使用數(shù)組設(shè)置,默認為空數(shù)組
|
thumb
|
是否需要對圖片文件進行縮略圖處理,默認為false
|
thumbMaxWidth
|
縮略圖的最大寬度,多個使用逗號分隔
|
thumbMaxHeight
|
縮略圖的最大高度,多個使用逗號分隔
|
thumbPrefix
|
縮略圖的文件前綴,默認為thumb_
|
thumbSuffix
|
縮略圖的文件后綴,默認為空
|
thumbPath
|
縮略圖的保存路徑,留空的話取文件上傳目錄本身
|
thumbFile
|
指定縮略圖的文件名
|
thumbExt
|
指定縮略圖的擴展名
|
thumbRemoveOrigin
|
生成縮略圖后是否刪除原圖
|
autoSub
|
是否使用子目錄保存上傳文件
|
subType
|
子目錄創(chuàng)建方式,默認為hash,可以設(shè)置為hash、date或者custom
|
subDir
|
子目錄名稱 subType為custom方式后有效
|
dateFormat
|
子目錄方式為date的時候指定日期格式
|
hashLevel
|
子目錄保存的層次,默認為一層
|
上傳參數(shù)的設(shè)置方法如下:
//設(shè)置附件上傳目錄
$upload->savePath = './Uploads/';
//設(shè)置需要生成縮略圖,僅對圖像文件有效
$upload->thumb = true;
//設(shè)置需要生成縮略圖的文件后綴
$upload->thumbPrefix = 'm_,s_'; //生產(chǎn)2張縮略圖
//設(shè)置縮略圖最大寬度
$upload->thumbMaxWidth = '200,50';
//設(shè)置縮略圖最大高度
$upload->thumbMaxHeight = '200,50';
另外一種方式是,在實例化的同時傳入上傳參數(shù),例如:
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);// 實例化上傳類并傳入?yún)?shù)
無論采用何種方式,設(shè)置好上傳的參數(shù)后,就可以調(diào)用UploadFile類的upload方法進行附件上傳,如果失敗,返回false,并且用
getErrorMsg方法獲取錯誤提示信息;如果上傳成功,可以通過調(diào)用
getUploadFileInfo方法獲取成功上傳的附件信息列表。getUploadFileInfo方法的返回值是一個二維數(shù)組,其中的每個元素就是上傳的附件信息。每個附件信息又是一個記錄了下面信息的數(shù)組,包括:
key
|
附件上傳的表單名稱
|
savepath
|
上傳文件的保存路徑
|
name
|
上傳文件的原始名稱
|
savename
|
上傳文件的保存名稱
|
size
|
上傳文件的大小
|
type
|
上傳文件的MIME類型
|
extension
|
上傳文件的后綴類型
|
hash
|
上傳文件的哈希驗證字符串
|
文件上傳成功后,就可以通過這些附件信息來進行其他的數(shù)據(jù)存取操作,例如保存到當(dāng)前數(shù)據(jù)表或者單獨的附件數(shù)據(jù)表都可以。
例如,下面表示把上傳信息保存到數(shù)據(jù)表的字段:
//取得成功上傳的文件信息
$info = $upload->getUploadFileInfo();
$model = M('Photo');
//保存當(dāng)前數(shù)據(jù)對象
$data['image'] = $info[0]['savename'];
$data['create_time'] = NOW_TIME;
$model->add($data);
官網(wǎng)示例中的圖像上傳示例可以查看上傳和顯示效果:
多文件上傳
上傳類默認就支持多文件上傳,只需要修改表單頁面:
如果需要使用多個文件上傳,只需要修改表單,把
改為
或者
兩種方式的多附件上傳表單文件上傳類都可以自動識別。
上傳成功后,還是使用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方法表示每次執(zhí)行只上傳指定的一個文件,并且如果上傳成功的話uploadOne方法的返回值就是成功上傳的文件信息,和getUploadFileInfo方法不同的是,這個文件信息是一個僅包含單個文件信息的一維數(shù)組。如果發(fā)生錯誤,依然是通過getErrorMsg方法獲取錯誤信息。
上傳文件的命名規(guī)范
上傳文件的命名規(guī)范用于確保文件不會產(chǎn)生沖突或者覆蓋的情況。而命名規(guī)范的定義又需要根據(jù)你的業(yè)務(wù)邏輯來調(diào)整,不是固定的。例如,如果你采用時間戳的方式來定義命名規(guī)范,那么在同時上傳多個文件的時候可能產(chǎn)生沖突(因為同一秒內(nèi)可以上傳多個文件),因此你需要根據(jù)你的業(yè)務(wù)需求來設(shè)置合適的上傳命名規(guī)則。這里順便來說下saveRule參數(shù)的具體用法。
一、采用函數(shù)方式
如果傳入的字符串是一個函數(shù)名,那么表示采用函數(shù)動態(tài)生成上傳文件名(不包括文件后綴),例如:
$upload->saveRule = 'time'; // 采用時間戳命名
$upload->saveRule = 'com_create_guid'; // 采用GUID序列命名
也可以采用用戶自定義函數(shù):
$upload->saveRule = 'myfun'; // 采用自定義函數(shù)命名
二、直接設(shè)置上傳文件名
如果傳入的參數(shù)不是一個函數(shù)名,那么就會直接當(dāng)做是上傳文件名,例如:
$upload->saveRule = time().'_'.mt_rand();
三、保持上傳文件名不變
如果你想保持上傳的文件名不變,那么只需要設(shè)置命名規(guī)范為空即可,例如:
$upload->saveRule = '';
一般來說不建議保持不變,因為會導(dǎo)致相同的文件名上傳后被覆蓋的情況。
子目錄保存
saveRule只是用于設(shè)置文件的保存規(guī)則,不涉及到目錄,如果希望采用子目錄保存上傳文件,可以使用下面的三種方式設(shè)置子目錄:
一、哈希子目錄
$upload->subType = 'hash';
$upload->hashLevel = 2;
設(shè)置后,會自動對上傳文件進行哈希編碼后的第一個和第二個字母分別作為一級和二級子目錄名稱保存。如果hashLevel不設(shè)置,則默認為一級子目錄。
二、日期子目錄
這種方式也比較常用,用日期作為子目錄名稱,
$upload->subType = 'date';
$upload->dateFormat = 'Y-m-d';
dateFormat參數(shù)則用于配合設(shè)置日期的格式,如果不設(shè)置,則默認為Ymd。
三、自定義子目錄
這種方式作為一種更靈活的子目錄保存方式,是最新添加的功能支持。
$upload->subType = 'custom';
$upload->subDir = get_user_id();
自定義子目錄方式的優(yōu)勢在于,可以動態(tài)設(shè)置子目錄名稱,上面的定義就采用了當(dāng)前用戶ID作為子目錄名稱。
生成縮略圖
縮略圖功能需要Image擴展類的支持,所以確保你已經(jīng)有了這個擴展類。
然后設(shè)置如下參數(shù):
//設(shè)置需要生成縮略圖,僅對圖像文件有效
$upload->thumb = true;
//設(shè)置需要生成縮略圖的文件前綴
$upload->thumbPrefix = 'm_,s_'; //生產(chǎn)2張縮略圖
//設(shè)置縮略圖最大寬度
$upload->thumbMaxWidth = '200,50';
//設(shè)置縮略圖最大高度
$upload->thumbMaxHeight = '200,50';
//設(shè)置生成縮略圖后移除原圖
$upload->thumbRemoveOrigin = true;
縮略圖的前(后)綴數(shù)量必須和寬度數(shù)量對應(yīng),表示生成多個縮略圖。
生成的縮略圖默認位于保存文件的實際所在目錄(包括子目錄的情況),當(dāng)然你也可以指定統(tǒng)一的縮略圖保存路徑,例如:
$upload->thumbPath = './Uploads/thumb/';
這里的thumbPath參數(shù)必須用“/”結(jié)尾。
我們可以設(shè)置縮略圖采用統(tǒng)一的文件后綴,例如:
// 設(shè)置縮略圖的固定后綴
$upload->thumbExt = 'jpg';
更多的上傳類用法可以通過上傳參數(shù)的設(shè)置來完成,留給大家慢慢挖掘了。