Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Posting File Input as FileReader Binary Data through AJAX Post

I am trying to post an attachment uploaded to an HTML file input to a web page through a rest API. The API documentation states that the post is a straight binary content as the body of the HTTP request, not a form file upload.

My code is as follows:

$('#_testButton').bind('click', function () {     var file = document.getElementById('_testFile').files[0]     var reader = new FileReader();     reader.onload = function () {         $.ajax({             url: '/attachmentURL',             type: 'POST',             data: reader.result         })     }     reader.readAsBinaryString(file) }) 

I need this to work for a number of different mimeTypes, so I didn't declare it in the code above. However, I have tried declaring contentType:'application/msword' for a .doc file and also tried processData:false and contentType:false.

The data is being posted where it should. However, when I open the file, I get a message that says mimeType:application/x-empty with an empty file OR a file with a bunch of binary characters. I've tried .doc files and a pdf files and the result is the same for both.

Does anyone have a clue what I can change to make this work?

like image 395
Eric H. Avatar asked Jul 09 '12 16:07

Eric H.


1 Answers

Simply sending the file reference as data (with processData: false) did the job for me at least:

$('#_testButton').bind('click', function () {     var file = document.getElementById('_testFile').files[0];      $.ajax({         url: "/attachmentURL",         type: "POST",         data: file,         processData: false     }); }); 

It is described here: https://developer.mozilla.org/en/DOM/XMLHttpRequest/Sending_and_Receiving_Binary_Data#section_3

Sending a string (even if that string represents binary data) will not work because the browser will forcibly turn it into unicode and encode as utf-8 as specified which will corrupt the binary data:

If data is a string Let encoding be UTF-8.

Let mime type be "text/plain;charset=UTF-8".

Let the request entity body be data converted to Unicode and encoded as UTF-8.

Sending a file reference (blob) will do this:

If data is a Blob If the object's type attribute is not the empty string let mime type be its value.

Let the request entity body be the raw data represented by data.

like image 62
Esailija Avatar answered Sep 20 '22 15:09

Esailija