Javascript 如何强制从AmazonS3下载AngularJs格式的视频?

Javascript 如何强制从AmazonS3下载AngularJs格式的视频?,javascript,angularjs,video,amazon-web-services,amazon-s3,Javascript,Angularjs,Video,Amazon Web Services,Amazon S3,我已经编写了使用aws javascript sdk下载上传到AmazonS3的视频的代码。一切正常,但有些视频在浏览器中打开并开始播放。代码如下: 视图: 视频工厂: downloadVideo: function (bucketPath,fileName) { bucketName = aws.bucket_name; options = { accessKeyId : 'XXXXXXXXXXXXXXXXXXXXX', secretAcces

我已经编写了使用aws javascript sdk下载上传到AmazonS3的视频的代码。一切正常,但有些视频在浏览器中打开并开始播放。代码如下:

视图:

视频工厂:

downloadVideo: function (bucketPath,fileName) {
    bucketName = aws.bucket_name;

    options = {
        accessKeyId : 'XXXXXXXXXXXXXXXXXXXXX',
        secretAccessKey : 'XXXXXXXXXXXXXXXXXXXXXXXXXXX',
        region : 'XXXXXX'
    }

    var params = {
        Bucket: bucketName + '/'+ bucketPath, Key: fileName, Expires: 60
    };

    var s3 = new AWS.S3(options);
    var url = s3.getSignedUrl('getObject', params);
    return url;
}
因此,当视频在新窗口中打开时,它们开始从浏览器底部下载。但对于一些未知的视频,他们打开窗口开始播放。我怎样才能在angularjs阻止这一切。建议的解决方法是什么?其他人如何处理此类问题


我用谷歌搜索过,但这里的大多数答案都是在窗口中打开文件,浏览器会自动下载

试试这个解决方案,它可能会对你有所帮助

视图:


成功的诀窍是将视频作为附件上传到S3:

options = {
    accessKeyId : 'xxxxxxxxxxxxxxxxxxxxxxx',
    secretAccessKey : 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxx',
    region : 'xxxxxx'
}

var s3 = new AWS.S3(options);               

var params = {
    Bucket : bucketName + '/' + bucketStructure,
    Key: fileName,
    ContentType: file.type,
    Body: file,
    ServerSideEncryption: 'AES256',
    ACL : 'private',
    ContentDisposition: 'attachment; filename=' + fileName,
    ContentType: 'application/octet-stream'
};

s3.putObject(params, function(err, data) {
  if(err) {
    // There Was An Error With Your S3 Config
    console.log('AWS Error : '+err.message);
    return false;
  }
  else {

    console.log('AWS Video upload done!');            

  }
})

这将使视频在使用签名url时自动强制下载。已经为我的大多数视频mime类型工作。

我已经发布了适合我的。请看我的答案
downloadVideo: function (bucketPath,fileName) {
    bucketName = aws.bucket_name;

    options = {
        accessKeyId : 'XXXXXXXXXXXXXXXXXXXXX',
        secretAccessKey : 'XXXXXXXXXXXXXXXXXXXXXXXXXXX',
        region : 'XXXXXX'
    }

    var params = {
        Bucket: bucketName + '/'+ bucketPath, Key: fileName, Expires: 60
    };

    var s3 = new AWS.S3(options);
    var url = s3.getSignedUrl('getObject', params);
    return url;
}
<a href="#" ng-click="downloadVideo(video)">Download Video</a>
<a id="ExportToExcel" style="display: none;"></a>
$scope.downloadVideo = function (video) {
   videoLocation = video.video_location;
   var bucketPath = videoLocation.substring(0, videoLocation.lastIndexOf("/") + 1);
   bucketPath = bucketPath.substring(0, bucketPath.length - 1);
   var fileName = videoLocation.substring(videoLocation.lastIndexOf("/") + 1, videoLocation.length);
   var videoSignedUrl = VideoFactory.downloadVideo(bucketPath,fileName);            
   document.getElementById("ExportToExcel").href = videoSignedUrl;       
   document.getElementById("ExportToExcel").click();
}
options = {
    accessKeyId : 'xxxxxxxxxxxxxxxxxxxxxxx',
    secretAccessKey : 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxx',
    region : 'xxxxxx'
}

var s3 = new AWS.S3(options);               

var params = {
    Bucket : bucketName + '/' + bucketStructure,
    Key: fileName,
    ContentType: file.type,
    Body: file,
    ServerSideEncryption: 'AES256',
    ACL : 'private',
    ContentDisposition: 'attachment; filename=' + fileName,
    ContentType: 'application/octet-stream'
};

s3.putObject(params, function(err, data) {
  if(err) {
    // There Was An Error With Your S3 Config
    console.log('AWS Error : '+err.message);
    return false;
  }
  else {

    console.log('AWS Video upload done!');            

  }
})