将Uint8Array保存为二进制文件

bry*_*ryc 15 javascript file-io cross-browser binary-data typed-arrays

我正在开发一个打开二进制文件的Web应用程序,并允许对它们进行编辑.

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

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

似乎没有任何标准方法可以做到这一点,这很糟糕,因为到目前为止的一切都得到了很好的支持.

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

它似乎工作,但它很hacky,我认为将原始字节转换为字符串可能会引入编码问题,具体取决于字节值.我不希望数据损坏或破坏字符串.

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

小智 17

(较短)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)
}
Run Code Online (Sandbox Code Playgroud)


Ste*_*fan 13

这些是我用来跨浏览器下载文件的实用程序.关于这一点的好处是,您实际上可以将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();
};
Run Code Online (Sandbox Code Playgroud)

用法:

downloadBlob(myBinaryBlob, 'some-file.bin', 'application/octet-stream');
Run Code Online (Sandbox Code Playgroud)

  • [FileSaver.js](https://github.com/eligrey/FileSaver.js) 是一个非常可靠的库,用于处理跨多个浏览器的文件下载。在底层,它的作用与您的代码基本相同,但会针对不支持该方法的不同浏览器进行调整。 (2认同)