diff --git a/js/filedrop.field.js b/js/filedrop.field.js
index d4724aa8679cd81400dfceeb08bc8aed42c1d6f8..8b53508c1b5ea8f9ce969c8cddf766e50ff9d08b 100644
--- a/js/filedrop.field.js
+++ b/js/filedrop.field.js
@@ -48,13 +48,17 @@
       node.find('.trash').hide();
     },
     beforeSend: function (file, i, reader) {
+      var URL = window.webkitURL || window.URL;
       this.uploads.some(function(e) {
         if (e.data('file') == file) {
           if (file.type.indexOf('image/') === 0 && file.size < 1e6) {
-            e.find('.preview').attr('src', 'data:' + file.type + ';base64,' +
-              btoa(reader.result)).tooltip({items:'img',
+            var img = e.find('.preview')
+              .tooltip({items:'img',
                 tooltipClass: 'tooltip-preview',
-                content:function(){ return $(this).clone().wrap('<div>'); }});
+                content:function(){ return $(this).clone().wrap('<div>'); }}
+              )
+              .get()[0];
+              img.src = URL.createObjectURL(file);
           }
           return true;
         }
@@ -198,6 +202,8 @@
     cancelUpload: function(node) {
       if (node.data('xhr')) {
         node.data('xhr').abort();
+        var img = node.find('.preview').get()[0];
+        if (img) (window.webkitURL || window.URL).revokeObjectURL(img.src);
       }
       return this.deleteNode(node, false);
     },
@@ -205,7 +211,7 @@
       var message = $.fn.filedropbox.messages[err],
           filenode = this.findNode(file);
       if (file instanceof File) {
-        message = '<b>' + file.name + '</b><br/>' + message;
+        message = '<b>' + file.name + '</b><br/>' + message + '<br/>' + status;
       }
       $.sysAlert(__('File Upload Error'), message);
       if (filenode) this.cancelUpload(filenode);
@@ -372,8 +378,9 @@
     function getBuilder(filename, filedata, mime, boundary) {
       var dashdash = '--',
           crlf = '\r\n',
-          builder = '',
-          paramname = opts.paramname;
+          builder = [],
+          paramname = opts.paramname,
+          Blob = window.WebKitBlob || window.Blob;
 
       if (opts.data) {
         var params = $.param(opts.data).replace(/\+/g, '%20').split(/&/);
@@ -387,14 +394,14 @@
               return;
           }
 
-          builder += dashdash;
-          builder += boundary;
-          builder += crlf;
-          builder += 'Content-Disposition: form-data; name="' + name + '"';
-          builder += crlf;
-          builder += crlf;
-          builder += val;
-          builder += crlf;
+          builder.push(dashdash
+              + boundary
+              + crlf
+              + 'Content-Disposition: form-data; name="' + name + '"'
+              + crlf
+              + crlf
+              + val
+              + crlf);
         });
       }
 
@@ -402,25 +409,24 @@
         paramname = paramname(filename);
       }
 
-      builder += dashdash;
-      builder += boundary;
-      builder += crlf;
-      builder += 'Content-Disposition: form-data; name="' + (paramname||"") + '"';
-      builder += '; filename="' + encodeURIComponent(filename) + '"';
-      builder += crlf;
-
-      builder += 'Content-Type: ' + mime;
-      builder += crlf;
-      builder += crlf;
-
-      builder += filedata;
-      builder += crlf;
-
-      builder += dashdash;
-      builder += boundary;
-      builder += dashdash;
-      builder += crlf;
-      return builder;
+      builder.push(dashdash
+          + boundary
+          + crlf
+          + 'Content-Disposition: form-data; name="' + (paramname||"") + '"'
+          + '; filename="' + encodeURIComponent(filename) + '"'
+          + crlf
+
+          + 'Content-Type: ' + mime
+          + crlf
+          + crlf);
+
+      builder.push(filedata);
+      builder.push(crlf
+          + dashdash
+          + boundary
+          + dashdash
+          + crlf);
+      return new Blob(builder);
     }
 
     function progress(e) {
@@ -587,7 +593,7 @@
                 return send(e);
             };
 
-            reader.readAsBinaryString(files[fileIndex]);
+            reader.readAsArrayBuffer(files[fileIndex]);
 
           } else {
             filesRejected++;
@@ -665,14 +671,14 @@
           xhr.setRequestHeader(k, v);
         });
 
-        xhr.sendAsBinary(builder);
+        xhr.send(builder);
 
         global_progress[global_progress_index] = 0;
         globalProgress();
 
         opts.uploadStarted(index, file, files_count, xhr);
 
-        var afterComplete = function() {
+        var afterComplete = function(result) {
           filesDone++;
 
           // Remove from processing queue
@@ -714,7 +720,7 @@
                 timeDiff = now - start_time,
                 result = opts.uploadFinished(index, file, serverResponse, timeDiff, xhr);
 
-            afterComplete();
+            afterComplete(result);
 
           // Pass any errors to the error option
           if (xhr.status < 200 || xhr.status > 299) {