[英]How to create AWS CloudFront signed url for s3 video using javascript sdk without NodeJs
[英]Uploading to S3 a video captured using Cordova Media Capture plugin using Javascript AWS SDK
嘗試將視頻文件(.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存儲桶。 但是,然后我需要剝離前綴的文件類型和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
}
AWS S3 JavaScript SDK允許采用兩種不同的方式將文件數據提供給upload
功能。 根據文檔,文件數據可以是以下任意一種:
Body — (Buffer, Typed Array, Blob, String, ReadableStream) Object data.
您需要先將捕獲的視頻中的數據提取為任何一種格式,然后再嘗試上傳。
使用mediaFile.fullPath
,您可以將文件中的數據讀入Buffer或創建ReadableStream,然后使用該文件上載文件。 要從文件中提取數據,可以使用cordova-plugin-file 。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.