当前位置:

首页 > 编程开发 > Laravel 数组文件大小验证方法

Laravel 数组文件大小验证方法

本教程详细介绍了如何在Laravel中验证上传文件数组的总大小。由于Laravel内置验证器主要针对单个文件大小,对于整个文件数组的合计大小验证,需要通过创建自定义验证规则来实现。文章将指导您完成自定义规则的创建、逻辑实现,并将其集成到表单请求的验证规则中,确保所有上传文件的总大小符合预期限制。

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

本教程详细介绍了如何在 Laravel 中验证上传文件数组的总大小。由于 Laravel 内置验证器主要针对单个文件大小,对于整个文件数组的合计大小验证,需要通过创建自定义验证规则来实现。文章将指导您完成自定义规则的创建、逻辑实现,并将其集成到表单请求的验证规则中,确保所有上传文件的总大小符合预期限制。

在 Laravel 应用中处理文件上传时,我们经常需要对单个文件的大小、类型等进行验证。然而,当用户上传多个文件(作为文件数组)时,有时不仅需要限制每个文件的大小,还需要限制所有文件合计的总大小。Laravel 的内置验证规则,例如 max,通常只作用于单个文件,无法直接验证文件数组的聚合大小。本文将指导您如何通过创建自定义验证规则来解决这一问题。

1. 理解 Laravel 内置文件验证的局限性

考虑以下典型的 Laravel 验证规则,它限制了每个 images 数组中的图片文件类型和最大大小(1000 KB):

public function rules()
{
    return [
        // ... 其他验证规则
        'images.*' => 'mimes:jpg,jpeg,png|max:1000' // 验证每个图片文件不超过 1000 KB
    ];
}

这里的 images.* 规则确保了数组中的每个文件都符合要求。但如果用户上传了 10 张图片,每张 900 KB,那么总大小将达到 9000 KB (9 MB),这可能仍然超出了我们对整个上传批次的总大小限制。为了实现对总大小的验证,我们需要一个自定义的解决方案。

2. 创建自定义验证规则

Laravel 提供了强大的自定义验证规则机制,允许我们定义复杂的验证逻辑。我们将创建一个名为 ArraySize 的自定义规则来验证文件数组的总大小。

首先,使用 Artisan 命令生成一个新的验证规则:

php artisan make:rule ArraySize

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

3. 实现自定义规则逻辑

打开 app/Rules/ArraySize.php 文件,并根据以下示例代码修改其内容。这个规则的核心逻辑是遍历文件数组,累加每个文件的大小,然后将总大小与我们设定的最大值进行比较。

maxSize = $maxSize;
    }

    /**
     * 判断验证规则是否通过。
     *
     * @param  string  $attribute 字段名称
     * @param  mixed  $value     待验证的值 (文件数组)
     * @return bool
     */
    public function passes($attribute, $value): bool
    {
        $totalSize = 0;

        // 确保 $value 是一个数组
        if (!is_array($value)) {
            return false;
        }

        foreach ($value as $file) {
            // 确保数组中的每个元素都是 UploadedFile 实例
            if (!$file instanceof UploadedFile) {
                return false;
            }
            $totalSize += $file->getSize(); // getSize() 返回字节数
        }

        // 将总字节数转换为 KB,并判断是否小于允许的最大值
        // 如果总大小小于最大允许值,则验证通过 (返回 true)
        return ($totalSize / 1024) < $this->maxSize;
    }

    /**
     * 获取验证失败时返回的错误消息。
     *
     * @return string
     */
    public function message(): string
    {
        return sprintf('所有图片的总大小必须小于 %d KB。', $this->maxSize);
    }
}

代码解析:

  • __construct(int $maxSize): 构造函数接收一个 $maxSize 参数,用于设定允许的最大总大小,单位为 KB。
  • passes($attribute, $value):
    • 初始化 $totalSize 为 0,用于累加文件大小。
    • 首先检查 $value 是否为数组,如果不是,则验证失败。
    • 遍历 $value 数组,对每个元素:
      • 检查它是否是 Illuminate\Http\UploadedFile 的实例。这确保我们处理的是实际上传的文件对象。
      • 通过 $file->getSize() 获取当前文件的大小(单位为字节),并累加到 $totalSize。
    • 最后,将 $totalSize(字节)转换为 KB ($totalSize / 1024),并与构造函数中传入的 $maxSize 进行比较。如果总大小小于 $maxSize,则 passes 方法返回 true(验证通过),否则返回 false(验证失败)。
  • message(): 定义了当验证失败时返回的错误消息。使用 sprintf 可以动态地将 $maxSize 插入到消息中,提供更具体的信息。

4. 在验证中使用自定义规则

现在,您可以在您的表单请求(Form Request)或控制器中引入并使用这个自定义规则。

