热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

ThinkPHP3.1快速入门(19)文件上传

更多的上传类用法可以通过上传参数的设置来完成,留给大家慢慢挖掘了。

获取上传类

ThinkPHP的扩展中提供了文件上传类库UploadFile,可以在在http://www.thinkphp.cn/extend/224.html下载,或者下载官方的完整扩展包(http://www.thinkphp.cn/down/253.html)里面也已经包含上传扩展类了。如果是单独下载的上传类库,把解压后的UploadFile.class.php 放入ThinkPHP/Extend/Library/ORG/Net/(如果没有请手动创建)目录下面。
最新版本的上传类包含的功能如下(有些功能需要结合ThinkPHP系统其他类库):
  • 基本上传功能
  • 支持批量上传
  • 支持生成图片缩略图
  • 自定义参数上传
  • 上传检测(包括大小、后缀和类型)
  • 支持覆盖方式上传
  • 支持上传类型、附件大小、上传路径定义
  • 支持哈希或者日期子目录保存上传文件
  • 支持动态定义子目录保存文件
  • 上传图片的安全性检测
  • 支持上传文件命名规则
  • 支持对上传文件的Hash验证
如果你需要使用上传图片生成缩略图功能的话,还需要下载图像处理扩展类http://www.thinkphp.cn/extend/225.html,解压后的Image.class.php放入ThinkPHP/Extend/Library/ORG/Util/目录下面。

上传表单

上传表单无需特别处理,下面是一个最简单的单文件上传表单:
  1.  id="upload" method='post' action="__URL__/upload/" enctype="multipart/form-data">
  2.  name="image" type="file" />
  3.  type="submit" value="提交" >
注意,表单必须添加enctype="multipart/form-data"属性才能支持文件上传功能。

上传操作

接下来就是定义上传操作了,我们在Action控制器中添加upload操作方法如下:
  1. // 文件上传
  2. public function upload() {
  3.     import('ORG.Net.UploadFile');
  4.     $upload = new UploadFile();// 实例化上传类
  5.     $upload->maxSize  = 3145728 ;// 设置附件上传大小
  6.     $upload->allowExts  = array('jpg''gif''png''jpeg');// 设置附件上传类型
  7.     $upload->savePath =  './Public/Uploads/';// 设置附件上传目录
  8.     if(!$upload->upload()) {// 上传错误提示错误信息
  9.         $this->error($upload->getErrorMsg());
  10.     }else{// 上传成功
  11.         $this->success('上传成功!');
  12.     }
  13. }
系统提供的文件上传类对图片文件的上传安全做了支持,如果企图上传非法的图像文件,系统会提示“非法图像文件”。

参数设置

要使用上传功能,首先第一步就是实例化上传类:
  1.     import('ORG.Net.UploadFile');
  2.     $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 子目录保存的层次,默认为一层
上传参数的设置方法如下:
  1.  //设置附件上传目录
  2. $upload->savePath = './Uploads/';
  3. //设置需要生成缩略图,仅对图像文件有效
  4. $upload->thumb = true;
  5. //设置需要生成缩略图的文件后缀
  6. $upload->thumbPrefix = 'm_,s_';  //生产2张缩略图
  7. //设置缩略图最大宽度
  8. $upload->thumbMaxWidth = '200,50';
  9. //设置缩略图最大高度
  10. $upload->thumbMaxHeight = '200,50';
另外一种方式是,在实例化的同时传入上传参数,例如:
  1. import('ORG.Net.UploadFile');
  2. $config['savePath'] = './Uploads/';
  3. $config['thumb'] = true;
  4. $config['thumbPrefix'] = 'm_,s_';
  5. $config['thumbMaxWidth'] = '200,50';
  6. $config['thumbMaxHeight'] = '200,50';
  7. $upload = new UploadFile($config);// 实例化上传类并传入参数
无论采用何种方式,设置好上传的参数后,就可以调用UploadFile类的upload方法进行附件上传,如果失败,返回false,并且用getErrorMsg方法获取错误提示信息;如果上传成功,可以通过调用getUploadFileInfo方法获取成功上传的附件信息列表。getUploadFileInfo方法的返回值是一个二维数组,其中的每个元素就是上传的附件信息。每个附件信息又是一个记录了下面信息的数组,包括:
key 附件上传的表单名称
savepath 上传文件的保存路径
name 上传文件的原始名称
savename 上传文件的保存名称
size 上传文件的大小
type 上传文件的MIME类型
extension 上传文件的后缀类型
hash 上传文件的哈希验证字符串
文件上传成功后,就可以通过这些附件信息来进行其他的数据存取操作,例如保存到当前数据表或者单独的附件数据表都可以。
例如,下面表示把上传信息保存到数据表的字段:
  1. //取得成功上传的文件信息
  2. $info = $upload->getUploadFileInfo();
  3. $model = M('Photo');
  4. //保存当前数据对象
  5. $data['image'] = $info[0]['savename'];
  6. $data['create_time'] = NOW_TIME;
  7. $model->add($data);
官网示例中的图像上传示例可以查看上传和显示效果:


多文件上传

