Monday, June 3, 2024
 Popular · Latest · Hot · Upcoming
69
rated 0 times [  73] [ 4]  / answers: 1 / hits: 28423  / 10 Years ago, sun, august 17, 2014, 12:00:00

I am working on a web app that opens binary files and allows them to be edited.



This process is basically ondrop -> dataTransfer.files[0] -> FileReader -> Uint8Array



Essentially, I want to be able to save the modified file back as a binary file. Ideally as a file download with a specified file name.



There doesn't seem to be any standard method of doing this, and that sucks, because everything up to that point is well supported.



I am currently converting the array to a string using String.fromCharCode(), base64 encoding that, and using a data uri in a hyperlink like data:application/octet-stream;base64,.., along with the download attribute to specify filename.



It seems to work, but it's quite hacky and I think converting the raw bytes to a string might introduce encoding issues depending on the byte values. I don't want the data to become corrupt or break the string.



Barring that, is there a better/proper method for getting an array of bytes as a binary file to the user?


More From » file-io

 Answers
26

These are utilities that I use to download files cross-browser. The nifty thing about this is that you can actually set the download property of a link to the name you want your filename to be.



FYI the mimeType for binary is application/octet-stream



var downloadBlob, downloadURL;

downloadBlob = function(data, fileName, mimeType) {
var blob, url;
blob = new Blob([data], {
type: mimeType
});
url = window.URL.createObjectURL(blob);
downloadURL(url, fileName);
setTimeout(function() {
return window.URL.revokeObjectURL(url);
}, 1000);
};

downloadURL = function(data, fileName) {
var a;
a = document.createElement('a');
a.href = data;
a.download = fileName;
document.body.appendChild(a);
a.style = 'display: none';
a.click();
a.remove();
};


Usage:



downloadBlob(myBinaryBlob, 'some-file.bin', 'application/octet-stream');

[#69749] Thursday, August 14, 2014, 10 Years  [reply] [flag answer]
Only authorized users can answer the question. Please sign in first, or register a free account.
kalias

Total Points: 79
Total Questions: 116
Total Answers: 116

Location: Malaysia
Member since Wed, May 11, 2022
2 Years ago
;