首先,在文件顶部引入 ArraySize 规则:

use App\Rules\ArraySize;

然后,在您的 rules() 方法中,将 ArraySize 规则应用于 images 字段。请注意,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],
        'images.*'            => 'mimes:jpg,jpeg,png|max:1000', // 验证单个文件
        'images'              => ['required', new ArraySize(30000)], // 验证文件数组总大小,30000 KB = 30 MB
    ];
}

在上述示例中,new ArraySize(30000) 表示我们希望所有上传图片的合计大小不得超过 30000 KB (即 30 MB)。同时,images.* 规则仍然会验证每个单独的文件不超过 1000 KB。

5. 注意事项与最佳实践

  • 单位一致性:在 ArraySize 规则中,$maxSize 参数的单位是 KB。确保在实例化规则时传入的值是正确的 KB 单位。
  • 错误消息本地化:如果您的应用支持多语言,您可以通过在 resources/lang/{locale}/validation.php 文件中添加自定义消息,或者在规则的 message() 方法中返回 __('validation.custom.images.array_size') 来实现错误消息的本地化。
  • 与其他规则结合:将 images.* (针对单个文件) 和 images (针对文件数组) 的验证规则结合使用,可以提供更全面的验证。
  • 性能考量:对于非常大的文件数组或文件,计算总大小可能会消耗一些时间。在极端情况下,可以考虑在文件上传前进行前端预校验,以减少不必要的服务器请求。
  • 空数组处理:在上述 rules() 中,我们为 images 字段添加了 required 规则。这意味着如果 images 数组为空,它将首先被 required 规则捕获。如果您允许空数组,但仍然想验证非空数组的总大小,可以移除 required 规则。

总结

通过创建自定义验证规则,我们成功解决了 Laravel 中对上传文件数组总大小进行验证的需求。这种方法不仅功能强大,而且高度可定制,能够适应各种复杂的业务逻辑。掌握自定义验证规则的技巧,将大大提升您在 Laravel 中处理复杂数据验证的能力。

本文内容来源于互联网,如有侵权请联系删除。
作者最新文章
编程开发
相关文章 更多
using namespace 使用中遇到的问题怎么解决
using namespace 使用中遇到的问题怎么解决

命名空间的基本概念与常见引入问题在C++等编程语言中,命名空间(namespace)是一种将代码标识符(如变量、函数、类名)封装在特定名称下的机制,其主要目的是避免命名冲突,尤其是在大型项目或使用多个第三方库时。使用“using namespace”指令可以将指定命名空间中的所有名称引入当前作用域,

c语言函数递归 实操经验总结:这些技巧很实用
c语言函数递归 实操经验总结:这些技巧很实用

理解递归的基本原理在C语言中,递归是一种函数调用自身的编程技术。要掌握它,首先需要理解其核心思想:将一个复杂的大问题,分解为一个或几个与原问题相似但规模更小的子问题,直到子问题足够简单,可以直接求解。这个过程通常包含两个关键部分:递归出口和递归体。递归出口定义了问题何时不再继续分解,即最简单、可直接

c语言函数递归 怎么选?常见方案对比分析
c语言函数递归 怎么选?常见方案对比分析

递归函数的基本概念与适用场景在C语言编程中,递归是一种函数调用自身的编程技巧。它并非适用于所有问题,但在处理某些具有自相似结构的问题时,能提供极其清晰和优雅的解决方案。递归的核心思想是将一个大规模问题分解为一个或多个同类型但规模更小的子问题,直到子问题简单到可以直接求解。典型的适用场景包括树形结构的

Objective-C 内存管理入门:从 alloc 到 dealloc 的生命周期详解
Objective-C 内存管理入门:从 alloc 到 dealloc 的生命周期详解

理解内存管理的基石在Objective-C的编程世界中,内存管理是开发者必须掌握的核心技能之一。它直接关系到应用的性能、稳定性与资源利用效率。与一些采用自动垃圾回收机制的语言不同,Objective-C在很长一段时间里,依赖一套基于引用计数的、需要开发者部分介入的管理规则。这套规则的核心思想是明确的

如何正确使用 dealloc 以避免 iOS 应用中的内存泄漏
如何正确使用 dealloc 以避免 iOS 应用中的内存泄漏

理解 dealloc 的角色与时机在 iOS 应用开发中,内存管理是保障应用性能与稳定性的基石。dealloc 方法是 Objective-C 中对象生命周期结束时的关键回调,它标志着对象即将被系统回收内存。正确理解其触发时机至关重要:当一个对象的引用计数降为零时,运行时系统会自动调用该对象的 de

深入理解 Objective-C 中的 dealloc 方法:内存管理核心机制
深入理解 Objective-C 中的 dealloc 方法:内存管理核心机制

