# 文件上传
[上一页](# "上一页")[下一页](# "下一页")
上传类使用ORG.Net.UpdateFile类,最新版本的上传类包含的功能如下(有些功能需要结合ThinkPHP系统其他类库):
- 基本上传功能
- 支持批量上传
- 支持生成图片缩略图
- 自定义参数上传
- 上传检测(包括大小、后缀和类型)
- 支持覆盖方式上传
- 支持上传类型、附件大小、上传路径定义
- 支持哈希或者日期子目录保存上传文件
- 上传图片的安全性检测
- 支持上传文件命名规则
- 支持对上传文件的Hash验证
在ThinkPHP中使用上传功能无需进行特别处理。例如,下面是一个带有附件上传的表单提交:`<input type="file" name="photo1">
<input type="file" name="photo2">
<input type="file" name="photo3">`
注意表单的Form标签中一定要添加 enctype=”multipart/form-data”文件才能上传。因为表单提交到当前模块的upload操作方法,所以我们在模块类里面添加下面的**upload**方法即可:`Public function upload(){
import('ORG.Net.UploadFile');
$upload = new UploadFile();// 实例化上传类
$upload->maxSize = 3145728 ;// 设置附件上传大小
$upload->allowExts = array('jpg', 'gif', 'png', 'jpeg');// 设置附件上传类型
$upload->savePath = './Public/Uploads/';// 设置附件上传目录
if(!$upload->upload()) {// 上传错误提示错误信息
$this->error($upload->getErrorMsg());
}else{// 上传成功 获取上传文件信息
$info = $upload->getUploadFileInfo();
}
// 保存表单数据 包括附件数据
$User = M("User"); // 实例化User对象
$User->create(); // 创建数据对象
$User->photo = $info[0]['savename']; // 保存上传的照片根据需要自行组装
$User->add(); // 写入用户数据到数据库
$this->success('数据保存成功!');
}`首先是实例化上传类`import('ORG.Net.UploadFile');
$upload = new UploadFile();// 实例化上传类`实例化上传类之后,就可以设置一些上传的属性(参数),支持的属性有:
| maxSize | 文件上传的最大文件大小(以字节为单位)默认为-1 不限大小 |
|-----|-----|
| savePath | 文件保存路径,如果留空会取UPLOAD_PATH常量定义的路径 |
| saveRule | 上传文件的保存规则,必须是一个无需任何参数的函数名,例如可以是 time、 uniqid com_create_guid 等,但必须能保证生成的文件名是唯一的,默认是uniqid |
| hashType | 上传文件的哈希验证方法,默认是md5_file |
| autoCheck | 是否自动检测附件,默认为自动检测 |
| uploadReplace | 存在同名文件是否是覆盖 |
| allowExts | 允许上传的文件后缀(留空为不限制),使用数组设置,默认为空数组 |
| allowTypes | 允许上传的文件类型(留空为不限制),使用数组设置,默认为空数组 |
| thumb | 是否需要对图片文件进行缩略图处理,默认为false |
| thumbMaxWidth | 缩略图的最大宽度,多个使用逗号分隔 |
| thumbMaxHeight | 缩略图的最大高度,多个使用逗号分隔 |
| thumbPrefix | 缩略图的文件前缀,默认为thumb_ |
| thumbSuffix | 缩略图的文件后缀,默认为空 |
| thumbPath | 缩略图的保存路径,留空的话取文件上传目录本身 |
| thumbFile | 指定缩略图的文件名 |
| thumbRemoveOrigin | 生成缩略图后是否删除原图 |
| autoSub | 是否使用子目录保存上传文件 |
| subType | 子目录创建方式,默认为hash,可以设置为hash或者date |
| dateFormat | 子目录方式为date的时候指定日期格式 |
| hashLevel | 子目录保存的层次,默认为一层 |
以上属性都可以直接设置,例如:`$upload->thumb = true;
$upload->thumbMaxWidth = '50,200';
$upload->thumbMaxHeight = '50,200';`其中生成缩略图功能需要Image类的支持。
设置好上传的参数后,就可以调用UploadFile类的upload方法进行附件上传,如果失败,返回false,并且用getErrorMsg方法获取错误提示信息;如果上传成功,可以通过调用**getUploadFileInfo**方法获取成功上传的附件信息列表。因此getUploadFileInfo方法的返回值是一个数组,其中的每个元素就是上传的附件信息。每个附件信息又是一个记录了下面信息的数组,包括:
| **key** | 附件上传的表单名称 |
|-----|-----|
| **savepath** | 上传文件的保存路径 |
| **name** | 上传文件的原始名称 |
| **savename** | 上传文件的保存名称 |
| **size** | 上传文件的大小 |
| **type** | 上传文件的MIME类型 |
| **extension** | 上传文件的后缀类型 |
| **hash** | 上传文件的哈希验证字符串 |
文件上传成功后,就可以通过这些附件信息来进行其他的数据存取操作,例如保存到当前数据表或者单独的附件数据表都可以。
如果需要使用多个文件上传,只需要修改表单,把`<input type='file' name='photo'>`改为`<input type='file' name='photo1'>
<input type='file' name='photo2'>
<input type='file' name='photo3'>`或者`<input type='file' name='photo[]'>
<input type='file' name='photo[]'>
<input type='file' name='photo[]'>`两种方式的多附件上传系统的文件上传类都可以自动识别。
[上一页](# "上一页")[下一页](# "下一页")
- 序言
- 1. 入门
- 1.1 简介
- 1.2 基础概念
- 1.3 获取ThinkPHP
- 1.4 环境要求
- 1.5 许可协议
- 1.6 目录结构
- 1.7 命名规范
- 1.8 MVC分层
- 1.9 CBD架构
- 1.10 特性概述
- 1.11 系统流程
- 1.12 开发流程
- 2. 入口
- 2.1 入口文件
- 2.2 项目目录
- 2.3 部署目录
- 2.4 项目编译
- 2.5 调试模式
- 3. 配置
- 3.1 配置格式
- 3.2 惯例配置
- 3.3 项目配置
- 3.4 调试配置
- 3.5 分组配置
- 3.6 读取配置
- 3.7 动态配置
- 3.8 扩展配置
- 4. 函数和类库
- 4.1 函数库
- 4.2 类库
- 5. 控制器
- 5.1 URL模式
- 5.2 模块和操作
- 5.3 定义控制器
- 5.4 空操作
- 5.5 空模块
- 5.6 模块分组
- 5.7 URL伪静态
- 5.8 URL路由
- 5.9 URL重写
- 5.10 URL生成
- 5.11 URL大小写
- 5.12 前置和后置操作
- 5.13 跨模块调用
- 5.14 页面跳转
- 5.15 重定向
- 5.16 获取系统变量
- 5.17 判断请求类型
- 5.18 获取URL参数
- 5.19 AJAX返回
- 5.20 Action参数绑定
- 5.21 多层控制器支持
- 6. 模型
- 6.1 模型定义
- 6.2 模型实例化
- 6.3 字段定义
- 6.4 数据主键
- 6.5 属性访问
- 6.6 跨库操作
- 6.7 连接数据库
- 6.8 切换数据库
- 6.9 分布式数据库
- 6.10 创建数据
- 6.11 字段映射
- 6.12 连贯操作
- 6.13 CURD操作
- 6.14 ActiveRecord
- 6.15 自动验证
- 6.16 命名范围
- 6.17 自动完成
- 6.18 查询语言
- 6.19 查询锁定
- 6.20 字段排除
- 6.21 事务支持
- 6.22 高级模型
- 6.23 视图模型
- 6.24 关联模型
- 6.25 Mongo模型
- 6.26 动态模型
- 6.27 虚拟模型
- 6.28 多层模型支持
- 7. 视图
- 7.1 模板定义
- 7.2 模板赋值
- 7.3 模板输出
- 7.4 模板替换
- 7.5 获取内容
- 7.6 模板引擎
- 7.7 布局模板
- 8. 模板引擎
- 8.1 变量输出
- 8.2 系统变量
- 8.3 使用函数
- 8.4 默认值输出
- 8.5 使用运算符
- 8.6 内置标签
- 8.7 包含文件
- 8.8 导入文件
- 8.9 Volist标签
- 8.10 Foreach标签
- 8.11 For标签
- 8.12 Switch标签
- 8.13 比较标签
- 8.14 三元运算
- 8.15 范围判断标签
- 8.16 Present标签
- 8.17 Empty标签
- 8.18 Defined标签
- 8.19 Define标签
- 8.20 Assign标签
- 8.21 IF标签
- 8.22 标签嵌套
- 8.23 使用PHP代码
- 8.24 模板布局
- 8.25 模板继承
- 8.26 原样输出
- 8.27 模板注释
- 8.28 引入标签库
- 8.29 修改定界符
- 8.30 避免JS混淆
- 9. 日志
- 9.1 日志级别
- 9.2 记录方式
- 9.3 手动记录
- 10. 错误
- 10.1 异常处理
- 10.2 异常模板
- 10.3 异常显示
- 11. 调试
- 11.1 运行状态
- 11.2 页面Trace
- 11.3 调试方法
- 12. 缓存
- 12.1 缓存方式
- 12.2 动态缓存
- 12.3 缓存队列
- 12.4 快捷缓存
- 12.5 快速缓存
- 12.6 查询缓存
- 12.7 SQL解析缓存
- 12.8 静态缓存
- 13. 扩展
- 13.1 行为扩展
- 13.2 类库扩展
- 13.3 控制器扩展
- 13.4 模型扩展
- 13.5 驱动扩展
- 13.6 Widget扩展
- 13.7 模式扩展
- 13.8 引擎扩展
- 14. 安全
- 14.1 表单令牌
- 14.2 字段类型验证
- 14.3 防止SQL注入
- 14.4 输入过滤
- 14.5 上传安全
- 14.6 防止XSS攻击
- 14.7 其他安全建议
- 14.8 目录安全文件
- 14.9 保护模板文件
- 15. 性能
- 15.1 关闭调试模式
- 15.2 开启缓存
- 15.3 合并字段缓存
- 15.4 优化SQL
- 15.5 替换入口
- 15.6 前端优化
- 16. 部署
- 16.1 PATH_INFO支持
- 16.2 隐藏index.php
- 16.3 二级域名部署
- 16.4 定制错误页面
- 16.5 设置时区
- 17. SAE支持
- 17.1 SAE介绍
- 17.2 获取SAE
- 17.3 SAE开发
- 18. REST支持
- 18.1 REST介绍
- 18.2 REST模式
- 18.3 REST配置
- 18.4 REST路由
- 18.5 REST方法
- 19. 杂项
- 19.1 Session支持
- 19.2 Cookie支持
- 19.3 日期和时间
- 19.4 WML开发
- 19.5 多语言
- 19.6 数据分页
- 19.7 文件上传
- 19.8 验证码
- 19.9 图片添加水印
- 19.10 IP获取和定位
- 20. 附录
- 20.1 常量参考
- 20.2 配置参考
- 20.3 关于升级
- 20.4 大事记
- 鸣谢
- 关于