ThinkPHP3.1快速入门(19)文件上传
发布时间:2020-12-14 13:53:55 所属栏目:大数据 来源:网络整理
导读:获取上传类 ThinkPHP的扩展中提供了文件上传类库UploadFile,可以在在http://www.thinkphp.cn/extend/224.html下载,或者下载官方的完整扩展包(http://www.thinkphp.cn/down/253.html)里面也已经包含上传扩展类了。如果是单独下载的上传类库,把解压后的Up
获取上传类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系统其他类库):
上传表单上传表单无需特别处理,下面是一个最简单的单文件上传表单:上传操作接下来就是定义上传操作了,我们在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();// 实例化上传类
//设置附件上传目录
另外一种方式是,在实例化的同时传入上传参数,例如:
$upload->savePath = './Uploads/'; //设置需要生成缩略图,仅对图像文件有效 $upload->thumb = true; //设置需要生成缩略图的文件后缀 $upload->thumbPrefix = 'm_,s_'; //生产2张缩略图 //设置缩略图最大宽度 $upload->thumbMaxWidth = '200,50'; //设置缩略图最大高度 $upload->thumbMaxHeight = '200,50';
import('ORG.Net.UploadFile');
无论采用何种方式,设置好上传的参数后,就可以调用UploadFile类的upload方法进行附件上传,如果失败,返回false,并且用getErrorMsg方法获取错误提示信息;如果上传成功,可以通过调用getUploadFileInfo方法获取成功上传的附件信息列表。getUploadFileInfo方法的返回值是一个二维数组,其中的每个元素就是上传的附件信息。每个附件信息又是一个记录了下面信息的数组,包括:
$config['savePath'] = './Uploads/'; $config['thumb'] = true; $config['thumbPrefix'] = 'm_,s_'; $config['thumbMaxWidth'] = '200,50'; $config['thumbMaxHeight'] = '200,50'; $upload = new UploadFile($config);// 实例化上传类并传入参数
例如,下面表示把上传信息保存到数据表的字段:
//取得成功上传的文件信息
官网示例中的图像上传示例可以查看上传和显示效果:$info = $upload->getUploadFileInfo(); $model = M('Photo'); //保存当前数据对象 $data['image'] = $info[0]['savename']; $data['create_time'] = NOW_TIME; $model->add($data); 多文件上传上传类默认就支持多文件上传,只需要修改表单页面:如果需要使用多个文件上传,只需要修改表单,把 两种方式的多附件上传表单文件上传类都可以自动识别。 上传成功后,还是使用getUploadFileInfo方法获取成功上传的附件信息。 单个上传上传类还提供了单个上传的方法
import("ORG.Net.UploadFile");
uploadOne方法表示每次执行只上传指定的一个文件,并且如果上传成功的话uploadOne方法的返回值就是成功上传的文件信息,和getUploadFileInfo方法不同的是,这个文件信息是一个仅包含单个文件信息的一维数组。如果发生错误,依然是通过getErrorMsg方法获取错误信息。$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';
设置后,会自动对上传文件进行哈希编码后的第一个和第二个字母分别作为一级和二级子目录名称保存。如果hashLevel不设置,则默认为一级子目录。$upload->hashLevel = 2; 二、日期子目录 这种方式也比较常用,用日期作为子目录名称,
$upload->subType = 'date';
dateFormat参数则用于配合设置日期的格式,如果不设置,则默认为Ymd。$upload->dateFormat = 'Y-m-d'; 三、自定义子目录 这种方式作为一种更灵活的子目录保存方式,是最新添加的功能支持。
$upload->subType = 'custom';
自定义子目录方式的优势在于,可以动态设置子目录名称,上面的定义就采用了当前用户ID作为子目录名称。$upload->subDir = get_user_id(); 生成缩略图缩略图功能需要Image扩展类的支持,所以确保你已经有了这个扩展类。然后设置如下参数:
//设置需要生成缩略图,仅对图像文件有效
缩略图的前(后)缀数量必须和宽度数量对应,表示生成多个缩略图。$upload->thumb = true; //设置需要生成缩略图的文件前缀 $upload->thumbPrefix = 'm_,50'; //设置生成缩略图后移除原图 $upload->thumbRemoveOrigin = true; 生成的缩略图默认位于保存文件的实际所在目录(包括子目录的情况),当然你也可以指定统一的缩略图保存路径,例如:
$upload->thumbPath = './Uploads/thumb/';
这里的thumbPath参数必须用“/”结尾。我们可以设置缩略图采用统一的文件后缀,例如:
// 设置缩略图的固定后缀
更多的上传类用法可以通过上传参数的设置来完成,留给大家慢慢挖掘了。
$upload->thumbExt = 'jpg'; (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |