[英]S3 Multipart upload via cloudfront distribution with aws-sdk-js
[英]AWS SDK JS: Multipart upload to S3 resulting in Corrupt data
尝试使用启动分段上传的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:
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.