1、上传概述上传类使用 ORG 类库包中的 Net.UpdateFile 类,ThinkPHP 内置的 Action 操作里面(主要是 insert 和 update 操作,其他操作可以相应实现)实现了自动识别是否存在文件上传,如果存在会自动进行处理。而上传类要做的仅仅是文件上传的过程,其他功能需要依赖系统类库或者相应类库。系统对文件上传设置了很多灵活的参数以便进行更细致的控制。下面我们通过几种常用的例子分别来描述下如何使用 UploadFile 类。目前 ThinkPHP0.9.5 版本的上传类包含的功能如下(有些功能需要结合 ThinkPHP 系统其他类库):1、基本上传功能2、批量上传3、A
2、jax 方式上传4、自动生成图片缩略图5、自定义参数上传基本上传功能基本上,在 ThinkPHP 中简单的上传功能无需进行特别处理,而全部有内置操作实现了。要做的仅仅是在表单中添加文件上传框和设置 enctype=“multipart/form-data“属性即可。当然,这和框架的架构和数据结构有关,因为 ThinkPHP 的上传数据表是单独的,上传文件数据表中有两个关键的用于记录对应数据的字段:module 和 recordId,其实 module 也就是某个数据表,而 recordId 也就是该数据表对应的数据 ID。在其他任何需要上传的数据表中可以方便地查询到属于自己的附件列表,就是采用
3、这种机制和结构,令得 ThinkPHP 的上传变得简化了。下面就是实现代码: 1. 2. INPUT TYPE=“text“ NAME=“email“ 3. INPUT TYPE=“submit“ value=“保 存“ 4. 复制代码上面的表单,在保存用户数据的同时包括了一个照片文件上传,使用普通方式提交到后台后,系统自动会把用户数据保存在用户数据表中,而把上传的文件保存到附件数据表,并记录了对应的用户数据表的名称和编号。下次取得数据的时候,使用下面的方式获取属于该记录的附件列表: 1. /读取附件信息 2. $attachDao = D(AttachDao); 3. $attachs =
4、$attachDao-findAll(“module=User and recordId=$id“);4. /模板变量赋值5. $this-assign(“attach“,$attachs); 复制代码批量上传ThinkPHP 上传类支持多文件上传,而这些仅仅是在客户端增加多个文件上传框而已,后台会自动获取所有的文件上传,并一一进行上传和保存数据操作,并且过滤无效的上传。批量上传的一个例子:假设用户往自己的图片库里面添加多个图片 1. 2. INPUT TYPE=“file“ name=“photo2“ 3. INPUT TYPE=“submit“ value=“上传图片“ 4. 复制代码需要
5、注意,UploadFile 上传类对多文件上传并不是采用 方式,注意区别两种方式的不同。上传文件的个数并无限制,ThinkPHP 管理后台还实现了一个动态增加文件上传的功能。通过该方式可以方便地进行多文件批量上传。 Ajax 文件上传通过简单的参数设置就可以把文件上传改装成 AJAX 方式(Iframe 实现方式),而你要做的仅仅是添加下面代码: 1. 2. 3. 4. 5. 复制代码_uploadFormId 用于设置上传表单 id,用于在上传成功后重置表单,避免重复上传。在_uploadFileResult 变量中设置返回提示的层 id,在_uploadResponse 参数中设置文件上传
6、返回数据的处理方法。该方法返回两个参数:id 和 name,如果有多文件上传,使用逗号分割多个返回值。ThinkPHP 框架的 Action 类中的 ajaxUploadResult 方法对 Ajax 文件上传的信息返回提供支持。例如,第一个例子上传后希望更新照片,使用下面的方法定义: 1. function uploadComplete(id,name) 2. $(photo).innerHTML = ; 3. 复制代码下面的示例是 AJAX 文件上传的实现画面,左边图片会上传成功后自动更新。自动生成缩略图如果希望在上传过程自动为图片文件生成缩略图,ThinkPHP 的 UploadFile
7、 类也可以轻松实现,而且不需要你多特殊添加缩略图处理代码。要做的也仅仅是在客户端添加如下参数:1. / 设置是否需要生成图片缩略图,仅对图片上传有效 2. / 生成缩略图的最大宽度 3. / 生成缩略图的最大高度 4. 复制代码设置后系统在上传后会自动生成相同格式的缩略图。系统默认的缩略图路径是上传文件所在目录,并且在文件中后面添加_thumb 以标识缩略图文件。缩略图路径可以在项目配置文件中配置。 生成多缩略图ThinkPHP 支持对上传的图片生成多缩略图,TOPThink 社区的头像功能就是多缩略图功能的例子,使用起来也非常简单。下面的代码是 TOPThink 社区上传头像的部分缩略图代码
8、:1. 2. 3. 4. 复制代码上面的例子表示生成三个大小的缩略图,并规定了缩略图文件名后面添加的后缀,和三种缩略图的宽高尺寸。更多上传设置ThinkPHP 在 Action 来中还提供了和 UploadFile 类的上传设置接口,方便在客户端进行更多的参数设置进行上传控制。下面列举下主要的参数,更多的参数可以参考框架的 Action 类中的_upload 方法。 1. / 设置覆盖方式上传 2. / 设置允许上传文件类型 3. / 上传文件保存目录,要注意设置可写权限 4. / 上传文件名命名规则,支持函数,例如 time uniqid com_create_guid 系统默认设置为 un
9、iqid 保证上传文件名不会重复,如果不存在设置函数,则使用规则字符串作为上传文件名 5. / 设置上传文件大小 6. / 设置上传数据表,默认的上传数据记录在当前模块表中 / 设置上传文件对应的数据编号,通常不用设置,除非特别需要7. / 设置上传用户id,通常不用设置,系统自动获取当前登录用户编号 8. 复制代码ThinkPHP 对 Ajax 完全支持ThinkPHP 完全支持 Ajax,并且还内置了一个 SmartAjax 和 ThinkAjax 类库,你可以不通过任何其他 Ajax 类库包就可以在 ThinkPHP 中使用 Ajax 支持。首先说一下 ThinkPHP 的 JS 类库以
10、及如何在 ThinkPHP 中引入 Js 类库JS 类库ThinkPHP 框架自带了一个易于扩展的 JS 类库,并且通过标签库技术和 JS 方法轻松导入。JS 类库的引入给 ThinkPHP 的发展和企业级应用开启了新的一面,同时也给基于 ThinkPHP的应用开发定义了一个相对简单的 JS 导入规范。这个规范类似于 ThinkPHP 基类库的命名空间导入方式,并且该规范同样可以适用于 CSS 文件的导入。下面先看个例子:基于标签库技术的 JS 类库引入方法1. 2. 使用 html:import 标签 可以引入所需要的 JS 文件,如果没有指定 type,则默认为js,import 的根目录
11、可以设定,也可以通过 basepath 参数指定。以上的标签就表示导入 Js/Base.js、 Js/Util/Calendar.js、 ./public/Js/common.js。这种方式的 Js 导入是显式的,除了以上标签库形式的导入,ThinkPHP 还支持隐式的 JS 方法导入 JS 文件。在 Base.js 文件中定义了_import 方法,可以起到和 html:import 标签类似的功能,例如:1. 2. 6. 要使用 _import 方法在 Js 文件中隐式导入所需的 JS 类库,前提是必须加载 Base.js 文件和设定 ImportBasePath 参数(即导入根目录),并
12、且该方法只能导入 JS 文件。除此之外,ThinkPHP 提供的 JS 类库还提供了基于文件名方式导入 JS 和 CSS 的方法:ImportJS 和 ImportCss。ThinkPHP 框架目前的 JS 类库还比较有限,但是开发人员可以很方便的扩充自己的 JS 类库,并且随着 ThinkPHP 的不断完善,也一定会提供更加丰富的 JS 类库。目前提供的类库有:1. Base.js JS 基础文件 2. String 目录 字符串操作扩充类 3. Util 目录 工具类库 4. Form 目录 表单操作类库SmartAjax 和 ThinkAjaxSmartAjax 是一个 Ajax 类库,
13、纯 JS 解决方案,参考了 CoreAjax 的某些功能实现,支持HTML 元素和事件绑定 Ajax 操作、表单提交,并可以定时执行,支持更新效果。 ThinkAjax 和 ThinkPHP 结合,在返回数据格式上面专门针对 ThinkPHP 作了处理,其他用法和 SmartAjax 类似。主要属性: updateTip /更新提示信息,支持 HTML method /提交方法 POST 或者 GET effect /更新效果,采用 mootools 类库,例如 ”font-size”:0,25,”opacity”: 1,0.3 主要方法: / 发送 Ajax 请求 send(提交 URL,提
14、交参数,结果显示 DIV 对象或者 ID,更新显示效果,定时执行时间间隔) / 发送表单 Ajax 操作 sendForm(表单对象或者 ID,提交 URL,结果显示 DIV 对象或者 ID,更新显示效果) / 绑定 Ajax 操作到 HTML 元素和事件 bind(源 HTML 元素或者 ID,绑定事件,提交 URL,提交参数,结果显示 DIV 对象或者 ID,更新效果) / 页面加载时候进行 Ajax 操作 load(提交 URL,提交参数,结果显示 DIV 对象或者 ID,更新效果) / 定时执行 Ajax 操作 repeat(提交 URL,提交参数,结果显示 DIV 对象或者 ID,执
15、行间隔,更新效果) 使用举例: 1. / 加载需要的类库 2. 3. 4. SmartAjax.updateTip = “更新中“; 5. SmartAjax.effect = font-size:0,30,opacity: 1,0.3; 6. / 页面加载时执行通过 Ajax 操作在后台执行 load.php 7. SmartAjax.load(http:/localhost/load.php,“name=thinkphp“,“result“); 8.9. / 绑定 click 操作到 id 为 run 的 html 元素,执行 Ajax 10.SmartAjax.bind(run,clic
16、k,http:/localhost/hello.php,“name=thinkphp“,“result“); 11.12./ 每隔 1 秒种执行 time.php,输出 13.SmartAjax.repeat(http:/localhost/time.php,“,$(timer),1000); 14.15./ Ajax 方式提交表单数据 16.SmartAjax.sendForm(login, APP+/User/checkLogin/,result,doLogin);Ajax 文件上传 ThinkPHP 框架内置了对 Ajax 文件上传(非真正 Ajax)的实现。采用的是 iframe 的方
17、式对文件上传进行支持。结合 ThinkPHP 的文件上传类,可以很方便地进行文件上传和批量上传。下面是一个典型的文件上传示例代码: 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12.上传完成后,ThinkPHP 系统会在 iframe 里面返回 js 代码和数据,并根据自定义的方法更新页面的 result 标签。更多关于文件上传方面的掌握请看 文件上传类的使用教程 后端 Ajax 数据返回 SmartAjax 是一个独立的前端 JS 类库,其运行并不需要后台支持。不过,在后台处理和数据返回方面,结合 ThinkPHP 框架提供的一些完善处理,能够使得后台的开发效率提高
18、。首先,在页面使用 Ajax 方式提交的时候使用_AJAX_SUBMIT_隐藏变量或者 ajax 变量,后台能够自动识别该操作为 Ajax 操作,并作出相应的处理。例如,表单提交 Ajax 方式,在form 中添加 如果使用 SmartAjax.send 方法提交操作,直接在参数里面添加 ajax 变量 1. SmartAjax.send(url,ajax=1在后台 Action 类处理完毕后,简单使用:ajaxReturn($data,$info,$status) 来返回数据到客户端,其中 $data 表示需要返回客户端的数据,可以是字符串、数组或者对象(经过 JSON_ENCODE 编码,
19、可以被 js 直接使用) $info 表示提示信息(例如操作成功、失败等) $status 表示操作状态码(1 表示成功 0 表示失败 可以由应用自己定义,客户端作相应处理就可以了)通常的方式我们需要使用 echo 或者 exit 来输出数据,并且还需要设置 utf8 编码,最麻烦的是还要自己进行 json 编码,使用 AjaxReturn 方法,一切都内置处理了。并且,另外一个方便之处是,不仅仅可以返回数据,还可以返回操作状态(例如操作失败还是成功)以及相关提示信息。 ThinkPHP 对于 JSON 的处理已经作了兼容处理,无论是 PHP4 还是PHP5 都可以直接使用 JSON_ENCO
20、DE 方法来对 PHP 对象、数组或者字符串等类型直接编码成JSON 数据返回给客户端由 JS 处理。 为了更好的获取 ThinkPHP 后台 Action 的 ajaxReturn 方法返回的信息,框架 JS 类库中增加了一个 ThinkAjax 类库为后台 ajax 信息返回提供完全支持。 ThinkAjax 类的使用和SmartAjax 基本类似,只是简化了操作,只需要在客户端定义接受数据的处理方法,其他的由 ThinkAjax 类库自动处理了,包括信息提示。一个 ThinkAjax 的使用例子: 1. ThinkAjax.sendForm(formId,_URL_/action/,complete); 2. function complete(data,status,info) 3. / 获取返回数据,并进行处理 4. / 在这里对 data 进行处理操作 5.