小编典典

如何在POST上使用Ajax上传文件?

ajax

我知道,关于这个主题的话题并非没有,但请耐心等待。我想使用Ajax或等效文件将文件上传到服务器。

# html
<form method="post" id="Form" enctype="multipart/form-data">
  {% csrf_token %} # django security
  <input id="image_file" type="file" name="image_file">
  <input type="submit" value="submit">
</form>

# javascript
$(document).on('submit', '#Form', function(e){
  e.preventDefault();

  var form_data = new FormData();
  form_data.append('file', $('#image_file').get(0).files);

  $.ajax({
      type:'POST',
      url:'my_url',
      processData: false,
      contentType: false,
      data:{
          logo:form_data,
          csrfmiddlewaretoken:$('input[name=csrfmiddlewaretoken]').val(), # django security
      },
  });
});

# views.py (server side)
def myFunction(request):
    if request.method == 'POST':
        image_file = request.FILES
        ...
...

我猜我配置ajax函数的方式存在问题,因为在调试模式下,除之外的所有数据均会返回logo

我做错了什么吗?


阅读 242

收藏
2020-07-26

共1个答案

小编典典

回顾过去,较旧的答案不切实际,不建议使用。asnyc: false暂停整个Javascript以仅上传文件, 您可能会在上传过程中触发其他功能

如果您仅将JQuery用于ajax,则我建议使用axios

const axios = require('axios');

var formData = new FormData();
formData.append('imageFile', document.querySelector('#image_file').files[0]);

axios({
    method: 'post',
    url: 'your_url',
    data: formData,
    headers: {
        "X-CSRFToken": CSRF_TOKEN, # django security
        "content-type": "multipart/form-data"
    }
}).then(function (response) {
    # success
});

Axios文档


jQuery / Ajax答案:

var formData = new FormData();
formData.append('imageFile', $('#image_file')[0].files[0]);
formData.append('csrfmiddlewaretoken', CSRF_TOKEN); # django security

$.ajax({
   url : 'your_url',
   type : 'POST',
   data : formData,
   processData: false,
   contentType: false,
   success : function(data) {
       # success
   }
});

jQuery / Ajax文档

2020-07-26