我在尝试将视频文件(.mp4和.mov)上传到S3时面临一个特殊问题,使用cordova-plugin-media-capture@1.4.3捕获或使用cordova-plugin-camera @从图库中选取2.4.1。 我正在使用javascript AWS SDK v2.3.11并调用SDK的.upload函数。
它只会将15字节的数据复制到S3上,无论视频文件的实际大小如何,都是不可播放的。
实施 -
捕获视频:
navigator.device.capture.captureVideo(
captureSuccess,
captureError,
{
limit: 1,
duration: 30,
destinationType: 2,
sourceType: 1,
mediaType: 1
}
);
var captureSuccess = function (mediaFiles) {
var mediaFile = mediaFiles[0];
var filedata = {
Key: "videos/" + fileName,
ContentType: mediaFile.type,
Body: mediaFile
};
var aws = AWS;
var creds = new aws.Credentials(
AccessKeyId,
SecretAccessKey,
SessionToken
);
aws.config.credentials = creds;
s3 = new aws.S3();
s3.upload(
filedata,
{
Bucket: bucketName
},
function(err, location){
if(!err){
//uploaded successfully
} else {
//upload failed
}
}
);
}
当我尝试将媒体文件转换为Base64数据并上传时,它会将完整的base64文件写入S3存储桶。但是,我需要删除带前缀的filetype和base64标识符文本,然后将数据反编译为二进制格式,再次保存到S3(来自EB nodeJS服务)。 这种方法的另一个问题是,由于IOS和Android上的内存管理,将视频文件转换为base64数据并保存在手机的RAM内存中很容易导致应用程序崩溃。我无法使用此机制在Android中转换超过5秒的视频文件,在16GB iPhone6中转换超过10秒。应用程序崩溃超出了这两种情况。
使用Base64更改了实施:
var captureSuccess = function (mediaFiles) {
var mediaFile = mediaFiles[0];
var filedata = {
Key: "videos/" + fileName,
ContentType: mediaFile.type
};
var aws = AWS;
var creds = new aws.Credentials(
AccessKeyId,
SecretAccessKey,
SessionToken
);
aws.config.credentials = creds;
s3 = new aws.S3();
getBase64data(
mediaFile.fullPath, //tried with mediaFile.localURL as well
function(data){
filedata.Body = data;
s3.upload(
filedata,
{
Bucket: bucketName
},
function(err, location){
if(!err){
//uploaded successfully
} else {
//upload failed
}
}
); //ending s3.upload
); //ending getBase64data
}
function getBase64Data(filePath, cb){
window.resolveLocalFileSystemURL(
filePath,
function(entry){
entry.file(
function(file) {
var reader = new FileReader();
reader.onloadend = function(event) {
cb(event.target.result);
};
reader.readAsDataURL(file);
},
function(e){
//error retrieving file object
}
); //ending entry.file
},
function(e){
//error getting entry object
}
); //ending resolveLocalFileSystemURL
}
答案 0 :(得分:0)
AWS S3 JavaScript SDK允许采用几种不同的方式将文件数据提供给upload
函数。根据文档,文件数据可以是以下任意一种:
Body — (Buffer, Typed Array, Blob, String, ReadableStream) Object data.
在尝试上载之前,您需要将捕获的视频中的数据提取为任何一种格式。
使用mediaFile.fullPath
,可以将文件中的数据读取到Buffer中或创建ReadableStream,然后使用该文件上载文件。要从文件中提取数据,可以使用cordova-plugin-file。