Laravel 文件数组总大小验证:使用自定义规则实现

laravel 文件数组总大小验证:使用自定义规则实现

本教程详细介绍了如何在 Laravel 中验证上传文件数组的整体总大小,而非仅限制单个文件大小。通过创建并实现一个自定义验证规则,我们将能够计算所有上传文件的总字节数,并与预设的最大限制进行比较,从而确保文件集合符合业务要求,提供更灵活的文件上传验证机制。

1. 理解问题:文件数组总大小验证的挑战

在 Laravel 中处理文件上传时,如果用户上传的是多个文件(作为一个数组),我们通常会使用 images.* 这样的规则来验证每个文件的类型和大小。例如 images.*’ => ‘mimes:jpg,jpeg,png|max:1000’ 会确保每个图片都是 JPG/PNG 格式且不超过 1000 KB。然而,Laravel 内置的验证规则无法直接对整个文件数组的总大小进行限制。例如,即使单个文件限制为 1MB,用户上传 100 个文件也可能导致总大小过大,超出服务器或存储系统的承受能力。

为了解决这一限制,我们需要一种机制来遍历文件数组,计算所有文件的总大小,并将其与一个预设的阈值进行比较。Laravel 强大的自定义验证规则功能正是为此类复杂场景设计的。

2. 创建自定义验证规则

首先,我们需要使用 Artisan 命令来生成一个新的自定义验证规则。假设我们希望将规则命名为 ArraySize。

php artisan make:rule ArraySize

这会在 app/Rules 目录下创建一个名为 ArraySize.php 的文件。

3. 实现 ArraySize 规则逻辑

打开 app/Rules/ArraySize.php 文件,并按照以下方式修改其内容。

