Javascript 将UINT8数组保存到二进制文件

Javascript 将UINT8数组保存到二进制文件,javascript,file-io,cross-browser,binary-data,typed-arrays,Javascript,File Io,Cross Browser,Binary Data,Typed Arrays,我正在开发一个web应用程序,它可以打开二进制文件并允许对其进行编辑 这个过程基本上是ondrop->dataTransfer.files[0]->FileReader->Uint8Array 本质上,我希望能够将修改后的文件保存回二进制文件。理想情况下,作为具有指定文件名的文件下载 似乎没有任何标准的方法来做这件事,这很糟糕,因为在这一点上所有的事情都得到了很好的支持 我目前正在使用string.fromCharCode(),base64编码,并在类似data:application/octe

我正在开发一个web应用程序,它可以打开二进制文件并允许对其进行编辑

这个过程基本上是
ondrop->dataTransfer.files[0]->FileReader->Uint8Array

本质上,我希望能够将修改后的文件保存回二进制文件。理想情况下,作为具有指定文件名的文件下载

似乎没有任何标准的方法来做这件事,这很糟糕,因为在这一点上所有的事情都得到了很好的支持

我目前正在使用
string.fromCharCode()
,base64编码,并在类似
data:application/octet流的超链接中使用数据uri,将数组转换为字符串;base64,…
,以及用于指定文件名的
下载
属性

这似乎是可行的,但它相当粗糙,我认为将原始字节转换为字符串可能会带来编码问题,具体取决于字节值。我不希望数据损坏或破坏字符串


除此之外,是否有更好/合适的方法将字节数组作为二进制文件发送给用户?

这些是我用于跨浏览器下载文件的实用程序。有趣的是,您可以将链接的
download
属性设置为您想要的文件名

仅供参考,二进制的mimeType是
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();
};
用法:

downloadBlob(myBinaryBlob, 'some-file.bin', 'application/octet-stream');
(较短)ES6版本的顶级答案:

const downloadURL=(数据,文件名)=>{
常量a=document.createElement('a')
a、 href=数据
a、 下载=文件名
document.body.appendChild(a)
a、 style.display='none'
a、 单击()
a、 删除()
}
const downloadBlob=(数据、文件名、mimeType)=>{
const blob=新blob([data]{
类型:mimeType
})
常量url=window.url.createObjectURL(blob)
下载url(url,文件名)
setTimeout(()=>window.URL.revokeObjectURL(URL),1000)
}

这让我很困惑,downloadURL中的参数与用于调用它的参数不同。该示例使用
downloadBlob
(第一个函数),然后调用
downloadURL
,因此参数反映的是第一个函数,而不是您调用的第二个函数
downloadURL(url、文件名、mimeType)
downloadBlob
中下载,但函数是
downloadURL(数据、文件名)
,因此,除非有我不理解的相同魔法发生,否则它不匹配。我认为这是一个删除
mimeType
的例子,但是当第一次尝试理解它时,它仍然令人困惑。是一个非常可靠的库,用于处理跨多个浏览器的文件下载。实际上,它与您的代码做的事情基本相同,但针对不支持该方法的不同浏览器进行调整。