Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/perl/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript AWS SDK JS:多部分上载到S3导致数据损坏_Javascript_Amazon Web Services_File Upload_Reactjs_Aws Sdk - Fatal编程技术网

Javascript AWS SDK JS:多部分上载到S3导致数据损坏

Javascript AWS SDK JS:多部分上载到S3导致数据损坏,javascript,amazon-web-services,file-upload,reactjs,aws-sdk,Javascript,Amazon Web Services,File Upload,Reactjs,Aws Sdk,尝试使用AWS JS SDK上载mp4文件启动多部分上载时,当我尝试在本地下载和播放mp4文件时,不断出现文件损坏错误 我的代码的GIST: 使用参数启动多部分上载: const createMultipartUploadParams = { Bucket: bucketname, Key: fileHash.file_name, ContentType: 'video/mp4' // TODO: Change hardcode }; 电话: s3Instance.createMu

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

我的代码的GIST:

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

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

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

正在读取文件:

     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) {
      }
最终完成多端口加载:

s3Instance.completeMultipartUploadcompleteMultipartParams,函数错误,数据

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


尝试过的

唯一可能损坏的事情可能是,您正在为您的各个部分上载额外的填充内容,这基本上会导致最终对象出错。我不相信S3在这里做了什么可疑的事情

上传文件后,您可以验证对象的最终大小,如果它与本地副本不匹配,则您知道您在某处遇到了问题

您正在尝试从浏览器上载吗

或者你可以看看-。它具有实现最常用的S3调用的最小抽象API集

下面是一个用于流式上传的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的文件大小,它在内部自动执行多部分调用。您也可以恢复失败的上载,并通过验证以前上载的部分,从停止的位置开始

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

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

$ 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