繁体   English   中英

AWS开发工具包JS:分段上传到S3导致数据损坏

[英]AWS SDK JS: Multipart upload to S3 resulting in Corrupt data

尝试使用启动分段上传的AWS JS SDK上载mp4文件时,尝试在本地下载并播放该文件时,我不断收到文件损坏错误。

我的代码要点:

  1. 使用参数启动分段上传:

     const createMultipartUploadParams = { Bucket: bucketname, Key: fileHash.file_name, ContentType: 'video/mp4' // TODO: Change hardcode }; 

呼叫:

s3Instance.createMultipartUpload(createMultipartUploadParams, function(err, data) {
}
  1. 执行分块:参数:

      const s3ChunkingParams = { chunkSize, noOfIterations, lastChunk , UploadId: data.UploadId } 

读取文件:

     const reader = new FileReader();
     reader.readAsArrayBuffer(file)

上载每个块:

        reader.onloadend = function onloadend(){
      console.log('onloadend');
      const partUploadParams = {
        Bucket: bucketname,
        Key: file_name,
        PartNumber: i, // Iterating over all parts
        UploadId: s3ChunkingParams.UploadId,
        Body: reader.result.slice(start, stop) // Chunking up the file
      };

      s3Instance.uploadPart(partUploadParams, function(err, data1) {
      }
  1. 最后完成multipartUpload:

    s3Instance.completeMultipartUpload(completeMultipartParams,函数(错误,数据)

我猜问题是我如何读取文件,因此我尝试了将Content Encoding到base64的方法,但这使大小异常大。 任何帮助是极大的赞赏!

也尝试

唯一可能损坏的是,也许您正在为各个部分上传附加的填充内容,这基本上导致最终对象出错。 我不相信S3在这里做得很烂。

上传文件后,您可以验证对象的最终大小是多少,如果它与本地副本不匹配,那么您知道某个地方有问题。

您是否要从浏览器上传?

或者,您可以查看-https: //github.com/minio/minio-js 它具有最少的抽象API集,可实现最常用的S3调用。

这是流式上传的一个nodejs示例。

$ npm install minio
$ cat >> put-object.js << EOF

var Minio = require('minio')
var fs = require('fs')

// find out your s3 end point here:
// http://docs.aws.amazon.com/general/latest/gr/rande.html#s3_region

var s3Client = new Minio({
  url: 'https://<your-s3-endpoint>',
  accessKey: 'YOUR-ACCESSKEYID',
  secretKey: 'YOUR-SECRETACCESSKEY'
})

var outFile = fs.createWriteStream('your_localfile.zip');
var fileStat = Fs.stat(file, function(e, stat) {
  if (e) {
    return console.log(e)
  }
  s3Client.putObject('mybucket', 'hello/remote_file.zip', 'application/octet-stream', stat.size, fileStream, function(e) {
    return console.log(e) // should be null
  })
})
EOF

这里的putObject()是一个完全托管的单函数调用,用于5MB以上的文件大小,它会自动在内部进行多部分处理。 您也可以恢复失败的上传,并且可以通过验证以前上传的部分从中断处开始。

因此,您不必一定要编写较低级别的多部分调用。

此外,该库也是同构的,也可以在浏览器中使用。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM