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

Hir*_*uri 11 javascript ajax jquery

我知道关于这个主题的主题并没有遗漏,这就是为什么我查看了关于这个主题的大量帖子,找不到令我满意的东西,所以我试图自己构建它.

我想要做的就是使用Djaxo使用Ajax上传文件以避免页面刷新.

这是我做的:

basic_upload.html:

# 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>
Run Code Online (Sandbox Code Playgroud)

Ajax.js:

# 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
      },
  });
});
Run Code Online (Sandbox Code Playgroud)

Views.py:

# views.py (server side)
def myFunction(request):
    if request.method == 'POST':
        image_file = request.FILES
        ...
...
Run Code Online (Sandbox Code Playgroud)

(forms.py和urls.py配置正确,没有必要包含它们).

我想我在ajax.js上的方式存在问题,因为在调试时logo返回除了之外的每个数据logo.

我在做什么直言不讳?

Mah*_*han 12

以下方法适用于我,它将提交所有表格值serialize().您将获得所有表单输入内部request.POST和徽标request.FILES

试试这个:

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

  var form_data = new FormData($('#creationOptionsForm')[0]);
  $.ajax({
      type:'POST',
      url:'/designer/results/',
      processData: false,
      contentType: false,
      async: false,
      cache: false,
      data : form_data,
      success: function(response){

      }
  });
});
Run Code Online (Sandbox Code Playgroud)

更新:

基本上async:false会做ajax请求并停止执行进一步的js代码,直到时间请求完成,因为上传文件可能需要一些时间才能上传到服务器.

同时cache将强制浏览器不缓存上传的数据以获取ajax请求中的更新数据

官方文档在这里

  • 您不再需要`async:false`(相反:如果您设置它,您将在Chrome控制台中收到警告) (4认同)

Hir*_*uri 6

回想起来,旧的答案是不切实际的,不推荐。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
});
Run Code Online (Sandbox Code Playgroud)

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
   }
});
Run Code Online (Sandbox Code Playgroud)

Jquery/Ajax文档