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

news2024/12/28 6:52:12

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.coloradmin.cn/o/193349.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

XSS Challenges通关教程

11.XSS Challenges通关教程 Stage#1 直接在search 输入框中输入payload&#xff1a; <script>alert(document.domain)</script> 点击search就XSS攻击成功了。 Stage #2 尝试直接输入<script>alert(document.domain)</script>&#xff0c;发现并未…

【2005NOIP普及组】T4.循环 代码解析

【2005NOIP普及组】T4.循环 代码解析 时间限制: 1000 ms 内存限制: 65536 KB 【题目描述】 乐乐是一个聪明而又勤奋好学的孩子。他总喜欢探求事物的规律。一天,他突然对数的正整数次幂产生了兴趣。 众所周知,2的正整数次幂最后一位数总是不断的在重复2,4,8,6,2,…

使用PyTorch构建卷积神经网络(CNN)源码(详细步骤讲解+注释版) 01 手写数字识别

1 卷积神经网络&#xff08;CNN&#xff09;简介 在使用PyTorch构建GAN生成对抗网络一文中&#xff0c;我们使用GAN构建了一个可以生成人脸图像的模型。但尽管是较为简单的模型&#xff0c;仍占用了1G左右的GPU内存&#xff0c;因此需要探索更加节约资源的方式。 卷积神经网络…

vue 文件.env.production、.env.development简析

静下来 慢慢看 首先 我们需要搭建一个项目 依赖包会自动下载好 无需自己 npm i .env 无论什么环境都会加载 .env.production 生产环境加载 .env.development 测试开发环境加载 我们下面的例子分开来写 只用 .env.production .env.development 在项目根目录新建两个文件 分别…

Git和SVN

一&#xff1a;两者的区别 ——Git是分布式版本控制系统&#xff0c;SVN是集中式版本控制系统 ——集中式版本控制系统 早期出现的版本控制系统有&#xff1a;SVN、CVS等&#xff0c;它们是集中式版本控制系统&#xff0c;集中式版本控制系统有一个单一的集中管理的服务器&…

【微服务】分布式搜索引擎elasticsearch(2)

分布式搜索引擎elasticsearch&#xff08;2&#xff09;1.DSL查询文档1.1.DSL查询分类1.2.全文检索查询1.2.1.使用场景1.2.2.基本语法1.2.3.示例1.2.4.总结1.3.精准查询1.3.1.term查询1.3.2.range查询1.3.3.总结1.4.地理坐标查询1.4.1.矩形范围查询1.4.2.附近查询1.5.复合查询1…

Power BI饼图

饼图展现的是个体占总体的比例&#xff0c;利用扇面的角度来展示比例大小。 在PowerBI默认的可视化对象中当然也有这种标准饼图&#xff0c;通过点击拖拽轻松生成&#xff0c; 通过对标题和图例的格式稍加设置&#xff0c;一个简单而不失专业的饼图就可以用了&#xff0c; 饼…

学术加油站|HIST,面向海量数据的学习型多维直方图

编者按 本文系东北大学李俊虎所著&#xff0c;也是「 OceanBase 学术加油站」系列第九篇内容。 「李俊虎&#xff1a;东北大学计算机科学与工程学院在读硕士生&#xff0c;课题方向为数据库查询优化&#xff0c;致力于应用 AI 技术改进传统基数估计器&#xff0c;令数据库选择…

mysql逻辑架构和数据库缓冲池

逻辑架构 典型的CS架构&#xff0c;服务端程序使用的是mysqld 客户端进程向服务器进程发送一段文本&#xff08;SQL语句&#xff09;&#xff0c;服务器进程处理后再向客户端进程发送文本&#xff08;处理结果&#xff09; # 应用连接层: # 连接处理,用户鉴权(username,host…

分享|2023年全球市场准入认证咨讯

作为全球应用安全科学专家&#xff0c;UL Solutions服务全球100多个国家和地区的客户&#xff0c;将产品安全、信息安全和可持续性挑战转化为客户的机遇。UL Solutions 提供测试、检验、认证&#xff08;TIC&#xff09;&#xff0c;以及软件产品和咨询服务&#xff0c;以支持客…

Deep Learning for 3D Point Clouds: A Survey - 3D点云的深度学习:一项调查 (IEEE TPAMI 2020)

