获取上传类
最新版本的上传类包含的功能如下(有些功能需要结合ThinkPHP系统其他类库):- 基本上传功能
- 支持批量上传
- 支持生成图片缩略图
- 自定义参数上传
- 上传检测(包括大小、后缀和类型)
- 支持覆盖方式上传
- 支持上传类型、附件大小、上传路径定义
- 支持哈希或者日期子目录保存上传文件
- 支持动态定义子目录保存文件
- 上传图片的安全性检测
- 支持上传文件命名规则
- 支持对上传文件的Hash验证
上传表单
上传表单无需特别处理,下面是一个最简单的单文件上传表单:
- <form id="upload" method='post' action="!-URL-!/upload/" enctype="multipart/form-data">
- <input name="image" type="file" />
- <input type="submit" value="提交" >
- </form>
复制代码
上传操作
接下来就是定义上传操作了,我们在Action控制器中添加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{// 上传成功
- $this->success('上传成功!');
- }
- }
复制代码
参数设置
要使用上传功能,首先第一步就是实例化上传类:
- import('ORG.Net.UploadFile');
- $upload = new UploadFile();// 实例化上传类
复制代码
maxSize | 文件上传的最大文件大小(以字节为单位)默认为-1 不限大小 |
savePath | 文件保存路径(必须) |
saveRule | 上传文件的保存规则,必须是一个无需任何参数的函数名,例如可以是 time、 uniqid com_create_guid 等,但必须能保证生成的文件名是唯一的,默认是uniqid |
hashType | 上传文件的哈希验证方法,默认是md5_file |
autoCheck | 是否自动检测附件,默认为自动检测 |
uploadReplace | 存在同名文件是否是覆盖 |
allowExts | 允许上传的文件后缀(留空为不限制),使用数组设置,默认为空数组 |
allowTypes | 允许上传的文件类型(留空为不限制),使用数组设置,默认为空数组 |
thumb | 是否需要对图片文件进行缩略图处理,默认为false |
thumbMaxWidth | 缩略图的最大宽度,多个使用逗号分隔 |
thumbMaxHeight | 缩略图的最大高度,多个使用逗号分隔 |
thumbPrefix | 缩略图的文件前缀,默认为thumb_ |
thumbSuffix | 缩略图的文件后缀,默认为空 |
thumbPath | 缩略图的保存路径,留空的话取文件上传目录本身 |
thumbFile | 指定缩略图的文件名 |
thumbExt | 指定缩略图的扩展名 |
thumbRemoveOrigin | 生成缩略图后是否删除原图 |
autoSub | 是否使用子目录保存上传文件 |
subType | 子目录创建方式,默认为hash,可以设置为hash、date或者custom |
subDir | 子目录名称 subType为custom方式后有效 |
dateFormat | 子目录方式为date的时候指定日期格式 |
hashLevel | 子目录保存的层次,默认为一层 |
- //设置附件上传目录
- $upload->savePath = './Uploads/';
- //设置需要生成缩略图,仅对图像文件有效
- $upload->thumb = true;
- //设置需要生成缩略图的文件后缀
- $upload->thumbPrefix = 'm_,s_'; //生产2张缩略图
- //设置缩略图最大宽度
- $upload->thumbMaxWidth = '200,50';
- //设置缩略图最大高度
- $upload->thumbMaxHeight = '200,50';
复制代码
- import('ORG.Net.UploadFile');
- $config['savePath'] = './Uploads/';
- $config['thumb'] = true;
- $config['thumbPrefix'] = 'm_,s_';
- $config['thumbMaxWidth'] = '200,50';
- $config['thumbMaxHeight'] = '200,50';
- $upload = new UploadFile($config);// 实例化上传类并传入参数
复制代码
key | 附件上传的表单名称 |
savepath | 上传文件的保存路径 |
name | 上传文件的原始名称 |
savename | 上传文件的保存名称 |
size | 上传文件的大小 |
type | 上传文件的MIME类型 |
extension | 上传文件的后缀类型 |
hash | 上传文件的哈希验证字符串 |
例如,下面表示把上传信息保存到数据表的字段:
- //取得成功上传的文件信息
- $info = $upload->getUploadFileInfo();
- $model = M('Photo');
- //保存当前数据对象
- $data['image'] = $info[0]['savename'];
- $data['create_time'] = NOW_TIME;
- $model->add($data);
复制代码
多文件上传
上传类默认就支持多文件上传,只需要修改表单页面:如果需要使用多个文件上传,只需要修改表单,把
- <input type='file' name='image'>
复制代码
- <input type='file' name='image1'>
- <input type='file' name='image2'>
- <input type='file' name='image3'>
复制代码
<input type='file' name='image[]'>
<input type='file' name='image[]'>
<input type='file' name='image[]'>
两种方式的多附件上传表单文件上传类都可以自动识别。
上传成功后,还是使用getUploadFileInfo方法获取成功上传的附件信息。
单个上传
上传类还提供了单个上传的方法
- import("ORG.Net.UploadFile");
- $upload = new UploadFile();
- foreach ($_FILES as $key=>$file){
- if(!empty($file['name'])) {
- $upload->autoSub = true;
- $upload->subType = 'date';
- $info = $upload->uploadOne($file);
- if($info){ // 保存附件信息
- M('Photo')->add($info);
- }else{ // 上传错误
- $this->error($upload->getErrorMsg());
- }
- }
- }
复制代码
上传文件的命名规范
上传文件的命名规范用于确保文件不会产生冲突或者覆盖的情况。而命名规范的定义又需要根据你的业务逻辑来调整,不是固定的。例如,如果你采用时间戳的方式来定义命名规范,那么在同时上传多个文件的时候可能产生冲突(因为同一秒内可以上传多个文件),因此你需要根据你的业务需求来设置合适的上传命名规则。这里顺便来说下saveRule参数的具体用法。一、采用函数方式
如果传入的字符串是一个函数名,那么表示采用函数动态生成上传文件名(不包括文件后缀),例如:
- $upload->saveRule = 'time'; // 采用时间戳命名
复制代码
- $upload->saveRule = 'com_create_guid'; // 采用GUID序列命名
复制代码
- $upload->saveRule = 'myfun'; // 采用自定义函数命名
复制代码
如果传入的参数不是一个函数名,那么就会直接当做是上传文件名,例如:
- $upload->saveRule = time().'_'.mt_rand();
复制代码
如果你想保持上传的文件名不变,那么只需要设置命名规范为空即可,例如:
- $upload->saveRule = '';
复制代码
子目录保存
saveRule只是用于设置文件的保存规则,不涉及到目录,如果希望采用子目录保存上传文件,可以使用下面的三种方式设置子目录:一、哈希子目录
- $upload->subType = 'hash';
- $upload->hashLevel = 2;
复制代码
二、日期子目录
这种方式也比较常用,用日期作为子目录名称,
- $upload->subType = 'date';
- $upload->dateFormat = 'Y-m-d';
复制代码
三、自定义子目录
这种方式作为一种更灵活的子目录保存方式,是最新添加的功能支持。
- $upload->subType = 'custom';
- $upload->subDir = get_user_id();
复制代码
生成缩略图
缩略图功能需要Image扩展类的支持,所以确保你已经有了这个扩展类。然后设置如下参数:
- //设置需要生成缩略图,仅对图像文件有效
- $upload->thumb = true;
- //设置需要生成缩略图的文件前缀
- $upload->thumbPrefix = 'm_,s_'; //生产2张缩略图
- //设置缩略图最大宽度
- $upload->thumbMaxWidth = '200,50';
- //设置缩略图最大高度
- $upload->thumbMaxHeight = '200,50';
- //设置生成缩略图后移除原图
- $upload->thumbRemoveOrigin = true;
复制代码
生成的缩略图默认位于保存文件的实际所在目录(包括子目录的情况),当然你也可以指定统一的缩略图保存路径,例如:
- $upload->thumbPath = './Uploads/thumb/';
复制代码
我们可以设置缩略图采用统一的文件后缀,例如:
- // 设置缩略图的固定后缀
- $upload->thumbExt = 'jpg';
复制代码