上传类使用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的上传变得简化了。
下面就是实现代码:
- <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类也可以轻松实现,而且不需要你多特殊添加缩略图处理代码。要做的也仅仅是在客户端添加如下参数:
- // 设置是否需要生成图片缩略图,仅对图片上传有效
- <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="_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方法。
- // 设置覆盖方式上传
- <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}">
ThinkPHP内置了一个文件上传类,位于ORG类库包中的Net.UpdateFile类。最新版本的上传类包含的功能如下:批量上传、自动生成图片缩略图、上传检测、支持覆盖方式上传、支持上传类型、附件大小、上传路径定义、支持上传文件命名规则、支持对上传文件的Hash规则、根据日期或者哈希自动创建子目录。
[ 属性 ]
UploadFile类有很多有用的属性,可以非常灵活的进行设置。
maxSize 上传文件的最大值
allowExts 允许上传的文件后缀(使用数组定义)留空为不作检查
allowTypes 允许上传的文件类型(使用数组定义)留空为不作检查
thumb 是否对上传图片进行缩略图处理
thumbPath 缩略图保存路径
thumbMaxWidth 缩略图最大宽度
thumbMaxHeight 缩略图最大高度
thumbPrefix 缩略图命名前缀
thumbSuffix 缩略图命名后缀 默认为 _thumb
autoSub 是否启用子目录保存
subType 子目录创建方式 目前可以支持hash和date
dateFormat 日期格式的上传子目录创建格式 当subType=date 时有效 默认值Ymd
savePath 上传文件的保存路径
autoCheck 是否自动检查上传文件
uploadReplace 存在同名文件是否覆盖
saveRule 上传文件命名规则 留空则使用原来文件名保存
hashType 上传文件的哈希类型
[ 方法 ]
UploadFile类
upload($savePath='') 上传操作方法
getUploadFileInfo() 获取上传成功的文件信息
getErrorMsg() 获取最近一次的错误信息
PHP代码
import( "ORG.Net.UploadFile" );
$upload = new UploadFile();
//设置上传文件大小
$upload ->maxSize = 32922 ;
//设置上传文件类型
$upload ->allowExts = explode ( ',' , 'doc,rar,txt' );
//设置附件上传目录
$upload ->savePath = '../Public/Uploads/' ;
//执行上传操作
if (! $upload ->upload()) {
//捕获上传异常
$this ->error( $upload ->getErrorMsg());
} else {
$this ->success( '文件上传成功!' );
}