多多色-多人伦交性欧美在线观看-多人伦精品一区二区三区视频-多色视频-免费黄色视屏网站-免费黄色在线

國內(nèi)最全IT社區(qū)平臺 聯(lián)系我們 | 收藏本站
阿里云優(yōu)惠2
您當(dāng)前位置:首頁 > php框架 > ThinkPHP > ThinkPHP3.1快速入門(19)文件上傳

ThinkPHP3.1快速入門(19)文件上傳

來源:程序員人生   發(fā)布時間:2013-12-08 16:56:56 閱讀次數(shù):7226次

獲取上傳類

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è)置來完成,留給大家慢慢挖掘了。
生活不易,碼農(nóng)辛苦
如果您覺得本網(wǎng)站對您的學(xué)習(xí)有所幫助,可以手機掃描二維碼進行捐贈
程序員人生
------分隔線----------------------------
分享到:
------分隔線----------------------------
關(guān)閉
程序員人生
主站蜘蛛池模板: 伊人久久成人爱综合网 | 国产精品久久久久激情影院 | 免费爱爱网 | 波多野结衣视频在线免费观看 | 国产福利一区二区精品视频 | 亚洲图片在线欧美专区图片 | 综合亚洲欧美日韩一区二区 | 一级毛片在线完整免费观看 | 久久国产高清一区二区三区 | 夜夜影院未满十八勿进 | 666永久视频在线 | 最近中文字幕1视频 | 激情影院在线视频永久观看 | 亚洲欧美色一区二区三区 | 一本之道 | 手机在线看片国产日韩生活片 | 欧美激情观看一区二区久久 | 亚洲a级黄色 | 亚洲欧美另类日本久久影院 | 最近中文字幕完整视频大全版 | 国产高清一级毛片在线不卡 | 手机看片日韩福利 | 久草免费网站 | 一区二区高清视频在线观看 | 色视频在线播放 | 最近最新中文字幕免费大全3 | 久久精品一品道久久精品9 久久精品一区二区 | 欧美极品xxx| 国产欧美中文字幕 | h视频免费观看 | 中文字幕乱码无限2021丫丫 | 亚洲综合在线视频 | 欧美特级一级毛片 | 国产精品人成 | 国产精品国产三级在线高清观看 | 中文在线视频 | 91成年人免费视频 | 激情春色网 | 大香伊蕉在人线国产75视频 | 日本一区二区三区四区无限 | 致命坏男人漫画登录页面免费漫画第三话 |