Проверка изображения не работает при использовании ajaxForm

Я пробовал искать в Google и видел другие вопросы, размещенные на этом форуме, но не смог найти решения для своей проблемы. Я использую метод Jquery ajaxForm для отправки формы. Моя форма также содержит одно поле файл, которое можно использовать для загрузки изображения. Я определил проверку в своей модели. Но проблема в том, что даже если я загружаю правильный файл jpg, я все равно получаю сообщение об ошибке, которое

Argument 1 passed to Illuminate\\Validation\\Factory::make() must be of the type array, object given.

Javascript-код

$('#create_form').ajaxForm({
    dataType:'JSON',
    success: function(response){
        alert(response);    
    } 
}).submit();

Код контроллера

if ($file = Input::file('picture')) {
    $validator = Validator::make($file, User::$file_rules);

    if ($validator->fails()) {
        $messages = $validator->messages();
        foreach ($messages->all(':message') as $message) {
            echo $message; exit;
        }
        return Response::json(array('message'=>$response, 'status'=>'failure'));
    } else {
        // do rest 
    }
}

Код модели

public static $file_rules = array(
    'picture' => 'required|max:2048|mimes:jpeg,jpg,bmp,png,gif'
);

Почтовый запрос

введите здесь описание изображения

Я знаю, что моя проверка, определенная в модели, ожидает массив. Но при передаче $file в валидаторе объект передается. Затем я изменил код следующим образом:

$validator = Validator::make(array('picture' => $file->getClientOriginalName()), User::$file_rules);

Теперь я получаю ошибку:

The picture must be a file of type: jpg, JPEG, png,gif.

person neeraj    schedule 28.03.2015    source источник


Ответы (2)


Проблема в том, что вы передаете файловый объект напрямую для проверки. Метод Validator::make() принимает все четыре параметра в виде массива. Более того, вам нужно передать весь файловый объект в качестве значения, чтобы Validator мог проверить тип mime, размер и т. д. Вот почему ваш код должен быть таким.

$input = array('picture' => Input::file('picture'));
$validator = Validator::make($input, User::$file_rules);

if ($validator->fails()) {
    $messages = $validator->messages();
    foreach ($messages->all(':message') as $message) {
        echo $message; exit;
    }
    return Response::json(array('message'=>$response, 'status'=>'failure'));
} else {
    // do rest 
}

Надеюсь, это будет полезно для вас.

person Arkar Aung    schedule 01.04.2015
comment
После замены вашего кода я получаю правильную ошибку для расширения файла, но когда я загружаю громоздкий файл, размер которого превышает разрешенный размер 200 КБ, я получаю сообщение об ошибке Поле изображения обязательно. Я не мог понять, почему эта ошибка приходит. - person neeraj; 02.04.2015
comment
У меня нет проблем, когда я тестирую с почтальоном. Дайте мне знать подробности, чтобы решить эту проблему. - person Arkar Aung; 02.04.2015
comment
Я обновил свой код модели в своем вопросе. Поэтому, когда я пытаюсь загрузить изображение размером более 2 МБ, я получаю сообщение об ошибке Поле изображения обязательно. Может ли помочь увеличение размера max_upload_size? - person neeraj; 02.04.2015
comment
Да . Это происходит из-за этой проблемы. github.com/laravel/framework/issues/2433 Увеличьте post_max_size и upload_max_filesize, чтобы исправить твоя проблема. - person Arkar Aung; 02.04.2015

Попробуйте такое правило.

$rules = array(
 'picture' => 'image|mimes:jpeg,jpg,bmp,png,gif'
);

или попробуйте удалить "мимы"

person namal    schedule 02.04.2015