如何让Laravel验证规则仅接收真实的TXT文件?
解决Laravel中TXT文件验证误判问题
你当前的验证规则会接收.js、.r等文件,是因为这类文件的MIME类型被识别为text/plain,而mimes:txt规则本质是匹配text/plain这个MIME类型,并非严格限定文件扩展名。要实现仅接收真实TXT文件,可通过以下几种方式调整规则:
方法一:结合扩展名正则验证
在原有规则基础上,添加正则匹配规则,强制文件扩展名为.txt(不区分大小写):
$request->validate([ 'file' => 'required|max:10240|mimes:txt|regex:/\.txt$/i' ]);
该规则同时校验文件MIME类型和扩展名,过滤掉扩展名不符合的文本文件。
方法二:自定义验证规则(更严格)
如果需要更严谨的校验(比如同时检查文件内容是否为纯文本),可以创建自定义验证规则:
- 新建自定义规则文件
app/Rules/TxtFile.php:
<?php namespace App\Rules; use Illuminate\Contracts\Validation\Rule; class TxtFile implements Rule { public function passes($attribute, $value) { // 检查文件扩展名必须为txt if (strtolower($value->getClientOriginalExtension()) !== 'txt') { return false; } // 检查MIME类型为text/plain if ($value->getMimeType() !== 'text/plain') { return false; } // 可选:验证文件内容为纯文本(避免伪装成txt的二进制文件) $content = file_get_contents($value->getPathname()); return mb_detect_encoding($content, ['ASCII', 'UTF-8', 'ISO-8859-1'], true) !== false; } public function message() { return '仅支持上传真实的TXT格式文件'; } }
- 在验证逻辑中使用该规则:
use App\Rules\TxtFile; $request->validate([ 'file' => [ 'required', 'max:10240', new TxtFile() ] ]);
方法三:指定MIME类型+扩展名验证
也可以直接用mimetypes:text/plain替代mimes:txt,再配合扩展名正则,效果和方法一一致:
$request->validate([ 'file' => 'required|max:10240|mimetypes:text/plain|regex:/\.txt$/i' ]);
内容的提问来源于stack exchange,提问作者Rajesh Sharma
相关产品推荐
相关产品推荐

