
本教程详细介绍了如何在 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);
}
}登录后复制
代码解析:
还木有评论哦,快来抢沙发吧~