【问题标题】:Does Laravel Input::hasfile() work on input arrays?Laravel Input::hasfile() 是否适用于输入数组?
【发布时间】:2014-04-15 16:01:27
【问题描述】:

我正在开发一个 Laravel 项目,该项目使用具有多个文件输入的表单。如果我在第一个输入为空且所有其他输入为文件的情况下提交表单,则 hasFile 返回 false。如果第一个输入包含一个文件,它只会返回 true。

if(Input::hasfile('file'))
{
 // do something
}

这是通过 Input::file('file) 输入的数组。小图像输入是空的,但大图像不是。我希望它查看整个数组,如果存在任何文件,则继续“做某事”。

Array
(
    [small] => 
    [large] => Symfony\Component\HttpFoundation\File\UploadedFile Object
        (
            [test:Symfony\Component\HttpFoundation\File\UploadedFile:private] => 
            [originalName:Symfony\Component\HttpFoundation\File\UploadedFile:private] => image_name.jpg
            [mimeType:Symfony\Component\HttpFoundation\File\UploadedFile:private] => image/jpeg
            [size:Symfony\Component\HttpFoundation\File\UploadedFile:private] => 44333
            [error:Symfony\Component\HttpFoundation\File\UploadedFile:private] => 0
            [pathName:SplFileInfo:private] => /Applications/MAMP/tmp/php/phpHILgX2
            [fileName:SplFileInfo:private] => phpHILgX2
        )

)

这是预期的行为吗?或者,它应该查看整个数组吗?

【问题讨论】:

    标签: file-upload input laravel


    【解决方案1】:

    您可以使用数组键进行检查,例如:- HTML 输入类型文件元素:

    <input type="file" name="your_file_name[]" />
    

    Laravel 5:$request-&gt;hasFile('your_file_name.'.$key)

    Laravel 4.2:Input::hasFile('your_file_name.'.$key)

    【讨论】:

      【解决方案2】:

      来源:

      /**
       * Determine if the uploaded data contains a file.
       *
       * @param  string  $key
       * @return bool
       */
      public function hasFile($key)
      {
          if (is_array($file = $this->file($key))) $file = head($file);
      
          return $file instanceof \SplFileInfo;
      }
      

      它似乎只检查数组中的第一项,head 返回数组中的第一项。

      【讨论】:

      • 谢谢。我读过,但不幸的是我的技能不允许我理解。我有一种感觉,它正在按预期工作。只需要确认。
      • 欢迎您,希望您能理解 :-)
      • 是的,有道理。感谢您指出头。我不确定那是什么意思。
      【解决方案3】:

      这里有一个可能有帮助的 sn-p

      if(Input::hasFile('myfile')){
      
          $file = Input::file('myfile');
      
          // multiple files submitted
          if(is_array($file))
          {
              foreach($file as $part) {
                  $filename = $part->getClientOriginalName();
                  $part->move($destinationPath, $filename);
              }
          }
          else //single file
          {
              $filename = $file->getClientOriginalName();
              $uploadSuccess = Input::file('myfile')->move($destinationPath, $filename);
          }
      
      } else {
          echo 'Error: no file submitted.';
      }
      

      取自 http://forumsarchive.laravel.io/viewtopic.php?id=13291

      【讨论】:

      • if(is_array($file)) 检查是不合逻辑的,因为我们已经在表单中决定命名字段输入字段,如果最后有 [],它将始终是一个数组...
      【解决方案4】:

      由于无法发表评论,看来我得发帖了。

      Ronak Shah 的答案确实应该在这里标记为正确的答案,当我弄清楚原因时,我在 30 到 40 分钟试图解决这个问题后立即说出“Sonnofa--”……“一团糟”。

      原来在输入数组上使用 hasFile(),您需要使用 点表示法。

      所以(使用我自己的例子)而不是

      $request->hasFile("img[29][file]")
      

      应该是

      $request->hasFile("img.29.file")
      

      考虑到 PHP 和点表示法并没有真正结合在一起,这当然令人大开眼界。输入数组确实是有问题的孩子。

      【讨论】:

        【解决方案5】:

        在撰写本文时 (Laravel 8),Request 类现在支持 arrays 用于 hasFile 方法,从 source code 开始:

            /**
             * Determine if the request contains the given file.
             *
             * @param  string  $name
             * @param  string|null  $value
             * @param  string|null  $filename
             * @return bool
             */
            public function hasFile($name, $value = null, $filename = null)
            {
                if (! $this->isMultipart()) {
                    return false;
                }
        
                return collect($this->data)->reject(function ($file) use ($name, $value, $filename) {
                    return $file['name'] != $name ||
                        ($value && $file['contents'] != $value) ||
                        ($filename && $file['filename'] != $filename);
                })->count() > 0;
            }
        

        【讨论】:

          猜你喜欢
          • 2015-03-27
          • 1970-01-01
          • 2018-07-12
          • 1970-01-01
          • 1970-01-01
          • 2022-10-24
          • 2021-04-08
          • 2015-11-27
          • 1970-01-01
          相关资源
          最近更新 更多