为了账号安全,请及时绑定邮箱和手机立即绑定

合并大量 UInt8Arrays

合并大量 UInt8Arrays

摇曳的蔷薇 2022-07-08 16:00:53
我这里有一些代码,例如,在浏览器中使用js-ipfs. 它目前正在工作。async function start(event) {  console.log("Starting IPFS...");  node = await Ipfs.create();  for await (const file of node.get('QmQxBX5ZKRY8k6W2UqYTMxhdFTvkmNw8X7GJN3t5UiyBpe')) {    console.log("Starting");    var content = [];    for await (const chunk of file.content) {      console.log("Gathering");      content = mergeTypedArrays(content, chunk); // slow    }    console.log("Assembling");    saveFile("arch.iso", "application/octet-stream", content);    console.log("Done");  };}// https://stackoverflow.com/a/35633935/2700296function mergeTypedArrays(a, b) {  // Checks for truthy values on both arrays  if(!a && !b) throw 'Please specify valid arguments for parameters a and b.';    // Checks for truthy values or empty arrays on each argument  // to avoid the unnecessary construction of a new array and  // the type comparison  if(!b || b.length === 0) return a;  if(!a || a.length === 0) return b;  // Make sure that both typed arrays are of the same type  if(Object.prototype.toString.call(a) !== Object.prototype.toString.call(b))      throw 'The types of the two arguments passed for parameters a and b do not match.';  var c = new a.constructor(a.length + b.length);  c.set(a);  c.set(b, a.length);  return c;}// https://stackoverflow.com/a/36899900/2700296function saveFile (name, type, data) {  if (data !== null && navigator.msSaveBlob) {    return navigator.msSaveBlob(new Blob([data], { type: type }), name);  }  var a = document.createElement('a');  a.style.display = "none";  var url = window.URL.createObjectURL(new Blob([data], {type: type}));  a.setAttribute("href", url);  a.setAttribute("download", name);  document.body.appendChild(a);  a.click();  window.URL.revokeObjectURL(url);  a.remove();}问题是,当前组装 UInt8Array 以发送到的方法saveFile涉及在所有下载的约 2600 个块上重新创建一个新的 UInt8Array,这确实很慢且效率低下。我已经尝试将所有这些块推入一个数组并随后将其组合,但我无法弄清楚如何获取一个约 2600 个 UInt8Array 的数组并将它们展平为一个 UInt8Array。有人对我有什么建议吗?
查看完整描述

1 回答

?
四季花海

TA贡献1811条经验 获得超5个赞

是想多了。刚刚结束直接从UInt8Arrays 的数组创建一个 blob。


async function start(event) {


  console.log("Starting IPFS...");

  node = await Ipfs.create();


  for await (const file of node.get('QmQxBX5ZKRY8k6W2UqYTMxhdFTvkmNw8X7GJN3t5UiyBpe')) {

    console.log("Starting");

    var content = [];

    for await (const chunk of file.content) {

      console.log("Gathering");

      content.push(chunk);

    }

    console.log("Assembling");

    saveFile(content, "archlinux-2020.04.01-x86_64.iso");

    console.log("Done");

  };


}


// https://stackoverflow.com/a/36899900/2700296

function saveFile(data, fileName) {

  if (data !== null && navigator.msSaveBlob) {

    return navigator.msSaveBlob(new Blob(data, { "type": "application/octet-stream" }), fileName);

  }

  var a = document.createElement('a');

  a.style.display = "none";

  var url = window.URL.createObjectURL(new Blob(data, {type: "application/octet-stream"}));

  a.setAttribute("href", url);

  a.setAttribute("download", fileName);

  document.body.appendChild(a);

  a.click();

  window.URL.revokeObjectURL(url);

  a.remove();

}


查看完整回答
反对 回复 2022-07-08
  • 1 回答
  • 0 关注
  • 468 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号