将Uint8Array保存为二进制文件

Saving a Uint8Array to a binary file

本文关键字:二进制文件 保存 Uint8Array      更新时间:2023-09-26

我正在开发一个打开二进制文件并允许编辑它们的web应用程序。

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

本质上,我希望能够将修改后的文件保存回二进制文件。最理想的方式是下载带有指定文件名的文件。

似乎没有任何标准的方法来做到这一点,这很糟糕,因为到目前为止,所有的东西都得到了很好的支持。

我目前正在将数组转换为使用String.fromCharCode()的字符串,base64编码,并在data:application/octet-stream;base64,..等超链接中使用数据uri,以及download属性来指定文件名。

它似乎工作,但它是相当黑客,我认为将原始字节转换为字符串可能会引入编码问题,这取决于字节值。我不希望数据损坏或破坏字符串。

除此之外,是否有更好/适当的方法来获取字节数组作为二进制文件给用户?

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

二进制文件的mime类型是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 = (data, fileName) => {
  const a = document.createElement('a')
  a.href = data
  a.download = fileName
  document.body.appendChild(a)
  a.style.display = 'none'
  a.click()
  a.remove()
}
const downloadBlob = (data, fileName, mimeType) => {
  const blob = new Blob([data], {
    type: mimeType
  })
  const url = window.URL.createObjectURL(blob)
  downloadURL(url, fileName)
  setTimeout(() => window.URL.revokeObjectURL(url), 1000)
}