загрузка файла и других атрибутов с помощью AJAX django

#python #jquery #django #ajax

#python #jquery #django #ajax

Вопрос:

Я хочу загрузить свой файл с некоторыми другими атрибутами, используя AJAX

Мой код AJAX:

         var file = $('#uploaded-file').get(0).files[0]
        if (file != null) {
            var reader = new FileReader()
            reader.onload = function () {
                var filedata = reader.result;
                $.ajax({
                    url: '/upload_file',
                    type: 'POST',
                    dataType: 'json',
                    headers: {
                        'X-CSRFToken': '{{ csrf_token }}'
                    },
                    data:JSON.stringify({'data':filedata, 'name':file.name}),
                    success: function (response) {
                        console.log(response)
                    },
                    error: function (response) {
                        console.log(response)
                    }
                })

            };
            reader.readAsArrayBuffer(file)
        }
  

Мой Djnago view.py:

 def upload_file(request):
    print(json.loads(request.body))
    return JsonResponse({'response':'request done'})
  

однако я не получаю данные файла в теле моего запроса

 {'data': {}, 'name': 'abc.csv'}
  

чего мне здесь не хватает?

Ответ №1:

Я бы посоветовал вам использовать FormData

 var file = $('#uploaded-file').get(0).files[0]

var formData = new FormData();

formData.append("file", file, file.name);
formData.append("some_other_field", 'value');


    $.ajax({
                url: '/upload_file',
                type: 'POST',
                dataType: 'json',
                headers: {
                    'X-CSRFToken': '{{ csrf_token }}'
                },
                data: formData
                success: function (response) {
                    console.log(response)
                },
                error: function (response) {
                    console.log(response)
                },
                contentType: false,
                processData: false, // important
            })
  

чтобы получить файл в Django:

 request.FILES.getlist('file')
  

Комментарии:

1. request.POST.get(‘file’) просто возвращает ‘[object ArrayBuffer]’ и это только строка

2. @Hassam проверьте обновленный ответ. вы должны использовать request.FILES для получения файла