【问题标题】:AWS SDK JS: Multipart upload to S3 resulting in Corrupt dataAWS SDK JS:分段上传到 S3 导致数据损坏
【发布时间】:2016-02-07 23:37:08
【问题描述】:

尝试使用启动分段上传的 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, function(err, data)

我猜问题在于我是如何读取文件的,所以我尝试将内容编码为 base64,但这使得文件大小异常巨大。非常感谢任何帮助!

试过this too

【问题讨论】:

    标签: javascript amazon-web-services file-upload reactjs aws-sdk


    【解决方案1】:

    唯一可能损坏的可能是您正在为您的各个部分上传额外的填充内容,这基本上会导致最终对象出错。我不相信 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,它会在内部自动执行多部分。您也可以恢复失败的上传,它将通过验证之前上传的部分从上次中断的地方开始。

    因此,您不必费心编写较低级别的多部分调用。

    另外这个库也是同构的,也可以在浏览器中使用。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-06-13
      • 2021-06-13
      • 1970-01-01
      • 2020-04-15
      • 2020-04-18
      • 2022-08-13
      • 1970-01-01
      • 2015-11-14
      相关资源
      最近更新 更多