Javascript AWS SDK JS:多部分上载到S3导致数据损坏
尝试使用AWS JS SDK上载mp4文件启动多部分上载时,当我尝试在本地下载和播放mp4文件时,不断出现文件损坏错误 我的代码的GIST: 使用参数启动多部分上载: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
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