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

admin 百科 10

Laravel 文件数组总大小验证:使用自定义规则实现-第1张图片-佛山资讯网

本教程详细介绍了如何在 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 文件,并按照以下方式修改其内容。

<?php

namespace App\Rules;

use Illuminate\Contracts\Validation\Rule;
use Illuminate\Http\UploadedFile; // 引入 UploadedFile 类

class ArraySize implements Rule
{
    /**
     * 数组的最大允许总大小(单位:KB)。
     *
     * @var int
     */
    private int $maxSizeInKb;

    /**
     * 创建一个新的规则实例。
     *
     * @param int $maxSizeInKb 允许的最大总大小(KB)
     * @return void
     */
    public function __construct(int $maxSizeInKb)
    {
        $this->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) <= $this->maxSizeInKb;
    }

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

登录后复制

代码解析:

发布评论 0条评论)

还木有评论哦,快来抢沙发吧~