Javascript 将UINT8数组保存到二进制文件
我正在开发一个web应用程序,它可以打开二进制文件并允许对其进行编辑 这个过程基本上是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
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
的例子,但是当第一次尝试理解它时,它仍然令人困惑。是一个非常可靠的库,用于处理跨多个浏览器的文件下载。实际上,它与您的代码做的事情基本相同,但针对不支持该方法的不同浏览器进行调整。