尝试通过Laravel 5.2中的AJAX上传文件时请求为空

时间:2016-03-20 16:57:20

标签: php jquery ajax file-upload laravel-5

我在尝试通过AJAX上传 Laravel 5.2 中的文件时遇到问题。我想使用new FormData()方法提交包含一些文本字段和文件输入的表单,但Request :: all()似乎在控制器中返回一个空数组。仅当我尝试上传图像时才会出现此问题。如果我将文件输入留空,一切都很好,所有文本输入都显示出来。我试图用每个选项改变AJAX调用,但结果相同。

表格:

<form id="my_form">
   <input type="text" name="u_name" placeholder="Enter name" value="{{ $user->NAME }}"> 
   <input type="email" name="u_email" placeholder="Enter email" value="{{ $user->EMAIL }}">
   <input type="file" name="u_picture">
   <input type="submit" id="submit" value="Save">    
</form>

jQuery AJAX请求:

 $('#my_form').submit(function(){

    $.ajax({
        type: "POST",
        headers: {'X-CSRF-TOKEN': "{{ csrf_token() }}" },
        dataType: "json",
        url: "/submit",
        contentType: false,
        data : new FormData($('#my_form')[0]),
        processData: false,
        async: true,
        success: function(data){
          console.log(data);
        }

    }).fail(function(data) {
        console.log('Error');
    });
    return false;
});

控制器方法:

public function editProfile(){
   if(Request::hasFile('u_image'){
      return 'It has image';
   }
   return Request::all();

}

输出文件输入为空:

Object {u_name: "Test", u_email: "abc@abc.com"}

输出文件输入非空:

[]

但是,在两种情况下似乎都能正确发送请求,因为在Google Chrome中的网络标签中,请求是这样的:

------WebKitFormBoundaryFZlyLOFBAsPNOk7v
Content-Disposition: form-data; name="u_name"

Test

------WebKitFormBoundaryFZlyLOFBAsPNOk7v
Content-Disposition: form-data; name="u_email"

abc@abc.com

------WebKitFormBoundaryFZlyLOFBAsPNOk7v
Content-Disposition: form-data; name="u_picture"; filename="1.jpg"
Content-Type: image/jpeg


------WebKitFormBoundaryFZlyLOFBAsPNOk7v--

我也尝试用async:false发送AJAX,但没有结果。有什么我做错了吗?

编辑:即使使用Postman的AJAX调用,问题仍然存在

编辑2:我隔离了问题。在我的原始代码中,我使用方法Request::hasFile('u_picture')来验证字段是否为空。没有if声明,一切都像魅力一样(当然,在没有图片的情况下提交表单)。所以现在我的问题是:我该如何解决这个问题?

1 个答案:

答案 0 :(得分:0)

我解决了这个问题...不知何故。我使用 case mixIt 2 2 of Nice tuple -> fst tuple Whoops -> ... some Haskell code to produce another tuple ... 外观来过滤请求,而不是使用导致错误的Request::hasFile()方法。所以我的新控制器看起来像这样:

Validator

也许这不是正确的方法,但它正在发挥作用。希望它会帮助别人。