0

我将一个 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

4

0 回答 0