You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.19 11:35:20