Search code examples
javascriptjqueryajax

How to upload a file using Ajax on POST?


I know, the topics aren't missing on this subject but bear with me. I'd like to upload a file to the server using Ajax or an equivalent.

# 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
        ...
...

I guess there's an issue with the way I configured the ajax function since on debug mode, every data are returned except the logo.

Am I doing something incorrectly?


Solution

  • Looking back, the older answer is unpractical and not recommended. async: false pauses the entire Javascript to simply upload a file, you are likely firing other functions during the upload.

    If you are using JQuery solely for the use of ajax, then I recommend using 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 Documentation


    Jquery/Ajax answer:

    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 Documentation