【问题标题】:422 (Unprocessable Entity) Ajax and Laravel422(不可处理的实体)Ajax 和 Laravel
【发布时间】:2020-04-21 08:46:55
【问题描述】:

在他的一生中,他只遇到过 2 次 ajax,而我们的道路又一次与他交织在一起,他给了我 422 错误。我google了一下,发现422错误是验证错误,但是具体在什么地方出错,我就是不明白。

这是我的脚本

<script type="text/javascript">
    $.ajaxSetup({
        headers: {
            'X-CSRF-TOKEN': $('meta[name="csrf-token"]').attr('content')
        }
    });

    $( "#form" ).submit(function( e ) {
        e.preventDefault();

        var message = $('#message').val();
        var img = $('#img').val();
        var user_id = $('#user_id').val();

        $.ajax({
            type: "POST",
            url: "{{route('profile.store', ['id' => Auth::user()->id])}}",
            data: {message:message, img:img, user_id:user_id},
            success: function (data) {
                $("#textpost").html($(data).find("#textpost").html());
            },
        });
    });
</script>

还有我的方法

public function store(Request $request) {
    $validator  = $this->validate($request,[
        'message' => 'required|max:1000',
        'img' => 'mimes:jpeg,png,gif|max:3000',
    ]);

    if($validator ) {
        $post = new Profile();
        $post->message = $request->message;
        $post->user_id = Auth::user()->id;

        if($request->file('img')) {
            $path = Storage::putFile('public', $request->file('img'));
            $url = Storage::url($path);
            $post->img = $url;
        }

        $post->save();
    }

    return redirect()->back();
}

还有我的表格

<div class="card-header">
                            <div class="input-group">
                                <form action="{{route('profile.store', ['id' => Auth::user()->id])}}" method="post" enctype="multipart/form-data" id="form">
                                    @csrf
                                    <textarea class="form-control" id="message" name="message" cols="100" rows="4" placeholder="О чем думаешь?"></textarea>
                                    <input type="file" id="img" name="img" value="Прикрепить изображение" class="mt-2">
                                    <div class="text-right">
                                        {{--                                        <input type="submit" id="btn" value="Отправить" class="btn btn-outline-dark btn-sm mt-4">--}}
                                        <button type="submit" id="btn" class="btn btn-outline-dark btn-sm mt-4">Отправить</button>
                                    </div>
                                </form>
                            </div>
                        </div>

【问题讨论】:

    标签: php ajax laravel


    【解决方案1】:

    你的Ajax调用有问题,因为你在上传文本和文件的同时你可以通过FormData传递。你也不见了

           contentType: false,
           processData: false,
    

    这是更新后的 ajax 调用:

    <script type="text/javascript">
        $.ajaxSetup({
            headers: {
                'X-CSRF-TOKEN': $('meta[name="csrf-token"]').attr('content')
            }
        });
    
        $( "#form" ).submit(function( e ) {
            e.preventDefault();
    
            var formData = new FormData(this); //set formData to selected instance 
            var message = $('#message').val();
            var img = $('#img').val();
            var user_id = $('#user_id').val();
    
            $.ajax({
                type: "POST",
                url: "{{route('profile.store', ['id' => Auth::user()->id])}}",
                data: formData, //pass to our Ajax data to send
                success: function (data) {
                    $("#textpost").html($(data).find("#textpost").html());
                },
           contentType: false,
           processData: false,
            });
        });
    </script>
    

    设置processData 使您的FormData 不会转换为字符串。将contentType设置为false用于传递文件的表单,当为false时,请求中不会添加header,这正是我们在提交multipart/form-data时想要的。

    【讨论】:

      【解决方案2】:
       $validator  = $this->validate($request,[
              'message' => 'required|max:1000',
              'img' => 'mimes:jpeg,png,gif|max:3000',
          ]);
      

      这部分代码会抛出一个返回 422 的验证错误异常。

      如果您希望自己处理验证,请尝试以下逻辑:

      $validator = validator($request->all(), [
      'message' => 'required|max:1000',
              'img' => 'mimes:jpeg,png,gif|max:3000',
      ]);
      
      if($validator->fails()) {
      // return as appropriate
      return response()->son($validatior->errors(), 422);
      }
      
      // rest of your code
      

      【讨论】:

        猜你喜欢
        • 2019-03-14
        • 2021-05-27
        • 1970-01-01
        • 2016-04-30
        • 2016-01-13
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多