Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How can I upload files asynchronously with jQuery?

I would like to upload a file asynchronously with jQuery.

$(document).ready(function () {      $("#uploadbutton").click(function () {          var filename = $("#file").val();            $.ajax({              type: "POST",              url: "addFile.do",              enctype: 'multipart/form-data',              data: {                  file: filename              },              success: function () {                  alert("Data Uploaded: ");              }          });      });  });
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/2.2.0/jquery.min.js"></script>  <span>File</span>  <input type="file" id="file" name="file" size="10"/>  <input id="uploadbutton" type="button" value="Upload"/>

Instead of the file being uploaded, I am only getting the filename. What can I do to fix this problem?

like image 548
Sergio del Amo Avatar asked Oct 03 '08 10:10

Sergio del Amo


People also ask

What is asynchronous file upload?

This feature allows you to upload and remove files asynchronously. When multiple files are chosen in Asynchronous upload,files will be uploaded one by one to the server. User interaction with the page will not be interrupted at the time of upload. User can also remove the file even after uploading.

What is jQuery file upload?

jQuery HTML5 Uploader This uploader allows you to drag and drop files into an element (e.g. a <div> ) and then uploads the file (or multiple files) to a specified URL.

Can Ajax upload files?

html file through a browser, the client will be able to upload a file to the server using Ajax and pure JavaScript.


2 Answers

With HTML5 you can make file uploads with Ajax and jQuery. Not only that, you can do file validations (name, size, and MIME type) or handle the progress event with the HTML5 progress tag (or a div). Recently I had to make a file uploader, but I didn't want to use Flash nor Iframes or plugins and after some research I came up with the solution.

The HTML:

<form enctype="multipart/form-data">     <input name="file" type="file" />     <input type="button" value="Upload" /> </form> <progress></progress> 

First, you can do some validation if you want. For example, in the .on('change') event of the file:

$(':file').on('change', function () {   var file = this.files[0];    if (file.size > 1024) {     alert('max upload size is 1k');   }    // Also see .name, .type }); 

Now the $.ajax() submit with the button's click:

$(':button').on('click', function () {   $.ajax({     // Your server script to process the upload     url: 'upload.php',     type: 'POST',      // Form data     data: new FormData($('form')[0]),      // Tell jQuery not to process data or worry about content-type     // You *must* include these options!     cache: false,     contentType: false,     processData: false,      // Custom XMLHttpRequest     xhr: function () {       var myXhr = $.ajaxSettings.xhr();       if (myXhr.upload) {         // For handling the progress of the upload         myXhr.upload.addEventListener('progress', function (e) {           if (e.lengthComputable) {             $('progress').attr({               value: e.loaded,               max: e.total,             });           }         }, false);       }       return myXhr;     }   }); }); 

As you can see, with HTML5 (and some research) file uploading not only becomes possible but super easy. Try it with Google Chrome as some of the HTML5 components of the examples aren't available in every browser.

like image 197
olanod Avatar answered Oct 08 '22 00:10

olanod


2019 Update: It still depends on the browsers your demographic uses.

An important thing to understand with the "new" HTML5 file API is that it wasn't supported until IE 10. If the specific market you're aiming at has a higher-than-average propensity toward older versions of Windows, you might not have access to it.

As of 2017, about 5% of browsers are one of IE 6, 7, 8 or 9. If you head into a big corporation (e.g., this is a B2B tool or something you're delivering for training) that number can skyrocket. In 2016, I dealt with a company using IE8 on over 60% of their machines.

It's 2019 as of this edit, almost 11 years after my initial answer. IE9 and lower are globally around the 1% mark but there are still clusters of higher usage.

The important take-away from this —whatever the feature— is, check what browser your users use. If you don't, you'll learn a quick and painful lesson in why "works for me" isn't good enough in a deliverable to a client. caniuse is a useful tool but note where they get their demographics from. They may not align with yours. This is never truer than enterprise environments.

My answer from 2008 follows.


However, there are viable non-JS methods of file uploads. You can create an iframe on the page (that you hide with CSS) and then target your form to post to that iframe. The main page doesn't need to move.

It's a "real" post so it's not wholly interactive. If you need status you need something server-side to process that. This varies massively depending on your server. ASP.NET has nicer mechanisms. PHP plain fails, but you can use Perl or Apache modifications to get around it.

If you need multiple file uploads, it's best to do each file one at a time (to overcome maximum file upload limits). Post the first form to the iframe, monitor its progress using the above and when it has finished, post the second form to the iframe, and so on.

Or use a Java/Flash solution. They're a lot more flexible in what they can do with their posts...

like image 32
Oli Avatar answered Oct 08 '22 00:10

Oli