我将一个 1.7GB 的文件从 HTTP 请求传送到 s3 上传功能,该功能执行分段上传。调用结束函数 - 当我查看 s3 时 - 文件只有 1 GB。似乎并非所有的块都通过管道。
这种字节丢失与文件有关。较小的文件将丢失相对数量的字节。
我尝试过关闭http请求。
我尝试通过 on('data') 上传到 s3 部分上传每 5MB 块来管理块上传
以上两个给出相同的结果。
我不知所措。
第一次尝试
这是使用 http 流管道进入 s3 上传的方法。
uploadFromStream(bucket, key) {
const pass = new Stream.PassThrough();
const params = {Bucket: bucket, Key: key, Body: pass}
const streamOptions = {
partSize: 5 * 1024 * 1024,
queueSize: 1
}
this.s3Client.upload(params, streamOptions, (err, data) => {
if(err) console.log('Stream upload Error', err)
console.log(data)
})
return pass;
}
const getContents = await this.getFileById(queryResult.fileId)
getContents.pipe(this.uploadFromStream(s3bucket, s3key))
getContents.on('end', async () => {
return resolve(true)
})
第二次尝试
以下是将块管理为 5MB 数据包以在 s3 部分上传中使用的方法。在此功能下方被击中 - 我已经启动了分段上传并获得了 id。
const maxChunkLimit = 1024 * 1024 * 5;
let chunkLimit = ''
let i = 0
getContents.on('data', async (chunk) => {
chunkLimit += chunk
if(chunkLimit.length > maxChunkLimit) {
i = i + 1
this.s3Client.uploadPart({
Body: chunkLimit,
Bucket: s3bucket,
Key: s3key,
PartNumber: i,
UploadId: multiPartUpload.UploadId
})
chunkLimit = ''
}
})
最后 - 我上传了最后的块剩余部分(小于 5mb)
当我总结所有块长度时,它不等于它正在读取的文件的内容长度。这个总和确实等于上传版本的文件大小 (1.08gb)。这证明上传已完成,并且在完成分段上传之前所有部分上传成功。
两种方法都给了我相同的结果-上传的文件与原始读取文件的文件大小不同。
字节丢失与原始文件的大小有关
奇怪的是我可以上传的最大字节数刚刚超过 1gb……我试过 1.7gb、3gb、6gb。全部完成一个 1gb 的文件。
我使用 Node 8.10 和 AWS Node SDK 2.360.0