Deep Learning for 3D Point Clouds: A Survey - 3D点云的深度学习&#xff1a;一项调查&#xff08;IEEE TPAMI 2020&#xff09;摘要1. 引言2. 背景2.1 数据集2.2 评估指标3. 3D形状分类3.1 基于多视图的方法3.2 基于体积的方法3.3 基于点的方法3.3.1 逐点MLP方法3.3.2 基于卷…

AI助力多文档审查丨合同风险审查、招投标文件、合同和中标通知书一致性审查

当下&#xff0c;企业管理的数据和文档管理中充斥着大量有复用价值的数据、资料和内容性信息。每一家企业都有许多商业文档和法律文档需要使用和维护&#xff0c;其中包含了不同语言文字、手写体、数字、公式等。然而&#xff0c;目前企业的各种文档资料仍主要依靠人工手段进行…

【Redis】Redis面试题详解与使用案例(金三银四面试专栏启动)

&#x1f4eb;作者简介&#xff1a;小明java问道之路&#xff0c;2022博客之星全国TOP3&#xff0c;专注于后端、中间件、计算机底层、架构设计演进与稳定性建工设优化。 文章内容兼具广度深度、大厂技术方案&#xff0c;对待技术喜欢推理加验证&#xff0c;就职于知名金融公司…

ipv6实验

r1的配置为 [r1]int g0/0/0 [r1-GigabitEthernet0/0/0]ip address 12.1.1.1 24 [r1]int lo0 [r1-LoopBack0]ip address 1.1.1.1 32 [r1]ip route-static 0.0.0.0 0 12.1.1.2 r2的配置为 [r2]int g0/0/0 [r2-GigabitEthernet0/0/0]ip address 12.1.1.2 24 [r2]int lo0 […

小红书破局品牌增长:4大阶段+8个种草建议

品牌如何从激烈的竞争中突围&#xff0c;成为快速增长的“黑马”&#xff1f;本文就和大家一起聊聊围绕产品面对不同阶段的人群“种草”策略&#xff0c;希望能够帮助品牌更好地与用户沟通并提升营销效率&#xff0c;实现品效合一。 1、种草1.0 —— 立住产品&#xff0c;抢占赛…

Minecraft 1.19.2 Fabric模组开发 10.建筑生成

我们本次尝试在Fabric 1.19.2中生成一个自定义的建筑。 效果展示效果展示效果展示 由于版本更新缘故&#xff0c;1.19的建筑生成将不涉及任何Java包的代码编写&#xff0c;只需要在数据包中对建筑生成进行自定义。 1.首先我们要使用游戏中的结构方块制作一个建筑,结构方块使用…

企业内部沟通即时通讯软件要怎么选?

随着企业信息化的快速发展&#xff0c;为了工作效率的提高&#xff0c;即时通讯工具已经成为了众多企业办公时的标配&#xff0c;同时&#xff0c;各大企业对即时通讯功能的要求也越来越高。但是&#xff0c;现在市场上即时通信软件众多&#xff0c;各种功能和服务都是参差不齐…

python爬虫基本库的使用

博主简介&#xff1a;博主是一个大二学生&#xff0c;主攻人工智能领域研究。感谢缘分让我们在CSDN相遇&#xff0c;博主致力于在这里分享关于人工智能&#xff0c;C&#xff0c;python&#xff0c;爬虫等方面的知识分享。如果有需要的小伙伴&#xff0c;可以关注博主&#xff…

Java面试基础篇

目录 一、集合 1.集合与集合之间的区别 2.集合子类之间的区别&#xff08;数据结构&#xff09; 二、线程 三、面向对象 继承 多态 四、异常 五、IO流 六、序列化与反序列化 今天给大家分享 Java基础篇的面试题&#xff0c;小编给大家稍微整理了一下&#xff0c;希望即…

RHCE(web服务器)

文章目录一、www简介&#xff08;一&#xff09;网址及HTTP简介&#xff08;二&#xff09;HTTP协议请求的工作流程二、www服务器的类型&#xff08;一&#xff09;仅提供用户浏览的单向静态网页&#xff08;二&#xff09;提供用户互动接口的动态网站三、www服务器的基本配置四…