Simple AJAX image upload with Rails

I was developing a small feature: AJAX upload user avatars. This means:

  • User select an image from local computer
  • Avatar is uploaded immediately after being selected
  • Update user avatar display after uploading successfully

All without reloading the page.

There are plenty of JS libraries that satifies the requirements above however after trying several libraries, I decided to not use any of them for the following reasons:

  • adding a library is too much, the library often offers too many configs and options that almost unnecessary for this case.
  • libraries often hack the element and inject their own style. making their style fit with provided design is often too complex to make it worth.

Therefore I’m searching for a minimalistic solution and came up with the piece of code below:

$(document).on('turbolinks:load', function() {  $("#js-avatar-uploader").change(function() {    var fd = new FormData();    fd.append('avatar', $('#js-avatar-uploader')[0].files[0])    $.ajax({      url: '/avatars',      data: fd,      processData: false,      type: 'POST',      contentType: false,      cache: false,      mimeType: 'multipart/form-data',      dataType: 'JSON',      beforeSend: function() {        $('span.js-upload-text').text('Uploading...')      }    })    .done(function (data) {      $('img#js-avatar').attr('src', data.avatar)    })    .always(function () {      $('span.js-upload-text').text('Upload New Image')    })  })})

This solution ultilizes FormData interface (https://developer.mozilla.org/en-US/docs/Web/API/FormData) and jQuery AJAX.

To make the AJAX call work with file uploading, the following options must be set as follow:

processData: false,contentType: false,cache: false,mimeType: 'multipart/form-data',

Xổ số miền Bắc