THINKPHP中上傳文件類的使用方法(二種方法)

上傳概述
上傳類使用ORG類庫包中的Net.UpdateFile類,ThinkPHP內置的Action操做裏面(主要是insert和update操做,其餘操做能夠相應實現)實現了自動識別是否存在文件上傳,若是存在會自動進行處理。
而上傳類要作的僅僅是文件上傳的過程,其餘功能須要依賴系統類庫或者相應類庫。系統對文件上傳設置了不少靈活的參數以便進行更細緻的控制。下面咱們經過幾種經常使用的例子分別來描述下如何使用UploadFile類。目前ThinkPHP0.9.5版本的上傳類包含的功能以下(有些功能須要結合 ThinkPHP系統其餘類庫):
一、基本上傳功能
二、批量上傳
三、Ajax方式上傳
四、自動生成圖片縮略圖
五、自定義參數上傳

基本上傳功能
基本上,在ThinkPHP中簡單的上傳功能無需進行特別處理,而所有有內置操做實現了。要作的僅僅是在表單中添加文件上傳框和設置 enctype="multipart/form-data"屬性便可。固然,這和框架的架構和數據結構有關,由於ThinkPHP的上傳數據表是單獨的,上傳文件數據表中有兩個關鍵的用於記錄對應數據的字段:module和recordId,其實module也就是某個數據表,而recordId也就是該數據表對應的數據ID。在其餘任何須要上傳的數據表中能夠方便地查詢到屬於本身的附件列表,就是採用這種機制和結構,令得ThinkPHP的上傳變得簡化了。
下面就是實現代碼:ajax

<form METHOD=POST action="__URL__/action/" enctype="multipart/form-data" >
<INPUT TYPE="text" NAME="name" > INPUT TYPE="text" NAME="email" >
<INPUT TYPE="file" name="photo" > INPUT TYPE="submit" value="保 存" >
</form>
複製代碼


上面的表單,在保存用戶數據的同時包括了一個照片文件上傳,使用普通方式提交到後臺後,系統自動會把用戶數據保存在用戶數據表中,而把上傳的文件保存到附件數據表,並記錄了對應的用戶數據表的名稱和編號。下次取得數據的時候,使用下面的方式獲取屬於該記錄的附件列表:數據結構

//讀取附件信息
$attachDao = D('AttachDao');
$attachs = $attachDao->findAll("module='User' and recordId='$id'");
//模板變量賦值
$this->assign("attach",$attachs);
複製代碼


批量上傳
ThinkPHP上傳類支持多文件上傳,而這些僅僅是在客戶端增長多個文件上傳框而已,後臺會自動獲取全部的文件上傳,並一一進行上傳和保存數據操做,而且過濾無效的上傳。批量上傳的一個例子:
假設用戶往本身的圖片庫裏面添加多個圖片架構

<form METHOD=POST action="__URL__/action/" enctype="multipart/form-data" >
<INPUT TYPE="file" name="photo1" > INPUT TYPE="file" name="photo2" >
<INPUT TYPE="file" name="photo3" > INPUT TYPE="submit" value="上傳圖片" >
</form>
複製代碼

須要注意,UploadFile上傳類對多文件上傳並非採用
<INPUT TYPE="file" name="photo[]" >
方式,注意區別兩種方式的不一樣。
上傳文件的個數並沒有限制,ThinkPHP管理後臺還實現了一個動態增長文件上傳的功能。經過該方式能夠方便地進行多文件批量上傳。

Ajax文件上傳
經過簡單的參數設置就能夠把文件上傳改裝成AJAX方式(Iframe實現方式),而你要作的僅僅是添加下面代碼:框架

<iframe name="ajaxUpload" src="" frameborder="0" SCROLLING="no" style="display:none"></iframe>
<INPUT TYPE="hidden" name="_AJAX_SUBMIT_" value="1">
< INPUT TYPE="hidden" name="_uploadFormId" value="upload">
<INPUT TYPE="hidden" name="_uploadFileResult" value="result">
< INPUT TYPE="hidden" name="_uploadResponse" value="uploadComplete">
複製代碼


