Reputation: 6276
I have a JavaScript object with a huge amount of data in it, including several large base64 encoded strings.
We are currently sending the data to the server via a simple ajax POST but since the data is so large the wait time for the user is unacceptable.
For this reason we wish to harness the new html5 file upload features and actually measure the progress as the data is uploaded to the server so that the user is provided with constant feedback during this lengthy process.
In order to use this feature this large array will have to be sent as an actual file rather than as a huge object sent as url params.
Is there any way to either:
A. Convert this object into an actual text file and send it that way.
or
B. Hook into the html5 progress api and actually measure the progress of this standard ajax POST.
Thanks in advance.
Upvotes: 18
Views: 28480
Reputation: 25371
Convert to Blob
object or File
object, then append to FormData
, and use xhr
or fetch
to send to server.
var data = 'some data'; //string, arrary buffer, typed array, blob, ...
var filename01 = 'abc.txt', filename02 = 'efg.txt';
var type = 'text/plain';
var fd = new FormData();
//use file object
var file = new File([data], filename01, {type:type}); //add filename here
fd.append('file01', file);
//use blob object
var blob = new Blob([data], {type:type});
fd.append('file02', blob, filename02); //add filename by append method
fetch('/server.php', {method:'POST', body:fd})
.then(function(res){
return res.text();
})
.then(console.log)
.catch(console.error)
;
Upvotes: 2
Reputation: 2522
It's possible to take a JavaScript object (myData
), stringify it into JSON, pack that into a Blob of mimetype JSON, and send that to the server with the HTML5 upload API. You can use the progress (in the progress
callback function) to update the value of an HTML5 progress bar.
var myData = {
data1: "Huge amount of data",
data2: "More very large data"
};
var xhr = new XMLHttpRequest();
xhr.upload.addEventListener('progress', function (e) {
console.log(100*(e.loaded / e.total) + '%');
}, false);
xhr.open('POST', 'url', true);
var data = new FormData();
data.append('file', new Blob([JSON.stringify(myData)],{type:'application/json'}));
xhr.send(data);
Upvotes: 21