使用Javascript AWS SDK

时间:2018-01-02 07:59:12

标签: javascript amazon-web-services amazon-s3 cordova-plugins

我在尝试将视频文件(.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
}

1 个答案:

答案 0 :(得分:0)

AWS S3 JavaScript SDK允许采用几种不同的方式将文件数据提供给upload函数。根据文档,文件数据可以是以下任意一种:

Body — (Buffer, Typed Array, Blob, String, ReadableStream) Object data.

在尝试上载之前,您需要将捕获的视频中的数据提取为任何一种格式。

使用mediaFile.fullPath,可以将文件中的数据读取到Buffer中或创建ReadableStream,然后使用该文件上载文件。要从文件中提取数据,可以使用cordova-plugin-file