通过Ajax FormData()发送文件和字符串

时间:2019-08-20 15:17:50

标签: python jquery html ajax mongodb

我正在尝试使用Ajax中的FormData()函数将文件以及字符串上传到MongoDB。我知道,除非我们设置processData: false,否则Ajax倾向于对所有传递的数据进行字符串化处理,因此我必须对文件和字符串都使用FormData。

HTML片段

<h5 class="modal-title h5Modal" id="htmlIP"></h5>
<div class="form-group">
<label for="fileUpload">Choose a File To Upload:</label>
<input type="file" id="fileUpload" accept="image/*,.pdf,.pptx" class="file-path">
</div>
<div class="modal-footer">
<button class="btn btn-primary submitFile" data dismiss="modal" > Submit </button>
</div>

Python

def FileSubmit(request):
    if request.method == "GET":
       ip = request.GET['IP']
       file = request.GET['fileUpload']

    else:
       ip = ''

    res = Pc.uploadToDB(ip, file)


    data = {
         'version' : res,
    }

    return JsonResponse(data)        

其中的uploadToDB函数在MongoDB中查找具有提供的ip的文档,并更新文件字段。

这是我的 Ajax 函数:

$(document).ready(function() {
    $('.submitFile').on('click,function(){
        var rowID = $('#htmlIP').text();

        formdata = new FormData();
        var file = document.getElementById('fileUpload').files[0];
        formdata.append('file', file);


        $.ajax({
            type: "GET",
            url: 'FileSubmit/' + rowID,
            //data: {
            //    'IP': rowID,
            //    'fileUpload': file,
            //},
            data: formdata,
            processData: false,
            contentType: false,
            success: function(data){
                alert(data.version);
                window.location.reload();
            },
            error: function(err){
                alert(err);
             }
         });

    });
});

如您所见,我已经注释掉了我使用数据的第一种方法。

当我尝试使用这些功能上传文件时,出现以下错误:

Not Found: Path/to/FileSubmit/XXX.XXX.XXX.XXX

这是可以理解的,因为我在不应该提供rowID时将其作为URL。但这是我能够正确获取文件和IP的最接近的方法。

每当我删除url中的rowID并尝试使用其他解决方案时,我都会得到相同的以下错误,该错误指向使用Python编写的request.GET行:

MultiValueDictKeyError: "u'IP'"

这意味着它无法正确读取IP。

我查看了Send FormData and String Data Together Through JQuery AJAX?中提供的大多数答案 但是,不幸的是,大多数人并没有帮助我,因为他们专注于上传一组字符串而不是一个实例。

是否可以将字符串追加到formdata或其他我不知道的方法?任何帮助或建议,我们将不胜感激。

1 个答案:

答案 0 :(得分:0)

我认为问题出在您的AJAX请求类型上。您应该发送models.surveys.belongsTo(models.users, { as: "to" });发送文件请求。

{condition ? trueComponent : falseComponent}