Laravel - 文件需要验证,反之亦然

Posted

技术标签:

【中文标题】Laravel - 文件需要验证,反之亦然【英文标题】:Laravel - file required validation vice versa 【发布时间】:2016-12-21 13:44:50 【问题描述】:

好的,这个问题很搞笑,但我需要解决它:

我正在使用 Laravel 5.2 并制作表单来上传图片。我有这个规则:

public static $rules = array(
    'picture ' => 'required|mimes:jpg,jpeg,png',
    'description' => 'required'
);

The description validation is ok, but when validating the picture, the 'required' attribute seems to work vice versa - when a file (picture) is selected, then it fails to validate (error: 'The picture field is required' ),当没有文件时,验证成功。

这是来自我的控制器的代码:

    Log::info('Validating store picture request');

    $validator = Validator::make(Input::all(), Picture::$rules);

    $validator->after(function ($validator) 
        Log::info('After method');
        // check for validity of the file
        if (!Input::file('picture')->isValid()) 
            Log::info('Picture is not valid');
            $validator->errors()->add('picture', 'Picture is not valid');
        
    );

    if ($validator->fails()) 
        Log::info('Validation failed, returning back');

        $messages = $validator->messages();
        return back()
            ->withErrors($validator)
            ->withInput(Input::except('picture'));
    
    Log::info('Validation succeed, continuing'); 

编辑:我以这种方式记录了 Validator 类:

protected function validateRequired($attribute, $value)

    Log::info('Just logging required validation');
    Log::info('is_null: '.is_null($value));

    if (is_null($value)) 
        Log::info('Reason: is_null');
        return false;
     elseif (is_string($value) && trim($value) === '') 
        return false;
     elseif ((is_array($value) || $value instanceof Countable) && count($value) < 1) 
        return false;
     elseif ($value instanceof File) 
        Log::info('File, getpath '.$value->getPath());
        return (string) $value->getPath() != '';
    

    Log::info('Continuing');
    return true;

这就是我提交表单时得到的结果带有文件

[2016-08-15 12:18:27] local.INFO: Validating store picture request  
[2016-08-15 12:18:27] local.INFO: Just logging required validation  
[2016-08-15 12:18:27] local.INFO: is_null: 1  
[2016-08-15 12:18:27] local.INFO: Reason: is_null  
[2016-08-15 12:18:27] local.INFO: Just logging required validation  
[2016-08-15 12:18:27] local.INFO: is_null: 1  
[2016-08-15 12:18:27] local.INFO: Reason: is_null  
[2016-08-15 12:18:27] local.INFO: After method  
[2016-08-15 12:18:27] local.INFO: Validation failed, returning back  

编辑:当没有文件时,我得到相同的日志输出,所以现在它的行为方式相同..我不知道为什么每次请求执行两次:/

【问题讨论】:

太奇怪了。
上的 enctype 属性怎么样 有'multipart/form-data' - 图片的上传和存储工作正常(当缺少验证时) 我之前也遇到过同样的问题。您可以尝试其他验证规则。比如“image”或“mimetypes:image/jpeg,image/png” 使用required|file|mimes:jpg,jpeg,png 你确定这是 Laravel 5.2 吗? 【参考方案1】:

我刚刚注意到,在您的规则数组中,pictures 键中有一个空格。 我试图检查该空格是否会导致任何错误。是的,它确实没有通过验证。想了想,我认为这应该不会导致错误。

尝试删除该空间。

public static $rules = array(
    'picture' => 'required|mimes:jpg,jpeg,png', //Remove space from 'picture'
    'description' => 'required'
);

【讨论】:

谢谢,现在它可以正常工作了 :) 我真的没有注意到这一点.. :D 但尽管如此,行为还是很奇怪 :/

以上是关于Laravel - 文件需要验证,反之亦然的主要内容,如果未能解决你的问题,请参考以下文章

如何在节点/套接字应用程序中验证 laravel 护照 API 令牌?

公共 Laravel API 的身份验证

使用 laravel 5.1 和 jwt 使用 cookie 进行身份验证

Laravel 5.2 - 会话不会在路由更改中持续存在

Laravel & VueJS CORS 尝试对用户进行身份验证时出现问题,即使使用 Cors 中间件也是如此

Laravel 5 - 文件上传