上传类默认就支持多文件上传,只需要修改表单页面:
如果需要使用多个文件上传,只需要修改表单,把
  1.  type='file'  name='image'>
改为
  1.  type='file'  name='image1'>
  2.  type='file'  name='image2'>
  3.  type='file'  name='image3'>
或者



两种方式的多附件上传表单文件上传类都可以自动识别。
上传成功后,还是使用getUploadFileInfo方法获取成功上传的附件信息。

单个上传

上传类还提供了单个上传的方法
  1. import("ORG.Net.UploadFile");
  2. $upload = new UploadFile();
  3. foreach ($_FILES as $key=>$file){
  4.     if(!empty($file['name'])) {
  5.         $upload->autoSub = true;
  6.         $upload->subType   =  'date';
  7.         $info =  $upload->uploadOne($file);
  8.         if($info){ // 保存附件信息
  9.             M('Photo')->add($info);
  10.         }else// 上传错误
  11.             $this->error($upload->getErrorMsg());
  12.         }
  13.     }
  14. }
uploadOne方法表示每次执行只上传指定的一个文件,并且如果上传成功的话uploadOne方法的返回值就是成功上传的文件信息,和getUploadFileInfo方法不同的是,这个文件信息是一个仅包含单个文件信息的一维数组。如果发生错误,依然是通过getErrorMsg方法获取错误信息。

上传文件的命名规范

上传文件的命名规范用于确保文件不会产生冲突或者覆盖的情况。而命名规范的定义又需要根据你的业务逻辑来调整,不是固定的。例如,如果你采用时间戳的方式来定义命名规范,那么在同时上传多个文件的时候可能产生冲突(因为同一秒内可以上传多个文件),因此你需要根据你的业务需求来设置合适的上传命名规则。这里顺便来说下saveRule参数的具体用法。
一、采用函数方式
如果传入的字符串是一个函数名,那么表示采用函数动态生成上传文件名(不包括文件后缀),例如:
  1. $upload->saveRule = 'time'// 采用时间戳命名
  1. $upload->saveRule = 'com_create_guid'// 采用GUID序列命名
也可以采用用户自定义函数:
  1. $upload->saveRule = 'myfun'// 采用自定义函数命名
二、直接设置上传文件名
如果传入的参数不是一个函数名,那么就会直接当做是上传文件名,例如:
  1. $upload->saveRule = time().'_'.mt_rand();
三、保持上传文件名不变
如果你想保持上传的文件名不变,那么只需要设置命名规范为空即可,例如:
  1. $upload->saveRule = '';
一般来说不建议保持不变,因为会导致相同的文件名上传后被覆盖的情况。

子目录保存

saveRule只是用于设置文件的保存规则,不涉及到目录,如果希望采用子目录保存上传文件,可以使用下面的三种方式设置子目录:
一、哈希子目录
  1. $upload->subType = 'hash';
  2. $upload->hashLevel = 2;
设置后,会自动对上传文件进行哈希编码后的第一个和第二个字母分别作为一级和二级子目录名称保存。如果hashLevel不设置,则默认为一级子目录。
二、日期子目录
这种方式也比较常用,用日期作为子目录名称,
  1. $upload->subType = 'date';
  2. $upload->dateFormat = 'Y-m-d';
dateFormat参数则用于配合设置日期的格式,如果不设置,则默认为Ymd。
三、自定义子目录
这种方式作为一种更灵活的子目录保存方式,是最新添加的功能支持。
  1. $upload->subType = 'custom';
  2. $upload->subDir = get_user_id();
自定义子目录方式的优势在于,可以动态设置子目录名称,上面的定义就采用了当前用户ID作为子目录名称。

生成缩略图

缩略图功能需要Image扩展类的支持,所以确保你已经有了这个扩展类。
然后设置如下参数:
  1. //设置需要生成缩略图,仅对图像文件有效
  2. $upload->thumb = true;
  3. //设置需要生成缩略图的文件前缀
  4. $upload->thumbPrefix = 'm_,s_';  //生产2张缩略图
  5. //设置缩略图最大宽度
  6. $upload->thumbMaxWidth = '200,50';
  7. //设置缩略图最大高度
  8. $upload->thumbMaxHeight = '200,50';
  9. //设置生成缩略图后移除原图
  10. $upload->thumbRemoveOrigin = true;
缩略图的前(后)缀数量必须和宽度数量对应,表示生成多个缩略图。
生成的缩略图默认位于保存文件的实际所在目录(包括子目录的情况),当然你也可以指定统一的缩略图保存路径,例如:
  1. $upload->thumbPath = './Uploads/thumb/';
这里的thumbPath参数必须用“/”结尾。
我们可以设置缩略图采用统一的文件后缀,例如:
  1. // 设置缩略图的固定后缀
  2. $upload->thumbExt = 'jpg';
更多的上传类用法可以通过上传参数的设置来完成,留给大家慢慢挖掘了。

