Laravel Input :: hasfile()是否适用于输入数组?

时间:2014-03-11 20:28:29

标签: file-upload input laravel

我正在使用一个使用带有多个文件输入的表单的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
        )

)

这是预期的行为吗?或者,它应该看整个阵列吗?

5 个答案:

答案 0 :(得分:5)

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

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

Laravel 5:$request->hasFile('your_file_name.'.$key)

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

答案 1 :(得分:4)

摘自来源:

/**
 * 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返回数组中的第一个项。

答案 2 :(得分:3)

这是一个可能有用的代码段

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

答案 3 :(得分:1)

由于我无法发表评论,因此似乎必须发表。

罗纳克·沙(Ronak Shah)的答案确实应该在这里标记为正确的答案,当我弄清楚原因时,它在试图弄清楚这个……“混乱”的30至40分钟后立即让我说“ Sonnofa--”。

结果是在输入数组上使用hasFile(),需要使用点表示法。

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

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

它必须是

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

这肯定使人大开眼界,因为PHP和点表示法并没有真正并存。输入数组确实是有问题的孩子。

答案 4 :(得分:0)

在撰写本文时 (Laravel 8),Request 类现在支持 arrayhasFile 方法,从 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;
    }