Laravel 验证文件数组总允许上传大小
Posted
技术标签:
【中文标题】Laravel 验证文件数组总允许上传大小【英文标题】:Laravel Validate Array of Files Total Allowable Upload Size 【发布时间】:2018-04-13 17:50:02 【问题描述】:我的视图有一个文件输入数组,例如
<input type="file" name="videos[]" />
<input type="file" name="videos[]" />
...
...
并且我想验证允许上传的总大小(例如:允许上传的总限制为 3Mb)。我已经写了类似的验证
$validatedData = $request->validate([
'videos.*' => 'present|file|mimetypes:video/mp4,video/ogg|max:3000',
]);
但这会验证每个视频 3Mb。
我试过了
$validatedData = $request->validate([
'videos' => 'file|max:3000',
'videos.*' => 'present|file|mimetypes:video/mp4,video/ogg|max:3000',
]);
/*------------------------------------------------*/
$validatedData = $request->validate([
'videos' => 'array|max:3000',
'videos.*' => 'present|file|mimetypes:video/mp4,video/ogg|max:3000',
]);
但对于大于 3Mb 的总上传大小,验证不起作用。我是否必须编写自定义验证规则来验证上传文件的总大小限制。或者是否有任何预定义的验证规则?任何帮助表示赞赏。
谢谢!
【问题讨论】:
【参考方案1】:我认为验证总大小的最佳方法是添加自定义验证规则,方法如下:
在您的控制器中:
$validatedData = $request->validate([
'videos' => 'array|max_uploaded_file_size:3000',
'videos.*' => 'present|file|mimetypes:video/mp4,video/ogg',
]);
在 AppServiceProvider.php 中注册自定义验证
public function boot()
Validator::extend('max_uploaded_file_size', function ($attribute, $value, $parameters, $validator)
$total_size = array_reduce($value, function ( $sum, $item )
// each item is UploadedFile Object
$sum += filesize($item->path());
return $sum;
);
// $parameters[0] in kilobytes
return $total_size < $parameters[0] * 1024;
);
【讨论】:
非常感谢,我之前一直在寻找类似的东西,但从未找到这种方法。想知道为什么官方验证文档中没有提到 h*ck ???【参考方案2】:不是一个非常优雅的解决方案,但我会 foreach 视频并使用 php 文件大小函数(以字节为单位返回整数大小)
3mb = 3,145,728,000 字节
foreach($request['videos'] as $video)
$size = filesize($video);
if($size > 3145728000)
return Redirect::back()->withErrors(['msg', 'The Message']);
在你的视图中调用这个
@if($errors->any())
<h4>$errors->first()</h4>
@endif
【讨论】:
以上是关于Laravel 验证文件数组总允许上传大小的主要内容,如果未能解决你的问题,请参考以下文章
Laravel - 超过 PHP 最大上传大小限制时验证文件大小
在 HTML5 [多个] 文件输入中选择的最大文件数是多少?