上傳概述
上傳類使用ORG類庫包中的Net.UpdateFile類,ThinkPHP內置的Action操作里面(主要是insert和update操作,其他操作可以相應實現)實現了自動識別是否存在文件上傳,如果存在會自動進行處理。
而上傳類要做的僅僅是文件上傳的過程,其他功能需要依賴系統類庫或者相應類庫。系統對文件上傳設置了很多靈活的參數以便進行更細致的控制。下面我們通過幾種常用的例子分別來描述下如何使用UploadFile類。目前ThinkPHP0.9.5版本的上傳類包含的功能如下(有些功能需要結合 ThinkPHP系統其他類庫):
1、基本上傳功能
2、批量上傳
3、Ajax方式上傳
4、自動生成圖片縮略圖
5、自定義參數上傳
基本上傳功能
基本上,在ThinkPHP中簡單的上傳功能無需進行特別處理,而全部有內置操作實現了。要做的僅僅是在表單中添加文件上傳框和設置 enctype="multipart/form-data"屬性即可。當然,這和框架的架構和數據結構有關,因為ThinkPHP的上傳數據表是單獨的,上傳文件數據表中有兩個關鍵的用於記錄對應數據的字段:module和recordId,其實module也就是某個數據表,而recordId也就是該數據表對應的數據ID。在其他任何需要上傳的數據表中可以方便地查詢到屬於自己的附件列表,就是采用這種機制和結構,令得ThinkPHP的上傳變得簡化了。
下面就是實現代碼:
<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上傳類支持多文件上傳,而這些僅僅是在客戶端增加多個文件上傳框而已,后台會自動獲取所有的文件上傳,並一一進行上傳和保存數據操作,並且過濾無效的上傳。批量上傳的一個例子:
假設用戶往自己的圖片庫里面添加多個圖片
<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實現方式),而你要做的僅僅是添加下面代碼:
<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文件上傳的信息返回提供支持。
例如,第一個例子上傳后希望更新照片,使用下面的方法定義:
$('photo').innerHTML = '<IMG SRC="__PUBLIC__/Images/user/' + name + '" class="shadow" BORDER="0" ALT="" align="left">';
}
下面的示例是AJAX文件上傳的實現畫面,左邊圖片會上傳成功后自動更新。
自動生成縮略圖
如果希望在上傳過程自動為圖片文件生成縮略圖,ThinkPHP的UploadFile類也可以輕松實現,而且不需要你多特殊添加縮略圖處理代碼。要做的也僅僅是在客戶端添加如下參數:
<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社區上傳頭像的部分縮略圖代碼:
<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方法。
<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}">