Javascript 如何在JS中从ArrayBuffer写入文件

Javascript 如何在JS中从ArrayBuffer写入文件,javascript,node.js,file-upload,meteor,arraybuffer,Javascript,Node.js,File Upload,Meteor,Arraybuffer,我正在尝试为Meteor框架编写一个文件上传程序。 其原理是将客户机上的文件从ArrayBuffer拆分为4096位的小数据包,通过Meteor.method发送到服务器 下面的简化代码是客户端向服务器发送数据块的部分,重复该代码直到偏移量到达数据。ByTeleLength: // data is an ArrayBuffer var total = data.byteLength; var offset = 0; var upload = function() { var length

我正在尝试为Meteor框架编写一个文件上传程序。 其原理是将客户机上的文件从ArrayBuffer拆分为4096位的小数据包,通过Meteor.method发送到服务器

下面的简化代码是客户端向服务器发送数据块的部分,重复该代码直到偏移量到达数据。ByTeleLength

// data is an ArrayBuffer
var total = data.byteLength;
var offset = 0;

var upload = function() {
  var length = 4096; // chunk size

  // adjust the last chunk size
  if (offset + length > total) {
     length = total - offset;
  }

  // I am using Uint8Array to create the chunk
  // because it can be passed to the Meteor.method natively
  var chunk = new Uint8Array(data, offset, length);

  if (offset < total) {
     // Send the chunk to the server and tell it what file to append to
     Meteor.call('uploadFileData', fileId, chunk, function (err, length) {
        if (!err) {
          offset += length;
          upload();
        }
     }
  }
};
upload(); // start uploading

我未能将有效文件写入磁盘,实际上该文件已保存但无法打开,当我在文本编辑器中看到内容时,它与原始文件(例如jpg)相似,但某些字符不同,我认为可能是编码问题,因为文件大小不同,但是我不知道如何解决这个问题…

保存文件就像用Uint8Array对象创建一个新的缓冲区一样简单:

// chunk is the Uint8Array object
fs.appendFile(path, Buffer.from(chunk), function (err) {
    if (err) {
      fut.throw(err);
    } else {
      fut.return(chunk.length);
    }
});

只是想在较新的Meteor中添加这一点,您可以使用
async/await
避免一些回调地狱。wait还将抛出错误并将其推送到客户端

Meteor.methods({
  uploadFileData: async function(file_id, chunk) {
    var path = 'somepath/' + file_id; // be careful with this, make sure to sanitize file_id
    await fs.appendFile(path, new Buffer(chunk));
    return chunk.length;
  }
});
在此基础上,这在任何框架之外对我都有效:

fs.appendFileSync(outfile, new Buffer(arrayBuffer));

你能递一个小滴吗?它们通常以缓冲区的形式出现在节点中,由fs.AppendFile()处理。@dandavis实际上你给了我一半的答案,看,解决方案毕竟很简单,谢谢!新缓冲区已弃用。改为使用Buffer.from(arrayBuffer)。不推荐使用新缓冲区(区块)使用Buffer.from(区块)
fs.appendFileSync(outfile, new Buffer(arrayBuffer));