内存管理的基石在Objective-C的世界里,内存管理是开发者必须掌握的核心技能之一。作为一门在手动引用计数(MRC)时代诞生的语言,Objective-C要求程序员对对象的生命周期有清晰的认识。dealloc方法正是这一生命周期中至关重要的终点站。它是一个实例方法,当对象的引用计数降为零时,系统

理解 native2ascii:Java 国际化开发中的字符编码工具
理解 native2ascii:Java 国际化开发中的字符编码工具

native2ascii 工具的基本定位在Ja va应用程序的国际化与本地化开发过程中,处理非拉丁字符集是一个常见且关键的环节。Ja va内部使用Unicode字符集来统一表示全球各种语言的文字,但其属性文件(.properties)在历史上要求使用ASCII编码,或者更准确地说,要求非ASCII字

如何使用 native2ascii 转换中文字符为 Unicode 转义序列
如何使用 native2ascii 转换中文字符为 Unicode 转义序列

理解 native2ascii 工具的基本用途在软件开发,特别是涉及国际化处理的场景中,开发者常常需要处理不同编码的文本资源。native2ascii 是 Ja va 开发工具包(JDK)中提供的一个命令行实用程序,其主要功能是将包含本地字符编码(非ASCII字符)的文件,转换为包含 Unicode

Java native2ascii 命令详解:解决属性文件乱码问题
Java native2ascii 命令详解:解决属性文件乱码问题

native2ascii 命令的由来与作用在Ja va开发中,处理国际化资源文件是一个常见需求。资源文件通常以.properties格式存储,用于支持多语言界面。然而,Ja va属性文件默认采用ISO-8859-1字符集编码,这导致了一个直接的问题:当文件中包含非拉丁字符(如中文、日文、韩文等)时,

一个 memwatch 实战案例:定位野指针问题
一个 memwatch 实战案例:定位野指针问题

内存监控工具的价值与挑战在软件开发,尤其是使用C/C++这类手动管理内存的语言时,内存错误是程序员最常遭遇的难题之一。其中,野指针问题因其隐蔽性和破坏性,往往成为最难定位的“幽灵”缺陷。它可能潜伏在代码中,在特定条件下才被触发,导致程序崩溃、数据损坏或难以预测的行为。传统的调试手段,如打印日志或使用

查看更多
精品专题 更多
装机必备
装机必备

正软商城装机必备专区,精选办公、浏览器、安全防护、影音播放、压缩解压、设计创作和系统工具等电脑常用正版软件,帮助用户快速完成新电脑软件配置。

Windows
Windows

正软商城Windows软件专区,汇集适用于Windows电脑的办公、设计、安全防护、影音播放、开发工具和系统优化软件,提供软件介绍、系统要求、正版授权及购买下载服务。

macOS软件
macOS软件

正软商城macOS软件专区,精选适用于Mac电脑的办公、设计、影音、效率、开发和系统工具,提供软件功能介绍、macOS兼容版本、正版授权及购买下载服务。

Mac软件 更多
灵活计算器
灵活计算器
macOS/iOS/Android

灵活计算器是一款笔记式算数应用,支持实时计算、动态关联和云端同步功能。记录、整理和输出之间的过渡会更自然,适合长期写作、做笔记或持续沉淀个人内容。

赤友清理大师
赤友清理大师
macOS

赤友清理大师是一款为 Mac 设计的智能清理优化工具,可精准扫描垃圾、大文件、重复文件等,释放磁盘空间。做扫描整理、文字提取和表格转换时,它能把识别后的处理步骤接得更顺,资料录入这类场景会省下不少时间。

极度公式
极度公式
Windows/macOS/Linux

极度公式是一款跨平台专业LaTeX公式识别编辑软件,支持OCR公式识别和多平台编辑。和使用说明,避免使用,享受完整功能与稳定支持。做扫描整理、文字提取和表格转换时,它能把识别后的处理步骤接得更顺,资料录入这类场景会省下不少时间。

WINDOWS 更多
Windows 10
Windows 10
Windows

Windows 10 是一款微软推出的经典操作系统,拥有硬件兼容性与多任务处理能力。它更偏向把系统状态查看和常用调节动作放在一起,适合需要持续观察和微调设备状态的场景。

极度公式
极度公式
Windows/macOS/Linux

极度公式是一款跨平台专业LaTeX公式识别编辑软件,支持OCR公式识别和多平台编辑。和使用说明,避免使用,享受完整功能与稳定支持。做扫描整理、文字提取和表格转换时,它能把识别后的处理步骤接得更顺,资料录入这类场景会省下不少时间。

密码键盘
密码键盘
Windows/macOS/iOS/Android

密码键盘是一款兼具安全性与便捷性的高效密码管理器。日常使用里的持续防护和信息管理会更突出,适合把安全控制放进长期使用流程中的场景。