对于我试图上传多个文件的laravel项目。文件是可选的,所以我想在循环浏览所有图像之前进行检查。
我的表单输入部分。
{!! Form::open(array( 'files'=>true)) !!}
{!! Form::file('images[]', array('multiple'=>true, 'class' => 'form-control')) !!}
{!! Form::close() !!}
(表单有enctype =“multipart / form-data”,输入字段有多个=“1”)
我目前检查的代码:
$files = Input::file('images');
$uploaded = 0;
$failed = 0;
if(!empty($files)){
try {
foreach ($files as $file) {
//upload file $uploaded ++ or $failed ++;
$rules = array('file' => 'required|image'); // 'required|mimes:png,gif,jpeg,txt,pdf,doc'
$validator = Validator::make(array('file' => $file), $rules);
if ($validator->passes()) {
//if file uploaded succesfuly $uploaded++;
}
else{
$failed++;
}
}
}
catch(Exception e){
//Handle error
}
}
当我用if(count($ files)> 0)更改!empty($ files)时,它仍然在foreach中。
我使用$ failed和$ upload,在这部分代码完成后,根据失败/上传的数量显示消息。但是,当我不选择任何文件时,$ failed为1(即使数组为空)。循环$文件来计算ammount,在我将它们循环上传之前感觉就像浪费内存/时间/等,有没有比循环$ files数组更好的方法来获取文件的数量?
子问题:为什么它在为空时运行foreach循环?
答案 0 :(得分:0)
我假设您的简化形式看起来像这样:
<form method="POST" action="target/url" accept-charset="UTF-8" enctype="multipart/form-data">
<input name="images[]" type="file">
<input name="images[]" type="file">
<input type="submit" value="Click Me">
</form>
在这种情况下,您的$images
变量始终是一个数组。文件上载的结果是数组中的条目。如果您要提交上述表格并运行以下代码:
$files = Input::file('images');
dd($files);
你会得到:
array:2 [
0 => null
1 => null
]
如您所见,您的$images
数组不为空。它有两个条目,每个文件上传一个。
所以,你有几个选择。你可以移动空支票:
$files = Input::file('images');
foreach ($files as $file) {
// check to see if the file upload is empty
if (!empty($file)) {
$rules = array('file' => 'required|image'); // 'required|mimes:png,gif,jpeg,txt,pdf,doc'
$validator = Validator::make(array('file' => $file), $rules);
if ($validator->passes()) {
// success
} else {
// fail
}
}
}
或者,您可以使用array_filter()
:
// filter out all loosely-false entries (null == false)
$files = array_filter(Input::file('images'));
foreach ($files as $file) {
$rules = array('file' => 'required|image'); // 'required|mimes:png,gif,jpeg,txt,pdf,doc'
$validator = Validator::make(array('file' => $file), $rules);
if ($validator->passes()) {
// success
} else {
// fail
}
}