我的AJAX调用发送一个FormData
对象,其中包含上传的图像数据:
$(document).on('submit', '#profileImageForm', function(e){
e.preventDefault();
var form_data = new FormData();
var image = document.getElementById('id_banner_image').files[0].name;
form_data.append('file', image);
$.ajax({
type:'POST',
url: '/change_banner_image/',
data : {
form_data: form_data,
csrfmiddlewaretoken: $("input[name='csrfmiddlewaretoken']").val(),
},
traditional: true,
cache: false,
success: function(response){
console.log('Success');
},
});
});
我在观看中成功接听了电话:
def change_banner_image(request):
if request.is_ajax():
data = request.POST.get('form_data')
profile = get_object_or_404(Profile, user=request.user)
profile.image = data
profile.save()
print(data)
return HttpResponse()
print(data)
打印:[object FormData]
。那么我如何从这个FormData
对象获取上传的图像?那将是profile.image
的值(FileField
)。
答案 0 :(得分:0)
问题是因为您对FormData
本身进行了编码,这是不正确的。它是二进制数据,无法以您尝试的方式进行编码。
您需要反转逻辑以将CSRF令牌添加到您发送的FormData
。您还需要将processData
和contentType
设置为false
,以便在发送请求之前不修改二进制数据,并删除traditional
属性。试试这个:
$(document).on('submit', '#profileImageForm', function(e){
e.preventDefault();
var form_data = new FormData();
var image = document.getElementById('id_banner_image').files[0].name;
form_data.append('file', image);
form_data.append('csrfmiddlewaretoken', $("input[name='csrfmiddlewaretoken']").val());
$.ajax({
type:'POST',
url: '/change_banner_image/',
data: form_data,
processData: false,
contentType: false,
cache: false,
success: function(response){
console.log('Success');
},
});
});
答案 1 :(得分:0)
你可以试试这个
data = request.data
如果您发送文件数据
files = request.FILES