ThinkPHP6 获取上传文件属性及自定义文件验证及上传处理

news/2024/11/24 19:52:10/

TP^6.1文件上传有封装方法,如果不想用封装的,自定义上传怎么获取文件属性呢

目录

TP文件信息

打印上传文件信息

获取文件属性方法

1.获取文件大小(单位bytes)

2.获取文件后缀

3.获取文件上传路径

4.获取文件名称

5.上传文件

6.获取上传服务器错误

封装上传方法实现

代码如下

调用方法

返回结果

总结


TP文件信息

$file变量是一个\think\File对象,你可以获取相关的文件信息

支持使用SplFileObject类的属性和方法(SplFileObject是php环境中的类)

还有TP底层封装的UploadedFile类也有一些获取文件信息的属性和方法。

打印上传文件信息

think\file\UploadedFile Object
([test:think\file\UploadedFile:private] => [originalName:think\file\UploadedFile:private] => 2.jpg[mimeType:think\file\UploadedFile:private] => application/octet-stream[error:think\file\UploadedFile:private] => 0[hash:protected] => Array()[hashName:protected] => [pathName:SplFileInfo:private] => C:\Windows\php1A92.tmp[fileName:SplFileInfo:private] => php1A92.tmp
)

获取文件属性方法

1.获取文件大小(单位bytes)

$file->getSize();

2.获取文件后缀

$file->getOriginalExtension();

3.获取文件上传路径

$file->getPathname();

4.获取文件名称

$file->getOriginalName();

5.上传文件

$file->move($filePath, $newname);

参数1:要上传的路径

参数2:文件新名称

6.获取上传服务器错误

需要在请求接收文件时捕获异常

try {$file = request()->file('file');
} catch (\Exception $e) {print_r($e->getMessage());
}

 

封装上传方法实现

代码如下

*** 生成一个随机名字(当前的年月日时分秒+随机数字+后缀名)* @return string 文件的新名字*/
protected function randName()
{// 1, 生成文件的时间部分$name = date('YmdHis');// 2, 加上随机产生的6位数$str = '0987653214';for ($i = 0; $i < 6; $i++) {$name .= $str[mt_rand(0, strlen($str) - 1)];}return $name;
}/*** 实现文件上传* @param object $file 上传的文件的对象信息* @param string $path 文件上传的目录* @return string|array 上传失败返回原因 成功返回文件的新名字数组*/
public function move($file, $path)
{try {// 判断逻辑错误$maxSize = 80 * 1024;if ($file->getSize() > $maxSize) {return '上传失败,超出了文件限制的大小!';}// 判断文件类型$ext = strtolower($file->getOriginalExtension());if (!in_array($ext, ['png', 'jpg', 'jpeg', 'pdf', 'webp'], true)) {// 非法的文件类型return '上传的图片的类型不正确,允许的类型有:' . implode(',', $this->allowed_ext);}// 文件原名称(带扩展类型)$originalName = $file->getOriginalName();// 得到文件随机名称和相应文件夹$newname = $this->randName();$newname = $newname . '.' . $ext;$filePath = $this->rootPath . $path . '/' . date('Ymd') . '/';$file->move($filePath, $newname);return ['path' => $filePath . $newname];} catch (\Exception $e) {return $e->getMessage() . $e->getLine();}
}

调用方法

$name = $this->move($file, 'tp');
print_r($name);die;

返回结果

./uploads/tp/20230201/20230201142943441364.jpg

总结

这样自己利用底层方法,简单实现上传文件验证、保存就实现了。同样一个功能实现的方法有很多种,看你习惯使用哪个了。

 


http://www.ppmy.cn/news/21587.html

相关文章

全网最详细的mybatis plus 条件构造器queryWrapper学习,比如and(),eq(),or(),like()等方法以及分页操作

文章目录1. 引言2. 结构关系3. 环境配置3.1 引入jar包3.2 创建数据源3.2 创建User实体类3.4 创建UserMapper类3.5 创建UserService类4. 操作演示5. 注意事项1. 引言 mybatis大家都有使用过&#xff0c;既面向对象又灵活可配。不友好的地方是&#xff0c;会随着使用出现大量xml…

电子仿真软件MultiSIM

Multisim是美国国家仪器(NI)有限公司推出的以Windows为基础的仿真工具&#xff0c;适用于板级的模拟/数字电路板的设计工作。它包含了电路原理图的图形输入、电路硬件描述语言输入方式&#xff0c;具有丰富的仿真分析能力。 目前MultiSIM最新版本为14.2&#xff0c;可通过NI的…

RPA自动化办公06——Uibot中的UB编程语言基础

参考&#xff1a;UB语言参考_UiBot开发者指南 虽然Uibot用命令就行&#xff0c;但是编程习惯会让程序员们更喜欢看源代码&#xff0c;有时候写源代码会更加方便&#xff0c;所有要学习UB的语言基础。 它很简单&#xff0c;和Python很像&#xff0c;下面简单了解一个各种基础语…

南京小米java面经(一面)

目录1.java支持多继承吗2.线程的生命周期3.线程和进程的区别4.单例模式有几种5.写一下双重锁的单例6.jvm有哪些区域7.jvm哪些区域是线程共享的&#xff0c;哪些是线程私有的8.gc中判断对象可回收的方式有哪些9.gc垃圾回收算法有哪些10.哪些对象可以作为gc root11.gc中的引用计数…

POE交换机全方位解读(中)

POE供电距离到底怎么算 只针对符合IEEE802.3af/at 标准PoE设备 ① 网线对供电距离的影响 首先我们先来看下表IEEE802.af和IEEE802.3at标准中对Cat5e网线要求&#xff1a; 说明&#xff1a;Type 1 value和Type 2 value 分别指IEEE802.3af和IEEE802.3at的要求。 从表中可以看出&a…

tf.keras.layers.Embedding() 详解

Embedding layery 参数如下&#xff1a; tf.keras.layers.Embedding(input_dim,output_dim,embeddings_initializer"uniform",embeddings_regularizerNone,activity_regularizerNone,embeddings_constraintNone,mask_zeroFalse,input_lengthNone,**kwargs ) 输入…

PowerCLi 批量多esxi主机创建登陆用户

官网PowerCLI参数配置参考 New-VMHostAccount 创建用户参考New-VIRole 创建权限组参考Get-VIPrivilege 查询所有角色层配置信息参考创建批量多主机esxi登陆用户一键脚本 <

【string类的简单模拟实现】

目录 1 类中成员变量的声明 2 迭代器 3 一些常用接口 4 六大默认函数 4.1 构造 4.2 拷贝构造 4.3 赋值运算符重载 4.4 析构 5 开空间&&增删查改 6 其他运算符重载 1 类中成员变量的声明 通过上一篇文章对string类的简单使用相信大家对于string类中成员变量已…