maxSizeInKb = $maxSizeInKb;    }    /**     * 判断验证规则是否通过。     *     * @param  string  $attribute 正在验证的属性名     * @param  mixed  $value 正在验证的属性值(文件数组)     * @return bool     */    public function passes($attribute, $value): bool    {        $totalBytes = 0;        // 确保 $value 是一个数组        if (!is_array($value)) {            return false;        }        foreach ($value as $file) {            // 确保数组中的每个元素都是 UploadedFile 实例            if (!$file instanceof UploadedFile) {                // 如果不是上传文件实例,则验证失败,避免潜在错误                return false;            }            // 累加每个文件的字节大小            $totalBytes += $file->getSize();        }        // 将总字节数转换为 KB,并与设定的最大值进行比较        // 注意:getSize() 返回的是字节数        return ($totalBytes / 1024) maxSizeInKb;    }    /**     * 获取验证失败时返回的错误消息。     *     * @return string     */    public function message(): string    {        return sprintf('所有上传文件的总大小必须小于 %d KB。', $this->maxSizeInKb);    }}

代码解析:

__construct(int $maxSizeInKb): 构造函数接收一个整数参数 $maxSizeInKb,用于设定允许的最大总大小(单位为 KB)。这使得规则可以复用,并根据需要设置不同的限制。passes($attribute, $value): 这是核心逻辑所在。它首先检查 $value 是否确实是一个数组。如果不是,则验证失败。然后,它遍历 $value 数组中的每个元素。对于每个元素,它检查是否为 IlluminateHttpUploadedFile 实例。这确保我们正在处理的是实际上传的文件,并能安全地调用其方法。$file->getSize() 方法用于获取单个文件的字节大小,并将其累加到 $totalBytes 变量中。最后,它将 $totalBytes 转换为 KB ($totalBytes / 1024),并与构造函数中传入的 $maxSizeInKb 进行比较。如果总大小小于或等于允许的最大值,则验证通过 (true);否则,验证失败 (false)。message(): 当 passes() 方法返回 false 时,此方法将返回用户友好的错误消息。sprintf 函数用于动态地将最大允许大小插入到消息中。

4. 在表单请求或控制器中使用自定义规则

现在,我们可以在 Laravel 的表单请求 (Form Request) 或控制器中的验证逻辑中应用这个自定义规则。

首先,确保在文件中引入 ArraySize 规则:

use AppRulesArraySize;// ... 其他 use 语句

然后,在 rules() 方法中添加对 images 字段的 ArraySize 规则。注意,images.* 规则仍然用于验证单个文件的属性(如类型和单个文件大小),而 images 规则则用于验证整个文件数组的总大小。

// ...public function rules(){    return [        'title'               => 'required|max:125',        'quantity'            => 'required|numeric|min:0',        'retail_price'        => 'required|numeric|min:0',        'diamond_shape_id'    => 'required',        'diamond_cut_id'      => 'required',        'diamond_color_id'    => 'required',        'diamond_clarity_id'  => 'required',        'carat_weight'        => 'required',        'diamond_polish_id'   => 'required',        'diamond_symmetry_id' => 'required',        'video_url'           => ['url', new EmbeddableUrl], // 假设 EmbeddableUrl 是另一个自定义规则        'images.*'            => 'mimes:jpg,jpeg,png|max:1000', // 验证每个文件不超过 1000KB (1MB)        'images'              => [new ArraySize(30000)],      // 验证所有文件总大小不超过 30000KB (即 30MB)    ];}

在上述示例中,new ArraySize(30000) 表示我们希望所有上传图片的总大小不超过 30000 KB (即 30 MB)。

5. 注意事项与最佳实践

单位统一: 在自定义规则中,UploadedFile::getSize() 返回的是字节数。在构造函数中传入的 $maxSizeInKb 是 KB。务必在 passes 方法中进行正确的单位转换 ($totalBytes / 1024),以避免混淆和错误。错误消息定制: message() 方法允许你返回完全自定义的错误消息。可以根据应用程序的国际化需求,将其存储在语言文件中,例如 lang/xx/validation.php。结合其他规则: 自定义规则可以与 Laravel 内置的其他验证规则(如 mimes、max 等)无缝结合,共同提供全面的验证。images.* 确保了单个文件的基本属性,而 images 规则则关注集合的整体属性。健壮性考虑: 在 passes 方法中,对 $value 是否为数组以及数组元素是否为 UploadedFile 实例的检查,增强了规则的健壮性,避免在接收到非预期输入时发生错误。性能考量: 对于极大量的文件上传,计算总大小可能涉及 I/O 操作,但对于一般应用场景,其性能开销通常可以忽略不计。

总结

通过创建自定义验证规则 ArraySize,我们成功解决了 Laravel 中验证上传文件数组总大小的挑战。这种方法不仅提供了精确的控制,还保持了 Laravel 验证系统的优雅和可扩展性。掌握自定义规则的创建和使用,是开发复杂 Laravel 应用时一项非常有用的技能,它能帮助你处理各种非标准或业务特定的验证需求,从而构建更健壮、更符合业务逻辑的应用程序。

以上就是Laravel 文件数组总大小验证:使用自定义规则实现的详细内容,更多请关注php中文网其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/1342138.html

赞 (0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
Magento 2 中跨块调用函数的方法与最佳实践
上一篇 2025年12月13日 05:19:03
解决PHP $_POST为空问题:HTML表单字段name属性的关键作用
下一篇 2025年12月13日 05:19:18

相关推荐

  • 格子达论文查重怎么操作_格子达官方检测系统指南

    格子达论文查重怎么操作_格子达官方检测系统指南格子达论文查重怎么操作_格子达官方检测系统指南格子达论文查重怎么操作_格子达官方检测系统指南格子达论文查重怎么操作_格子达官方检测系统指南

    首先登录格子达官网注册账号并登录,接着在个人中心上传符合格式的论文文件,填写必要信息后提交检测,最后等待系统生成报告并下载查看总相似比、AI占比等数据,结合标注内容进行修改。 格子达论文查重怎么操作?这是不少网友都关注的,接下来由PHP小编为大家带来格子达官方检测系统指南,感兴趣的网友一起随小编来瞧…

    2026年9月28日 • 用户投稿
    000
  • Android 应用中页面(Activity)间导航的实现指南

    Android 应用中页面(Activity)间导航的实现指南Android 应用中页面(Activity)间导航的实现指南Android 应用中页面(Activity)间导航的实现指南Android 应用中页面(Activity)间导航的实现指南

    本文详细介绍了在 Android 应用中如何通过按钮实现不同页面(Activity)之间的切换。核心机制是使用 Intent 对象来指定目标 Activity,并通过 startActivity() 方法启动它。文章提供了 MainActivity.java 中的示例代码,并强调了 AndroidM…

    2026年9月28日 • 用户投稿
    000
  • sublime怎么在替换时使用换行符_Sublime查找替换功能中使用换行符

    sublime怎么在替换时使用换行符_Sublime查找替换功能中使用换行符sublime怎么在替换时使用换行符_Sublime查找替换功能中使用换行符sublime怎么在替换时使用换行符_Sublime查找替换功能中使用换行符sublime怎么在替换时使用换行符_Sublime查找替换功能中使用换行符

    在Sublime Text中替换换行需启用正则模式,用n或R表示换行符。开启”.*”按钮后,查找用n、rn或R匹配不同换行格式,替换时用n插入换行,如将逗号替换为n可实现分行效果。 在Sublime Text中进行查找替换时,如果需要使用换行符,可以通过正则表达式模式来实现。…

    2026年9月28日 • 用户投稿
    100
  • 运维新概念:高效积累之道

    运维新概念:高效积累之道运维新概念:高效积累之道运维新概念:高效积累之道运维新概念:高效积累之道

    当前技术更新日新月异,各类语言、工具和理念层出不穷,令人应接不暇。唯有持续学习、不断吸收新知,方能紧跟发展潮流,不被时代淘汰。 1、 IT部门面临诸多挑战 2、 目前,IT部门整体尚未获得充分认可。尽管信息化在各单位日益重要,仍有部分管理者将其视为单纯的成本支出部门,认为其只消耗资源而无法直接创收,…

    2026年9月28日 • 用户投稿
    100
  • 如何下载豆包AI应用 豆包AI应用下载与安装步骤解析

    如何下载豆包AI应用 豆包AI应用下载与安装步骤解析如何下载豆包AI应用 豆包AI应用下载与安装步骤解析如何下载豆包AI应用 豆包AI应用下载与安装步骤解析如何下载豆包AI应用 豆包AI应用下载与安装步骤解析

    豆包ai应用下载安装方法有三种: 一、手机应用商店搜索“豆包”或“Doubao”,确认开发者为“北京字节跳动科技有限公司”后点击安装; 二、直接使用“豆包AI网页版在线使用入口☜☜☜☜直接进入”; 三、注意常见问题如无法找到应用时检查关键词、安装失败时查看存储和系统版本、iOS用户提示“未受信任的企…

    2026年9月28日 • 用户投稿
    000
  • sublime prettier插件配置_Prettier代码格式化插件配置指南

    sublime prettier插件配置_Prettier代码格式化插件配置指南sublime prettier插件配置_Prettier代码格式化插件配置指南sublime prettier插件配置_Prettier代码格式化插件配置指南sublime prettier插件配置_Prettier代码格式化插件配置指南

    首先安装JsPrettier插件并配置prettier_cli_path和node_path路径,设置format_on_save_enabled为true以实现保存时自动格式化,确保prettier_options与项目规则一致,推荐在项目中本地安装Prettier并通过快捷键Ctrl+Alt+F…

    2026年9月28日 • 用户投稿
    000
  • 格子达论文检测入口在哪里—格子达学位论文查重入口

    格子达论文检测入口在哪里—格子达学位论文查重入口格子达论文检测入口在哪里—格子达学位论文查重入口格子达论文检测入口在哪里—格子达学位论文查重入口格子达论文检测入口在哪里—格子达学位论文查重入口

    格子达论文查重入口在www.gezida.com,用户注册后可上传Word或PDF文件进行检测,系统采用语义分析算法,比对广泛学术资源,支持分段查重,生成带来源标注的PDF报告,界面简洁并提供实时进度与在线客服。 格子达论文检测入口在哪里—格子达学位论文查重入口,这是不少学生在撰写毕业论文时都关注的…

    2026年9月28日 • 用户投稿
    000
  • 将PostgreSQL存储过程转换为Spring Boot原生查询的实践指南

    将PostgreSQL存储过程转换为Spring Boot原生查询的实践指南将PostgreSQL存储过程转换为Spring Boot原生查询的实践指南将PostgreSQL存储过程转换为Spring Boot原生查询的实践指南将PostgreSQL存储过程转换为Spring Boot原生查询的实践指南

    本文旨在指导开发者如何将PostgreSQL存储过程转换为Spring Boot应用中的原生SQL查询。通过分析一个具体的存储过程,我们将详细演示如何构建等效的SQL查询,并介绍Spring Data JPA @Query注解中两种主要的参数映射方式:命名参数和位置参数,以实现存储过程的替代。 存储…

    2026年9月28日 • 用户投稿
    100
  • 没有体力限制 没有抽卡的二游!《二重螺旋》10月28日公测

    没有体力限制 没有抽卡的二游!《二重螺旋》10月28日公测没有体力限制 没有抽卡的二游!《二重螺旋》10月28日公测没有体力限制 没有抽卡的二游!《二重螺旋》10月28日公测没有体力限制 没有抽卡的二游!《二重螺旋》10月28日公测

    英雄游戏旗下潘神工作室于8月26日发布消息,其自主研发的免费arpg《二重螺旋》将于10月28日正式上线,登陆pc(epic games商店)、ios及android三大平台。游戏将取消角色与武器的抽卡机制,并彻底移除体力系统。 本作构建在一个魔法与机械交融的世界观中,人类与亚人种共同生活,但拥有双…

    2026年9月28日 • 用户投稿
    000
  • 牧场物语风之繁华集市自然精灵系统指南 自然精灵功能及位置

    牧场物语风之繁华集市自然精灵系统指南 自然精灵功能及位置牧场物语风之繁华集市自然精灵系统指南 自然精灵功能及位置牧场物语风之繁华集市自然精灵系统指南 自然精灵功能及位置牧场物语风之繁华集市自然精灵系统指南 自然精灵功能及位置

    《牧场物语 风之集市》中的自然精灵系统是维系农场生态平衡与促进作物成长的重要机制。在游戏第一年春季第13日上午,该系统将自动解锁,并同步开启“欢乐能量”玩法。通过“助威小队”功能,自然精灵可在集市日协助提升商品的销售表现和品质,助力玩家获得更高收益。 牧场物语风之繁华集市自然精灵系统详解 1、自然精…

    2026年9月28日 • 用户投稿
    000
  • MySQL怎样使用索引合并优化 复合索引与索引合并策略

    MySQL怎样使用索引合并优化 复合索引与索引合并策略MySQL怎样使用索引合并优化 复合索引与索引合并策略MySQL怎样使用索引合并优化 复合索引与索引合并策略MySQL怎样使用索引合并优化 复合索引与索引合并策略

    索引合并是mysql中一种优化策略,允许在单个查询中使用多个索引来定位数据。其主要类型包括:1. union合并,用于or连接的条件;2. intersection合并,用于and连接的条件;3. sort-union合并,用于需排序后再合并的情况。复合索引与索引合并不同,前者是多列组合索引,后者则…

    2026年9月28日 • 用户投稿
    000
  • 乌鲁木齐银行定向采购 Oracle、IBM、Redhat

    2022年2月18日,乌鲁木齐银行发布《正版oracle软件采购项目》公开询价公告,控制价 283 万元。 采购内容:主要目标为以数量授权模式采购,采购Oracle数据库6C,Oracle weblogic 4C,Oracle集群2C,Oracle ADG 2C。 2022年3月1日发布成交公告,新…

    2026年9月28日
    000
  • MBTI测试免费链接入口_ MBTI免费测试网站在线地址

    MBTI测试免费链接入口_ MBTI免费测试网站在线地址MBTI测试免费链接入口_ MBTI免费测试网站在线地址MBTI测试免费链接入口_ MBTI免费测试网站在线地址MBTI测试免费链接入口_ MBTI免费测试网站在线地址

    MBTI测试免费链接入口包括www.16personalities.com和www.16mbti.cn,前者基于荣格理论提供16种人格类型分析,含职业建议;后者支持多次测试、生成多维度报告,具社交分享功能,界面简洁适配多设备,测试约12分钟完成。 MBTI测试免费链接入口在哪里?这是不少网友都关注的…

    2026年9月28日 • 用户投稿
    000
  • 深入理解Java泛型:类型参数与方法重载的实践指南

    深入理解Java泛型:类型参数与方法重载的实践指南深入理解Java泛型:类型参数与方法重载的实践指南深入理解Java泛型:类型参数与方法重载的实践指南深入理解Java泛型:类型参数与方法重载的实践指南

    本文深入探讨了Java泛型中关于类型参数与泛型类实例在方法签名中的区别,以及由此引发的类型不匹配问题。通过一个具体的代码示例,详细解析了为何在泛型方法中,直接传入泛型类实例或其内部类型参数会引发编译错误,并提供了利用方法重载这一核心机制来优雅地解决此类问题的专业指导和示例代码,帮助开发者清晰理解“h…

    2026年9月28日 • 用户投稿
    100
  • 抖音私信怎么屏蔽?抖音私信怎么屏蔽一个人的消息

    抖音私信怎么屏蔽?抖音私信怎么屏蔽一个人的消息抖音私信怎么屏蔽?抖音私信怎么屏蔽一个人的消息抖音私信怎么屏蔽?抖音私信怎么屏蔽一个人的消息抖音私信怎么屏蔽?抖音私信怎么屏蔽一个人的消息

    随着抖音的普及,越来越多用户加入这个短视频社交平台。在日常使用中,不少人会收到陌生或不想要的私信,甚至遭遇骚扰信息。为了更好地保护个人隐私和使用体验,掌握屏蔽私信的方法显得尤为重要。接下来,就为大家详细介绍如何有效屏蔽抖音私信。 一、屏蔽抖音私信的具体操作 1. 屏蔽某个特定用户 当你希望阻止某位用…

    2026年9月28日 • 用户投稿
    000
  • 如何用豆包AI写协程代码 协程代码的AI编写技巧大公开

    如何用豆包AI写协程代码 协程代码的AI编写技巧大公开如何用豆包AI写协程代码 协程代码的AI编写技巧大公开如何用豆包AI写协程代码 协程代码的AI编写技巧大公开如何用豆包AI写协程代码 协程代码的AI编写技巧大公开

    用豆包ai写协程代码的关键在于提问方式与后续优化。一、明确所需协程类型,如并发下载或任务管理,提问越具体生成代码越实用;二、注意避免阻塞调用,如将time.sleep改为await asyncio.sleep;三、善用提示词提升代码质量,如指定库、并发数及异常处理;四、结合项目结构调整代码,适配模块…

    2026年9月28日 • 用户投稿
    200
  • 洗碗机普及迎来攻坚战,行业探寻市场爆发“黄金拐点”

    洗碗机普及迎来攻坚战,行业探寻市场爆发“黄金拐点”洗碗机普及迎来攻坚战,行业探寻市场爆发“黄金拐点”洗碗机普及迎来攻坚战,行业探寻市场爆发“黄金拐点”洗碗机普及迎来攻坚战,行业探寻市场爆发“黄金拐点”

    家电行业中,谁是最被看好的“潜力股”之一?洗碗机当之不让。但是现实困境却是,洗碗机渗透率徘徊在4%左右迟迟难以突破,原因何在,又该如何破局? 2025年9月17日,由中国家电网主办的“碗美无菌国补焕新2025中国洗碗机行业高峰论坛”在千年瓷都景德镇拉开帷幕,来自A.O.史密斯、卡萨帝、finish亮…

    2026年9月28日 • 用户投稿
    100
  • 如何用豆包AI生成Python环境配置代码

    如何用豆包AI生成Python环境配置代码如何用豆包AI生成Python环境配置代码如何用豆包AI生成Python环境配置代码如何用豆包AI生成Python环境配置代码

    豆包ai可辅助生成python环境配置代码。1. 首先明确项目需求,如python版本、依赖库和虚拟环境类型;2. 向豆包ai输入具体提示词,获取创建venv和requirements.txt的命令;3. 如需复杂配置,可要求生成开发与生产环境分离的依赖文件;4. 注意版本控制、输出验证及通过多轮交…

    2026年9月28日 • 用户投稿
    100
  • 视频号私信如何改成个人私信?视频号怎么私信给作者

    视频号私信如何改成个人私信?视频号怎么私信给作者视频号私信如何改成个人私信?视频号怎么私信给作者视频号私信如何改成个人私信?视频号怎么私信给作者视频号私信如何改成个人私信?视频号怎么私信给作者

    在这个信息爆炸的时代,我们每个人都希望能拥有一个属于自己的小天地,与他人分享喜怒哀乐,同时保护自己的隐私。而微信视频号私信功能的出现,无疑为我们提供了一个绝佳的沟通平台。但是,有些朋友可能发现,自己无法将视频号私信改成个人私信。别担心,今天就来教大家如何轻松切换隐私模式,让你的沟通更加私密和安全。 …

    2026年9月28日 • 用户投稿
    100
  • sublime怎么快速注释和取消注释代码_Sublime代码块注释与取消注释的快捷操作

    sublime怎么快速注释和取消注释代码_Sublime代码块注释与取消注释的快捷操作sublime怎么快速注释和取消注释代码_Sublime代码块注释与取消注释的快捷操作sublime怎么快速注释和取消注释代码_Sublime代码块注释与取消注释的快捷操作sublime怎么快速注释和取消注释代码_Sublime代码块注释与取消注释的快捷操作

    Sublime Text中行注释快捷键为Ctrl + /(Windows/Linux)或Cmd + /(macOS),用于单行或多行代码的快速注释与取消;块注释快捷键为Ctrl + Shift + / 或Cmd + Shift + /,可将选中代码块用语言特定符号包裹。 在Sublime Text中…

    2026年9月28日 • 用户投稿
    100

发表回复

登录后才能评论
关注微信