当前位置: 首页 > 知识库问答 >
问题:

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

艾才良
2023-03-14

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

我的代码要点:

>

  • 使用以下参数启动多部分上载:

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

    打电话:

    s3Instance.createMultipartUpload(createMultipartUploadParams, function(err, data) {
    }
    

    执行分块:参数:

     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) {
          }
    

    最后完成multipartUpload:

    s3实例。completeMultipartUpload(完成MultipartParams,函数(错误,数据)

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

    这个也试过了

  • 共有1个答案

    阳德润
    2023-03-14

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

    因此,您不必经历编写低级别多部分调用的麻烦。

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

     类似资料:
    • 使用AWS SDK PHP v2将文件上载到Amazon S3时,我在设置“Metadata”选项时遇到问题。我正在阅读的upload()方法的文档说明,第5个参数是一组选项。。。 *$options 执行命令时使用的自定义选项: - 参数:用于上传的自定义参数。这些参数必须映射到“启动多个部分上传”操作参数。- min_part_size:执行分段上传时允许每个上传的分段的最小大小。- 并发:最

    • 问题内容: 我正在使用NodeJS AWS开发工具包生成预签名的S3 URL。该文档提供了一个生成预签名URL的示例。 这是我的确切代码(省略了敏感信息): 生成的URL如下所示: 我正在将该URL复制到浏览器中,并得到以下响应: 我知道水桶存在。当我通过AWS Web GUI导航至该项目并双击时,它会打开带有URL的对象,并且工作正常: 因此,我被认为是我使用SDK的方式一定做错了。 问题答案:

    • 我正在尝试使用 AWS PHP 开发工具包将一个 30 GB 的文件上传到亚马逊 S3。 它适用于最大7GB的文件。上传30 GB文件时,脚本运行约2小时后,我收到以下错误: 将部件上载到多部件上载时发生异常。以下部分出错:-第5部分:在上执行“UploadPart”时出错https://s3.amazonaws.com/Server3-27-SEP-2015/S3_www_1443369605.

    • 我用的是fs。readFile读取大约700KB的本地mp4文件,AWS SDK将文件加载到我的S3存储桶中。这个过程是可行的,但文件已损坏,可能是因为S3上生成的文件大小仅为500KB左右而被截断。 我使用的代码可以很好地处理图像。只是不适用于mp4文件。这是我的代码: 我已尝试从params对象中省略ContentEncoding和/或ContentType属性。 编辑: 因此,当我conso

    • 问题内容: 是否有人成功使用AWS开发工具包为S3存储桶中的对象生成签名URL,该URL也可以在CloudFront上运行?我使用的是JavaScriptAWS开发工具包,通过S3链接生成签名的URL非常简单。我刚刚创建了一个私有存储桶,并使用以下代码生成URL: 这很好用,但我也想向用户公开一个CloudFront URL,以便他们可以提高使用CDN的下载速度。我设置了一个CloudFront发

    • 我试图使用API接口将视频上传到S3存储桶,我遵循了预签名的URL过程,下面是我的lambda函数,它返回预签名的URL(它正确地返回了预签名的URL,看起来): 当我尝试上传一个像这样卷曲的mp4视频时,例如: curl-X PUT-F'data=@ch01_00000100055009702.mp4'https://redacted-bucket-instance.s3.amazonaws.c