如何通过Ajax将多部分表单提交到web2py? (表格包括文件)

时间:2014-11-11 10:29:56

标签: jquery python ajax forms web2py

我必须处理一个任意文件,不一定与模型有关。所以,假设我希望完全控制它发送的表单和数据。我在控制器中有一个“手动构建”的表单:

the_form = FORM(INPUT(_type='file', _name='image'),
                INPUT(_type='text', _name='sometext'),
                _action=URL('controller', 'upload_test'),
                _method='post')

在视图中,我会正常显示表单,让我们说{{= the_form}} 然后,通过使用简单的jQuery,我尝试通过Ajax提交表单。

但是,我遇到了以下问题:

  • 该文件似乎没有通过服务器;
  • 最终我发现有一个 request._body.file 似乎包含了上传的文件,但在尝试阅读时我得到“访问被拒绝”(这是一个临时文件) ;而且使用它感觉不对。

为什么文件不能通过常规request.vars或request.post_vars进入服务器端?任何帮助是极大的赞赏。谢谢。

1 个答案:

答案 0 :(得分:0)

我自己设法解决了这个问题。如果我可以这么说,那么"技巧就是通过不同地序列化表单数据,以适当的方式将数据发送到服务器。以下是对此的简要说明:

(function($) {
$.fn.serializefiles = function() {
    var obj = $(this);
    var formData = new FormData();
    var params = $(obj).serializeArray();

    $.each($(obj).find("input[type='file']"), function(i, tag) {
        $.each($(tag)[0].files, function(i, file) {
            formData.append(tag.name, file);
        });
    });

    $.each(params, function (i, val) {
        formData.append(val.name, val.value);
    });
    return formData;
};
})(jQuery);

var form_request_data = $("form").serializefiles();

var ajaxParams = {
        type: "POST",
        url : target_url,
        data : form_request_data,
        cache: false,
        contentType: false,
        processData: false,
        async : true
};

$.ajax(ajaxParams).done( function(request_result) {
 ... 
}