推荐阅读
  • 如何实现织梦DedeCms全站伪静态
    本文介绍了如何通过修改织梦DedeCms源代码来实现全站伪静态,以提高管理和SEO效果。全站伪静态可以避免重复URL的问题,同时通过使用mod_rewrite伪静态模块和.htaccess正则表达式,可以更好地适应搜索引擎的需求。文章还提到了一些相关的技术和工具,如Ubuntu、qt编程、tomcat端口、爬虫、php request根目录等。 ... [详细]
  • Monkey《大话移动——Android与iOS应用测试指南》的预购信息发布啦!
    Monkey《大话移动——Android与iOS应用测试指南》的预购信息已经发布,可以在京东和当当网进行预购。感谢几位大牛给出的书评,并呼吁大家的支持。明天京东的链接也将发布。 ... [详细]
  • 本文介绍了lua语言中闭包的特性及其在模式匹配、日期处理、编译和模块化等方面的应用。lua中的闭包是严格遵循词法定界的第一类值,函数可以作为变量自由传递,也可以作为参数传递给其他函数。这些特性使得lua语言具有极大的灵活性,为程序开发带来了便利。 ... [详细]
  • 本文介绍了Python高级网络编程及TCP/IP协议簇的OSI七层模型。首先简单介绍了七层模型的各层及其封装解封装过程。然后讨论了程序开发中涉及到的网络通信内容,主要包括TCP协议、UDP协议和IPV4协议。最后还介绍了socket编程、聊天socket实现、远程执行命令、上传文件、socketserver及其源码分析等相关内容。 ... [详细]
  • GetWindowLong函数
    今天在看一个代码里头写了GetWindowLong(hwnd,0),我当时就有点费解,靠,上网搜索函数原型说明,死活找不到第 ... [详细]
  • 本文介绍了在开发Android新闻App时,搭建本地服务器的步骤。通过使用XAMPP软件,可以一键式搭建起开发环境,包括Apache、MySQL、PHP、PERL。在本地服务器上新建数据库和表,并设置相应的属性。最后,给出了创建new表的SQL语句。这个教程适合初学者参考。 ... [详细]
  • 基于layUI的图片上传前预览功能的2种实现方式
    本文介绍了基于layUI的图片上传前预览功能的两种实现方式:一种是使用blob+FileReader,另一种是使用layUI自带的参数。通过选择文件后点击文件名,在页面中间弹窗内预览图片。其中,layUI自带的参数实现了图片预览功能。该功能依赖于layUI的上传模块,并使用了blob和FileReader来读取本地文件并获取图像的base64编码。点击文件名时会执行See()函数。摘要长度为169字。 ... [详细]
  • 这是原文链接:sendingformdata许多情况下,我们使用表单发送数据到服务器。服务器处理数据并返回响应给用户。这看起来很简单,但是 ... [详细]
  • 本文介绍了使用Java实现大数乘法的分治算法,包括输入数据的处理、普通大数乘法的结果和Karatsuba大数乘法的结果。通过改变long类型可以适应不同范围的大数乘法计算。 ... [详细]
  • Java序列化对象传给PHP的方法及原理解析
    本文介绍了Java序列化对象传给PHP的方法及原理,包括Java对象传递的方式、序列化的方式、PHP中的序列化用法介绍、Java是否能反序列化PHP的数据、Java序列化的原理以及解决Java序列化中的问题。同时还解释了序列化的概念和作用,以及代码执行序列化所需要的权限。最后指出,序列化会将对象实例的所有字段都进行序列化,使得数据能够被表示为实例的序列化数据,但只有能够解释该格式的代码才能够确定数据的内容。 ... [详细]
  • HDU 2372 El Dorado(DP)的最长上升子序列长度求解方法
    本文介绍了解决HDU 2372 El Dorado问题的一种动态规划方法,通过循环k的方式求解最长上升子序列的长度。具体实现过程包括初始化dp数组、读取数列、计算最长上升子序列长度等步骤。 ... [详细]
  • Android中高级面试必知必会,积累总结
    本文介绍了Android中高级面试的必知必会内容,并总结了相关经验。文章指出,如今的Android市场对开发人员的要求更高,需要更专业的人才。同时,文章还给出了针对Android岗位的职责和要求,并提供了简历突出的建议。 ... [详细]
  • 本文讨论了Alink回归预测的不完善问题,指出目前主要针对Python做案例,对其他语言支持不足。同时介绍了pom.xml文件的基本结构和使用方法,以及Maven的相关知识。最后,对Alink回归预测的未来发展提出了期待。 ... [详细]
  • android listview OnItemClickListener失效原因
    最近在做listview时发现OnItemClickListener失效的问题,经过查找发现是因为button的原因。不仅listitem中存在button会影响OnItemClickListener事件的失效,还会导致单击后listview每个item的背景改变,使得item中的所有有关焦点的事件都失效。本文给出了一个范例来说明这种情况,并提供了解决方法。 ... [详细]
  • Oracle Database 10g许可授予信息及高级功能详解
    本文介绍了Oracle Database 10g许可授予信息及其中的高级功能,包括数据库优化数据包、SQL访问指导、SQL优化指导、SQL优化集和重组对象。同时提供了详细说明,指导用户在Oracle Database 10g中如何使用这些功能。 ... [详细]
author-avatar
Fxnananana
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有