ThinkPHP教程_PHP框架之ThinkPHP(十三)【文件上传】
2016-09-25 13:43
239 查看
一、文件上传
文件上传需要使用到ORG类库包中的Net.UploadFile类,所以得通过import()函数引入该类
1、基本功能
也就是ORG.Net.UploadFile类的基本功能,不过有些功能(对上传的图片文件生成缩略图)得结合ThinkPHP的ORG.Util.Image类实现,不过ORG.Util.Image类不需要手动引入,而是在UploadFile类中upload方法自动引入的!
·基本上传(单文件上传)
·批量上传
批量上传相对于基本上传,只需要修改下表单即可
UploadFile类会自动识别批量上传,所以基本上传和批量上传有关UploadFile类的操作是一样的,主要是上传成功之后返回的文件信息有细微差异。返回的都是一个包含上传文件的信息的二维数组(文件信息在内层数组中),只不过基本上传返回的二维数组只包含一个元素,而批量上传返回的二维数组包含多个元素!进而影响将上传的文件信息保存到数据库中的操作而已,其实也没多差别,反正都是二维数组,直接使用addAll()方法批量插入即可
·支持图片生成缩略图
如果上传的文件是图片,则可以生成缩略图进行保存
·自定义参数上传
·上传检测
比如文件大小、文件后缀、文件类型等等。ps,文件后缀与文件类型不是一回事
·支持覆盖方式
·支持上传类型、附件大小、上传路径定义
·支持子目录保存上传文件
开启子目录保存上传文件后,会自动生成子目录,且子目录的生成方式有hash和日期两种,且如果是日期,还可以定义日期格式
·支持上传文件的hash验证
2、上传表单
特别注意,必须要在表单中添加enctype="multipart/form-data"属性,否则该表单不支持文件上传功能
3、上传动作
为了结构优化,将上传动作分为两个部分,即在FileAction模块中定义两个private方法,分别是up()方法和keepToDb()方法,然后在upload动作中依次调用这两个方法!
·up()方法
主要功能就是上传文件
ps,UploadFile类的一些属性的功能可以参考源码或手册,但是个人建议看源码,因为注释得很明白!
#maxSize:文件上传的最大文件大小,以字节为单位,默认为-1,表示不限大小
#savePath:文件保存路径(必须)
#saveRule:上传文件的保存规则,必须是一个无需任何参数的函数名,例如可以是 time、uniqid、com_create_guid等,但必须能保证生成的文件名是唯一的,默认是uniqid。实际上这里就是指定一个回调函数,来生成一个唯一的字串作为保存文件的文件名,所以完全可以自定义一个回调函数,只要能保证生成的字符串是唯一的即可
#hashType:上传文件的哈希验证方法,默认是md5_file。也可以是sha1_file,同理也是指定一个回调函数!
#autoCheck:是否自动检测附件,默认为自动检测,即值为true
#uploadReplace:存在同名文件是否覆盖,默认为不覆盖,即值为false
#allowExts:允许上传的文件后缀,默认为空数组,不做后缀检查
#allowTypes:允许上传的文件类型,默认为空数组,不做后缀检查
#autoSub:是否使用子目录保存文件,默认不使用,即值为false
以下3项是在开启子目录保存文件是生效
#subType:子目录创建方式,默认为hash,可以设置为hash或date
#dateFormat:date方式创建子目录时,日期格式,默认为Ymd
#hashLevel:hash方式创建子目录时,子目录层数,默认为1层
------
#thumb:如果上传的文件是图片,是否生成缩略图,默认为不生成,即值为false
以下6项是在开缩略图生成时生效
#thumbMaxWidth:缩略图的最大宽度,如果生成多个(根据每一张图生成多个),则用,分隔
#thumbMaxHeight:缩略图的最大高度,如果生成多个(同理),则用,分隔
#thumbPrefix:缩略图文件名前缀,默认为thumb_,如果有多个(同理),则用,分隔,否则其它的没有前缀
#thumbFixfix:缩略图文件名后缀,默认为空
#thumbPath:缩略图的保存路径,默认为空,留空的则为savePath
#thumbFile:缩略图的文件名,默认为为空,即为上传文件名加上前后缀(指定了的话)
#thumbRemoveOrigin:生成缩略图之后是否删除原图,默认为不删除,即值为false
设置好上传的参数后,就可以调用UploadFile类的upload方法进行附件上传,如果失败,返回false,那么可以用getErrorMsg方法获取错误提示信息;如果上传成功,返回true,则可以通过调用getUploadFileInfo方法获取成功上传的附件信息列表。因此getUploadFileInfo方法的返回值是一个二维数组,其中外层元素就是上传的附件信息。每个附件信息又是一个记录了下面信息的数组
#key:附件上传的表单名称
#savepath:上传文件的保存路径
#name:上传文件的原始名称,即在客户端机器中保存的文件名
#savename:上传文件的保存名称,即在服务器端机器中保存的文件名
#size:上传文件的大小
#type:上传文件的MIME类型
#extension:上传文件的后缀类型
#上传文件的哈希验证字符串
那么就可以通过获取到附加信息写入到数据库中,通常只需要savepath,当然也可以将其他信息写入!附件信息有两种保存方式,一是就保存到当前数据表(即与表单中其它信息一同存入一张表中,比如说将用户名、姓名、联系方式、简历附件savepath存入一张表)、二是单独保存到附件表中(即表单中其它信息如用户名、姓名、联系方式存入信息表中,而简历附件savepath存入附件表,再在附件表中设置一个字段与信息表关联即可)
·keepToDb()方法
4、源码
文件上传需要使用到ORG类库包中的Net.UploadFile类,所以得通过import()函数引入该类
1、基本功能
也就是ORG.Net.UploadFile类的基本功能,不过有些功能(对上传的图片文件生成缩略图)得结合ThinkPHP的ORG.Util.Image类实现,不过ORG.Util.Image类不需要手动引入,而是在UploadFile类中upload方法自动引入的!
·基本上传(单文件上传)
·批量上传
批量上传相对于基本上传,只需要修改下表单即可
UploadFile类会自动识别批量上传,所以基本上传和批量上传有关UploadFile类的操作是一样的,主要是上传成功之后返回的文件信息有细微差异。返回的都是一个包含上传文件的信息的二维数组(文件信息在内层数组中),只不过基本上传返回的二维数组只包含一个元素,而批量上传返回的二维数组包含多个元素!进而影响将上传的文件信息保存到数据库中的操作而已,其实也没多差别,反正都是二维数组,直接使用addAll()方法批量插入即可
·支持图片生成缩略图
如果上传的文件是图片,则可以生成缩略图进行保存
·自定义参数上传
·上传检测
比如文件大小、文件后缀、文件类型等等。ps,文件后缀与文件类型不是一回事
·支持覆盖方式
·支持上传类型、附件大小、上传路径定义
·支持子目录保存上传文件
开启子目录保存上传文件后,会自动生成子目录,且子目录的生成方式有hash和日期两种,且如果是日期,还可以定义日期格式
·支持上传文件的hash验证
2、上传表单
特别注意,必须要在表单中添加enctype="multipart/form-data"属性,否则该表单不支持文件上传功能
3、上传动作
为了结构优化,将上传动作分为两个部分,即在FileAction模块中定义两个private方法,分别是up()方法和keepToDb()方法,然后在upload动作中依次调用这两个方法!
·up()方法
主要功能就是上传文件
ps,UploadFile类的一些属性的功能可以参考源码或手册,但是个人建议看源码,因为注释得很明白!
#maxSize:文件上传的最大文件大小,以字节为单位,默认为-1,表示不限大小
#savePath:文件保存路径(必须)
#saveRule:上传文件的保存规则,必须是一个无需任何参数的函数名,例如可以是 time、uniqid、com_create_guid等,但必须能保证生成的文件名是唯一的,默认是uniqid。实际上这里就是指定一个回调函数,来生成一个唯一的字串作为保存文件的文件名,所以完全可以自定义一个回调函数,只要能保证生成的字符串是唯一的即可
#hashType:上传文件的哈希验证方法,默认是md5_file。也可以是sha1_file,同理也是指定一个回调函数!
#autoCheck:是否自动检测附件,默认为自动检测,即值为true
#uploadReplace:存在同名文件是否覆盖,默认为不覆盖,即值为false
#allowExts:允许上传的文件后缀,默认为空数组,不做后缀检查
#allowTypes:允许上传的文件类型,默认为空数组,不做后缀检查
#autoSub:是否使用子目录保存文件,默认不使用,即值为false
以下3项是在开启子目录保存文件是生效
#subType:子目录创建方式,默认为hash,可以设置为hash或date
#dateFormat:date方式创建子目录时,日期格式,默认为Ymd
#hashLevel:hash方式创建子目录时,子目录层数,默认为1层
------
#thumb:如果上传的文件是图片,是否生成缩略图,默认为不生成,即值为false
以下6项是在开缩略图生成时生效
#thumbMaxWidth:缩略图的最大宽度,如果生成多个(根据每一张图生成多个),则用,分隔
#thumbMaxHeight:缩略图的最大高度,如果生成多个(同理),则用,分隔
#thumbPrefix:缩略图文件名前缀,默认为thumb_,如果有多个(同理),则用,分隔,否则其它的没有前缀
#thumbFixfix:缩略图文件名后缀,默认为空
#thumbPath:缩略图的保存路径,默认为空,留空的则为savePath
#thumbFile:缩略图的文件名,默认为为空,即为上传文件名加上前后缀(指定了的话)
#thumbRemoveOrigin:生成缩略图之后是否删除原图,默认为不删除,即值为false
设置好上传的参数后,就可以调用UploadFile类的upload方法进行附件上传,如果失败,返回false,那么可以用getErrorMsg方法获取错误提示信息;如果上传成功,返回true,则可以通过调用getUploadFileInfo方法获取成功上传的附件信息列表。因此getUploadFileInfo方法的返回值是一个二维数组,其中外层元素就是上传的附件信息。每个附件信息又是一个记录了下面信息的数组
#key:附件上传的表单名称
#savepath:上传文件的保存路径
#name:上传文件的原始名称,即在客户端机器中保存的文件名
#savename:上传文件的保存名称,即在服务器端机器中保存的文件名
#size:上传文件的大小
#type:上传文件的MIME类型
#extension:上传文件的后缀类型
#上传文件的哈希验证字符串
那么就可以通过获取到附加信息写入到数据库中,通常只需要savepath,当然也可以将其他信息写入!附件信息有两种保存方式,一是就保存到当前数据表(即与表单中其它信息一同存入一张表中,比如说将用户名、姓名、联系方式、简历附件savepath存入一张表)、二是单独保存到附件表中(即表单中其它信息如用户名、姓名、联系方式存入信息表中,而简历附件savepath存入附件表,再在附件表中设置一个字段与信息表关联即可)
·keepToDb()方法
4、源码
<html> <head> <title>文件上传</title> </head> <body> <volist name='files' id='file'> <img src="__PUBLIC__/Uploads/{$file.file_path}"/> </volist> <form action="__URL__/upload" method="post" enctype="multipart/form-data"> 用户名:<input type="text" name="username"/><br/> 选择文件:<input type="file" name="file[]"/><br/> <input type="file" name="file[]"/><br/> <input type="submit" value="上传"/> </form> </body> </html>
<?php class FileAction extends Action{ public function index(){ $File=new Model('File'); $files=$File->select(); $this->assign("files",$files); $this->display(); } public function upload(){ if(empty($_FILES)){ $this->error("请选择上传的文件"); }else{ $file=$this->up(); if($this->keepToDb($file)){ $this->success('上传成功'); }else{ $this->error('写入数据库失败'); } } } // 文件上传 private function up(){ import('ORG.Net.UploadFile'); $upload = new UploadFile();// 实例化上传类 $upload->maxSize = 3145728 ;// 设置附件上传大小 $upload->allowExts = array('jpg', 'gif', 'png', 'jpeg');// 设置附件上传类型 $upload->savePath = './Public/Uploads/';// 设置附件上传目录 $upload->saveRule='uniqid';//设置保存文件名生成方式 $upload->autoSub=true;//开启子目录保存文件 $upload->subType='date';//设置子目录名生成方式 //与缩略图有关 $upload->thumb=true;//开启保存缩略图功能 $upload->thumbMaxWidth='400,200';//设置缩略图大小 $upload->thumbMaxHeight='200,100'; $upload->uploadReplace=true; $upload->thumbPrefix='m_,s_';//设置缩略图文件名前缀 $upload->thumbPath='./Public/Uploads/Thumb/';//设置缩略图保存路径 if(!$upload->upload()) {// 上传错误提示错误信息 $this->error($upload->getErrorMsg()); }else{// 上传成功 return $upload->getUploadFileInfo();//上传成功返回上传文件的信息 } } private function keepToDb($file){ $File=M('File'); /** *将所要插入的数据倒腾到$data[][]中 */ for($i=0;$i<count($file);$i++){ $data[$i]['file_path']=$file[$i]['savename']; } return $File->addAll($data); } } ?>
相关文章推荐
- ThinkPHP文件上传实例教程
- ThinkPHP教程_PHP框架之ThinkPHP(一)【入门和介绍、ThinkPHP版本和文件夹规范、项目入口文件】
- ThinkPHP文件上传实例教程
- asp.net教程:asp.net 上传大文件控件
- MM文件上传与共享详细教程
- Win32汇编教程十三 INI 文件的操作
- vs2005视频教程 之 上传多个文件 视频教程[视频]
- ASP.NET MVC 重点教程一周年版 第十一回 母版页、用户自定义控件及文件上传
- Win32汇编教程十三 INI 文件的操作
- ASP.NET MVC 重点教程一周年版 第十一回 母版页、用户自定义控件及文件上传 推荐
- Asp.net中文件的上传和下载(视频教程)
- Win32汇编教程十三 INI 文件的操作
- HTML教程 - 如何上传文件
- Struts1.x系列教程(9):上传任意多个文件
- ASP.NET MVC 重点教程一周年版 第十一回 母版页、用户自定义控件及文件上传
- Struts2教程7:上传任意多个文件
- Scott Mitchell 的ASP.NET 2.0数据教程之54:上传文件
- Struts2教程7:上传任意多个文件
- [转载][教程]vs2005/.NET2.0 控件演示之 文件上传 《FileUpload》 (二)
- PHP5薄荷教程[13]文件上传