通过 node 上传大文件
通过 node 上传大文件 背景 因为工作上的原因,开发了一个客户端文件,用来做数据迁移 实际上的流程很简单,下载,清洗,再调用接口导入到另一个网站上 出现问题 本地的上传其实是通过 const formData = new FormData(); formData.append('file', blob); axios.post(xxx, formdata) 通过在 nodejs 里边写 formdata 并且通过 axios 进行上传的 遇到的第一个问题是 Buffer问题,因为 formdata 需要使用 blob 作为 file 字段进行上传的 最开始的时候我们的 blob 是通过 fs.readFileSync()生成的 但是在 node 环境下,我们的 node 实际上对 buffer 是有大小限制的 所以我一开始采用的方案是通过流式获取所有的 buffer 之后一起生成一个 blob const blob = await new Promise((resolve, reject) => { const stream = fs.createReadStream(); const blobData = []; stream.on('data', chunk => blobData.push(chunk)) stream.on('end', () => resolve(new Blob(blobData))) }) 这样一开始解决了读取 buffer 过大的问题 实际问题解决 实际问题还是上传下载的时候,如果读取为 blob的话,也是需要占用一段内存的 这也就造成了在传输 2g 以上大文件的时候出现了闪退 这个时候其实应该会有好几种解决方案 通过分片进行上传,实际上因为后端采用 minio 这个也是天然支持的,但是经过询问之后,发现上传 minio 其实也是后端额外封装了一层接口实现的,但是后端没有实现分片合并的逻辑,所以通过分片的方案就不行了 流式上传,这样可以减少内存的占用 所以上传的时候其实是需要将整个上传流程的 form 也转换成一个 stream ...