_uploadFormId用於設置上傳表單id,用於在上傳成功後重置表單,避免重複上傳。在_uploadFileResult變量中設置返回提示的層id,在_uploadResponse參數中設置文件上傳返回數據的處理方法。該方法返回兩個參數:id和name,若是有多文件上傳,使用逗號分割多個返回值。ThinkPHP框架的Action類中的ajaxUploadResult方法對Ajax文件上傳的信息返回提供支持。
例如,第一個例子上傳後但願更新照片,使用下面的方法定義:函數

function uploadComplete(id,name){
           $('photo').innerHTML = '<IMG SRC="__PUBLIC__/Images/user/' + name + '" class="shadow" BORDER="0" ALT="" align="left">';
}
複製代碼


下面的示例是AJAX文件上傳的實現畫面,左邊圖片會上傳成功後自動更新。

自動生成縮略圖
若是但願在上傳過程自動爲圖片文件生成縮略圖,ThinkPHP的UploadFile類也能夠輕鬆實現,並且不須要你多特殊添加縮略圖處理代碼。要作的也僅僅是在客戶端添加以下參數:ui

// 設置是否須要生成圖片縮略圖,僅對圖片上傳有效
<INPUT TYPE="hidden" name="_uploadImgThumb" value="1"> // 生成縮略圖的最大寬度
<INPUT TYPE="hidden" name="_uploadThumbMaxWidth" value="45"> // 生成縮略圖的最大高度
<INPUT TYPE="hidden" name="_uploadThumbMaxHeight" value="45">
複製代碼

 

設置後系統在上傳後會自動生成相同格式的縮略圖。系統默認的縮略圖路徑是上傳文件所在目錄,而且在文件中後面添加_thumb以標識縮略圖文件。縮略圖路徑能夠在項目配置文件中配置。

生成多縮略圖
ThinkPHP支持對上傳的圖片生成多縮略圖,TOPThink社區的頭像功能就是多縮略圖功能的例子,使用起來也很是簡單。下面的代碼是TOPThink社區上傳頭像的部分縮略圖代碼:this

<INPUT TYPE="hidden" name="_uploadImgThumb" value="1">
<INPUT TYPE="hidden" name="_uploadThumbSuffix" value="_big,_small,_min">
<INPUT TYPE="hidden" name="_uploadThumbMaxWidth" value="75,32,16">
<INPUT TYPE="hidden" name="_uploadThumbMaxHeight" value="75,32,16">
複製代碼

 

上面的例子表示生成三個大小的縮略圖,並規定了縮略圖文件名後面添加的後綴,和三種縮略圖的寬高尺寸。

更多上傳設置
ThinkPHP在Action來中還提供了和UploadFile類的上傳設置接口,方便在客戶端進行更多的參數設置進行上傳控制。
下面列舉下主要的參數,更多的參數能夠參考框架的Action類中的_upload方法。orm

// 設置覆蓋方式上傳 <INPUT TYPE="hidden" name="_uploadReplace" value="1"> // 設置容許上傳文件類型 <INPUT TYPE="hidden" name="_uploadFileType" value="jpg,gif,png,swf" > // 上傳文件保存目錄,要注意設置可寫權限 <INPUT TYPE="hidden" name="_uploadSavePath" value="/Public/Images/user/" > // 上傳文件名命名規則,支持函數,例如time uniqid com_create_guid 系統默認設置爲uniqid保證上傳文件名不會重複,若是不存在設置函數,則使用規則字符串做爲上傳文件名 <INPUT TYPE="hidden" name="_uploadSaveRule" value="time"> // 設置上傳文件大小 <INPUT TYPE="hidden" name="_uploadFileSize" value="20480" > // 設置上傳數據表,默認的上傳數據記錄在當前模塊表中 <INPUT TYPE="hidden" name="_uploadFileTable" value="user"> // 設置上傳文件對應的數據編號,一般不用設置,除非特別須要 <INPUT TYPE="hidden" name="_uploadRecordId" value=""> // 設置上傳用戶id,一般不用設置,系統自動獲取當前登陸用戶編號 <INPUT TYPE="hidden" name="_uploadUserId" value="{$user.id}">
相關文章
相關標籤/搜索