如何在Laravel中验证文本的字节大小(非文件大小)
Laravel 文本二进制大小验证解决方案
Laravel 默认的 max 规则仅统计字符数量,无法适配多字节字符(如中文、emoji等)的字节大小限制需求。要验证文本的二进制大小(而非字符数),可以通过以下两种方案实现:
方案一:使用闭包验证(快速实现)
直接在验证规则中嵌入闭包,实时计算文本的字节大小并校验:
$maxSizeByte = Constant::MAX_FILE_SIZE * 1024; $rules = [ "id_submission" => "required|numeric", "text" => "required", "text.*" => [ "required", function ($attribute, $value, $fail) use ($maxSizeByte) { // 用 mb_strlen 指定 '8bit' 参数计算二进制字节数 $byteSize = mb_strlen($value, '8bit'); if ($byteSize > $maxSizeByte) { $fail("{$attribute} 的二进制大小不能超过 {$maxSizeByte} 字节(" . number_format($maxSizeByte/1024, 2) . "KB)。"); } } ], ];
方案二:自定义验证规则(可复用)
如果需要在多个地方复用该验证逻辑,建议创建独立的验证规则:
1. 生成规则类
执行 Artisan 命令创建规则文件:
php artisan make:rule MaxByteSize
2. 实现规则逻辑
编辑 app/Rules/MaxByteSize.php:
<?php namespace App\Rules; use Illuminate\Contracts\Validation\Rule; class MaxByteSize implements Rule { protected $maxBytes; // 接收允许的最大字节数 public function __construct(int $maxBytes) { $this->maxBytes = $maxBytes; } // 验证逻辑:计算文本字节数并对比限制值 public function passes($attribute, $value) { return mb_strlen($value, '8bit') <= $this->maxBytes; } // 验证失败提示消息 public function message() { return 'The :attribute 不能超过 ' . $this->maxBytes . ' 字节(' . number_format($this->maxBytes/1024, 2) . 'KB)。'; } }
3. 在验证中使用规则
引入自定义规则并应用到验证逻辑:
use App\Rules\MaxByteSize; // ... $maxSizeByte = Constant::MAX_FILE_SIZE * 1024; $rules = [ "id_submission" => "required|numeric", "text" => "required", "text.*" => ["required", new MaxByteSize($maxSizeByte)], ];
关键说明
mb_strlen($value, '8bit')是准确计算文本二进制字节数的核心方法:指定8bit参数后,会忽略字符编码,直接按字节统计长度,避免多字节字符导致的误差。- 若项目未启用
mbstring扩展,也可使用原生strlen()函数,但mb_strlen对多字节编码场景兼容性更强。
内容的提问来源于stack exchange,提问作者Twigu
相关产品推荐
相关产品推荐

