前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >ThinkPHP上传文件

ThinkPHP上传文件

作者头像
PM吃瓜
发布2019-08-13 10:54:27
2.4K0
发布2019-08-13 10:54:27
举报
文章被收录于专栏:PM吃瓜(公众号)PM吃瓜(公众号)

如果是核心版ThinkPHP仍需要下载扩展类

1.上传表单

<form id="upload" method='post' action="__URL__/upload/" enctype="multipart/form-data">

<input name="image" type="file" />

<input type="submit" value="提交" >

</form>

2.上传操作

// 文件上传

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('上传成功!');

}

}

3.参数设置

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';

getUploadFileInfo方法的返回值是一个二维数组,其中的每个元素就是上传的附件信息。每个附件信息又是一个记录了下面信息的数组,包括:

key 附件上传的表单名称

savepath 上传文件的保存路径

name 上传文件的原始名称

savename 上传文件的保存名称

size 上传文件的大小

type 上传文件的MIME类型

extension 上传文件的后缀类型

hash 上传文件的哈希验证字符串(作用是检验文件完整性)

4.多文件上传

<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[]'>

5.单个上传

6.上传文件的命名规范:确保文件不会产生冲突或者覆盖的情况。

1)采用函数方式:$upload->saveRule = 'time'; // 采用时间戳命名

$upload->saveRule = 'com_create_guid'; // 采用GUID序列命名

也可以采用用户自定义函数:$upload->saveRule = 'myfun'; // 采用自定义函数命名

2)直接设置上传文件名:$upload->saveRule = time().'_'.mt_rand();

7.子目录保存

三种方式设置子目录:

1)哈希子目录:$upload->subType = 'hash';

$upload->hashLevel = 2;

设置后,会自动对上传文件进行哈希编码后的第一个和第二个字母分别作为一级和二级子目录名称保存。如果hashLevel不设置,则默认为一级子目录。

2)日期子目录:$upload->subType = 'date';

$upload->dateFormat = 'Y-m-d';

3)自定义子目录:$upload->subType = 'custom';

$upload->subDir = get_user_id();

自定义子目录方式的优势在于,可以动态设置子目录名称

8.生成缩略图

//设置需要生成缩略图,仅对图像文件有效

$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';

【20.验证码】:需要图像处理类和字符处理类String的扩展。由于验证码显示采用了GD库支持,所以需要环境支持GD库。

1.生成验证码

为了避免受权限控制的影响,我们通常把这个方法放到公共Action或者无需授权就能访问的控制器(例如PublicAction)中,下面我们以放到PublicAction控制器类中为例,代码如下:

class PublicAction extends Action{

Public function verify(){

import('ORG.Util.Image');

Image::buildImageVerify();

}

}

定义后,我们可以在任何需要验证码的模块中调用Public模块的verify方法来显示验证码,需要做的仅仅是在需要的模板中添加如下调用代码:

< img src='__APP__/Public/verify/' />

如果你的验证码不能正常显示,请检查:

是否已经安装GD库支持并正常开启;

Image类库以及String类库是否在正确的位置以及是否正确导入;

验证码输出之前是否有任何的其他输出(尤其是UTF8的BOM头信息输出);

2.验证码显示设置:

buildImageVerify($length,$mode,$type,$width,$height,$verifyName)

length 验证码的长度,默认为4位数

model 验证字符串的类型,默认为数字,其他支持类型有0 字母 1 数字 2 大写字母 3 小写字母 4中文 5混合

type 验证码的图片类型,默认为png

width 验证码的宽度,默认会自动根据验证码长度自动计算

height 验证码的高度,默认为22

verifyName 验证码的SESSION记录名称,默认为verify

3.验证输入

在Action中使用下面的代码判断就行了:

if(session('verify') != md5($_POST['verify'])) {

$this->error('验证码错误!');

}

4.中文验证码

BuildImageVerify方法不支持中文验证码的显示,如果需要显示中文验证码,请使用GBVerify方法,用法示例:

Public function verify(){

import("ORG.Util.Image");

Image::GBVerify();

}

5.验证码刷新

一般我们是用js方法来控制验证码的刷新

<script language="JavaScript">

function fleshVerify(){

//重载验证码

var time = new Date().getTime();

document.getElementById('verifyImg').src= '__APP__/Public/verify/'+time;

}

</script>

< img id="verifyImg" src='__APP__/Public/verify/' onclick="fleshVerify()" />

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2019-01-27,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 Tech爬虫 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
验证码
腾讯云新一代行为验证码(Captcha),基于十道安全栅栏, 为网页、App、小程序开发者打造立体、全面的人机验证。最大程度保护注册登录、活动秒杀、点赞发帖、数据保护等各大场景下业务安全的同时,提供更精细化的用户体验。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档