
本教程详细介绍了如何在 laravel 中验证上传文件数组的总大小。由于 laravel 内置验证器主要针对单个文件大小,对于整个文件数组的合计大小验证,需要通过创建自定义验证规则来实现。文章将指导您完成自定义规则的创建、逻辑实现,并将其集成到表单请求的验证规则中,确保所有上传文件的总大小符合预期限制。
在 Laravel 应用中处理文件上传时,我们经常需要对单个文件的大小、类型等进行验证。然而,当用户上传多个文件(作为文件数组)时,有时不仅需要限制每个文件的大小,还需要限制所有文件合计的总大小。Laravel 的内置验证规则,例如 max,通常只作用于单个文件,无法直接验证文件数组的聚合大小。本文将指导您如何通过创建自定义验证规则来解决这一问题。
考虑以下典型的 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),这可能仍然超出了我们对整个上传批次的总大小限制。为了实现对总大小的验证,我们需要一个自定义的解决方案。
Laravel 提供了强大的自定义验证规则机制,允许我们定义复杂的验证逻辑。我们将创建一个名为 ArraySize 的自定义规则来验证文件数组的总大小。
首先,使用 Artisan 命令生成一个新的验证规则:
php artisan make:rule ArraySize
这会在 app/Rules 目录下创建一个 ArraySize.php 文件。
打开 app/Rules/ArraySize.php 文件,并根据以下示例代码修改其内容。这个规则的核心逻辑是遍历文件数组,累加每个文件的大小,然后将总大小与我们设定的最大值进行比较。
<?php
namespace App\Rules;
use Illuminate\Contracts\Validation\Rule;
use Illuminate\Http\UploadedFile;
class ArraySize implements Rule
{
/**
* 允许的文件数组最大总大小,单位为 KB。
*
* @var int
*/
private int $maxSize;
/**
* 创建一个新的规则实例。
*
* @param int $maxSize 允许的最大总大小(KB)
* @return void
*/
public function __construct(int $maxSize)
{
$this->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);
}
}代码解析:
现在,您可以在您的表单请求(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。
通过创建自定义验证规则,我们成功解决了 Laravel 中对上传文件数组总大小进行验证的需求。这种方法不仅功能强大,而且高度可定制,能够适应各种复杂的业务逻辑。掌握自定义验证规则的技巧,将大大提升您在 Laravel 中处理复杂数据验证的能力。
以上就是Laravel 文件数组总大小验证:自定义规则实现的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号