加入收藏 | 网站地图 | | RSS | WAP
你好,游客 登录 注册 搜索

ThinkPHP3.1编程开发快速入门教程之:文件上传

[日期:2013-02-20] 作者: 来源: [字体: ]

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/目录下面。

上传表单

上传表单无需特别处理,下面是一个最简单的单文件上传表单:

<form id="upload" method='post' action="__URL__/upload/" enctype="multipart/form-data">
<input name="image" type="file" />
<input type="submit" value="提交" >
</form>

注意,表单必须添加enctype="multipart/form-data"属性才能支持文件上传功能。

上传操作

接下来就是定义上传操作了,我们在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);// 实例化上传类并传入参数

无论采用何种方式,设置好上传的参数后,就可以调用UploadFile类的upload方法进行附件上传,如果失败,返回false,并且用getErrorMsg方法获取错误提示信息;如果上传成功,可以通过调用getUploadFileInfo方法获取成功上传的附件信息列表。getUploadFileInfo方法的返回值是一个二维数组,其中的每个元素就是上传的附件信息。每个附件信息又是一个记录了下面信息的数组,包括:

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());
        }
    }
}

uploadOne方法表示每次执行只上传指定的一个文件,并且如果上传成功的话uploadOne方法的返回值就是成功上传的文件信息,和getUploadFileInfo方法不同的是,这个文件信息是一个仅包含单个文件信息的一维数组。如果发生错误,依然是通过getErrorMsg方法获取错误信息。

关键词:上传  文件  ThinkPHP 

收藏 推荐 打印 | 录入:blue1000 | 阅读:
本文评论   查看全部评论 (1)
表情: 姓名: 字数
点评:
       
评论声明
  • 尊重网上道德,遵守中华人民共和国的各项有关法律法规
  • 承担一切因您的行为而直接或间接导致的民事/刑事法律责任
  • 本站管理人员有权保留或删除其管辖留言中的任意内容
  • 本站有权在网站内转载或引用您的评论
  • 参与本评论即表明您已经阅读并接受上述条款
第 1 楼
* 匿名 发表于 2016/12/24 18:58:30
http://www.blue1000.com/bkhtml/c19/2012-10/70974.htm 蓬莱阁导游词 http://www.135995.com/show/7520.html 关于布达拉宫的导游词 http://www.135995.com/show/7517.html