php计数输入文件数组大小没有foreach

时间:2015-08-29 15:29:13

标签: php arrays input

对于我试图上传多个文件的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循环?

1 个答案:

答案 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
    }
}