我正在尝试使用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或其他我不知道的方法?任何帮助或建议,我们将不胜感激。
答案 0 :(得分:0)
我认为问题出在您的AJAX请求类型上。您应该发送models.surveys.belongsTo(models.users, { as: "to" });
发送文件请求。
{condition ? trueComponent : falseComponent}