jQuery.FileUpload HTTP响应错误

时间:2015-09-17 01:26:33

标签: laravel-5 jquery-file-upload blueimp

我正在使用blueimp的jQuery.fileUpload组件来构建使用Laravel 5的应用程序的一部分。表单本身正在按预期工作,但我很难在服务器端进行验证:

Laravel的请求验证处理ajax请求的后端验证,当验证失败时,响应将以HTTP 422代码发送。

主要问题是blueimp的jQuery.fileUpload不解析包含验证消息的file(json)数组(doc. link)。相反,它只是使用HTTP 422代码的标准描述。

你们知道一种方法来覆盖它吗?如何手动解析验证返回的json?或者有没有办法让Laravel返回HTTP 200,即使验证失败了?

以下是一些代码:

Laravel的请求类:

    class UploadRequest extends Request {

        /**
         * Determine if the user is authorized to make this request.
         *
         * @return bool
         */
        public function authorize()
        {
            return true;
        }

        /**
         * Get the validation rules that apply to the request.
         *
         * @return array
         */
        public function rules()
        {
            Log::info("Request de upload");
            return [
                'file' => 'required|max:1200'
            ];
        }
    }

这是我的jQuery.fileUpload初始化脚本:

$(function () {
    'use strict';
    var jupload = $('#fileupload');
    jupload.fileupload({
        url: window.location
    });

    // from http://stackoverflow.com/a/21728472
    if (typeof existingfiles !== 'undefined'){
        jupload.fileupload('option', 'done').call(jupload, $.Event('done'), {result: existingfiles});
    };
});

提前致谢, 肖托。

1 个答案:

答案 0 :(得分:0)

几天前我遇到了同样的问题...如果你看一下每个回调中可用的data对象,你会看到它在另一个对象jqXHR内(毕竟)我们只处理一个jQuery AJAX调用),它本身就有另一个名为responseJSON的对象,其中包含一个包含您正在寻找的错误的数组。

来自官方的blueimp docs

" send方法返回一个jqXHR对象,允许将回调绑定到ajax文件上传请求:"

var jqXHR = $('#fileupload').fileupload('send', {files: filesList})
.success(function (result, textStatus, jqXHR) {/* ... */})
.error(function (jqXHR, textStatus, errorThrown) {/* ... */})
.complete(function (result, textStatus, jqXHR) {/* ... */});

所以现在,你可以做点像......

$('#fileupload').fileupload({
    fail: function (e, data) {
        var errors = data.jqXHR.responseJSON;
        $.each(errors, function (key, value) {
            alert(value);
        });
    }
});

或者更合适:

var jqXHR = data.submit()
        .success(function (result, textStatus, jqXHR) {/* ... */})
        .error(function (jqXHR, textStatus, errorThrown) {
            console.log(data);
            var errors = jqXHR.responseJSON;
            $.each(errors, function (key, value) {
                alert(value);
            });
        })
        .complete(function (result, textStatus, jqXHR) {/* ... */});