显示从s3获取的图像

时间:2015-09-21 18:43:17

标签: javascript angularjs amazon-s3 filereader aws-sdk

我想从s3获取图片并将其显示在我的HTML页面上。

Angular HTML文件:

<section data-ng-controller="myCtrl">
    <img ng-src="{{src}}" width="200px" height="200px">
</section>

Angular Controller文件:

angular.module('users').controller('myCtrl', ['$scope',function($scope) {
    var s3 = new AWS.S3(); 
    s3.getObject({Bucket: 'mybucket', Key: 'myimage.jpg'},function(err,file){

    //code?? to display this image file in the img tag
    //$scope.src=file????....obviously it wont work

    });
}]);

我发现了一些名为 FileReader 的内容,并尝试了这个:

var reader = new FileReader();
reader.onload = function(event) {
    $scope.src = event.target.result;
}
reader.readAsDataURL(file);

但它显示错误:
未捕获TypeError:无法在'FileReader'上执行'readAsDataURL':参数1不是'Blob'类型。

请帮我用代码在img标签中显示图像文件 我的S3存储桶不公开

修改
我对s3不感兴趣。我想知道的是 如何使用HTML图片标记以文件对象(s3 obj)的形式在javascript代码中显示您的图像

4 个答案:

答案 0 :(得分:40)

你没有&#34;取得&#34;要显示的图像。您只需将图像URL指向它们存储的位置(在您的情况下为S3)。因此,不要拉动单个对象,而是拉出该存储桶中的文件列表(bucket.listObjects),然后将它们添加到缩略图/图像的源中。

<section data-ng-controller="myCtrl">
    <img ng-src="{{s3Url}}{{image.Key}}" width="200px" height="200px" ng-repeat="image in allImageData">
</section>
$scope.s3Url = 'https://s3-<region>.amazonaws.com/myBucket/';
var bucket = new AWS.S3({params: {Bucket: 'myBucket'}});
  bucket.listObjects(function (err, data) {
    if (err) {
      console.log(err);
    } else {
      console.log(data);
      $scope.allImageData = data.Contents;
    }
  });

此处假设文件具有读取权限。由于显而易见的原因,他们无法在没有公开阅读权限的情况下访问。

编辑:根据评论,问题是寻求在页面上加载实际图像。这是怎么做的:

function myCtrl($scope, $timeout) {    
    AWS.config.update({
  accessKeyId: 'YOUR_ACCESS_TOKEN', secretAccessKey: 'YOUR_SECRET'});
    AWS.config.region = "YOUR_REGION";

var bucket = new AWS.S3({params: {Bucket: 'YOUR_BUCKET'}});

    bucket.getObject({Key: 'happy-face.jpg'},function(err,file){

    $timeout(function(){
        $scope.s3url = "data:image/jpeg;base64," + encode(file.Body);
    },1);
});
}

function encode(data)
{
    var str = data.reduce(function(a,b){ return a+String.fromCharCode(b) },'');
    return btoa(str).replace(/.{76}(?=.)/g,'$&\n');
}

从S3获得的数据是字节数组。您需要将其转换为base64encoded数据URI。编码函数来自here。这是一个工作jsFiddle并删除了凭据。

答案 1 :(得分:3)

完全实现从承诺的s3获取图像 - 享受!

<!DOCTYPE html>
<html lang="en">
<head>
  <script src="https://sdk.amazonaws.com/js/aws-sdk-2.179.0.min.js"></script>
</head>
<body>
  <img height="200" width="200">
  <script>

    var mimes = {
        'jpeg': 'data:image/jpeg;base64,'
    };

      AWS.config.update({
          signatureVersion: 'v4',
          region: 'us-east-1',
          accessKeyId: '',
          secretAccessKey: ''
      });

      var bucket = new AWS.S3({params: {Bucket: 'xxx'}});

      function encode(data)
      {
          var str = data.reduce(function(a,b){ return a+String.fromCharCode(b) },'');
          return btoa(str).replace(/.{76}(?=.)/g,'$&\n');
      }

      function getUrlByFileName(fileName,mimeType) {
          return new Promise(
              function (resolve, reject) {
                  bucket.getObject({Key: fileName}, function (err, file) {
                      var result =  mimeType + encode(file.Body);
                      resolve(result)
                  });
              }
          );
      }

      function openInNewTab(url) {
          var redirectWindow = window.open(url, '_blank');
          redirectWindow.location;
      }

      getUrlByFileName('sprites.png', mimes.jpeg).then(function(data) {
          //openInNewTab(data);
          document.querySelector('img').src = data;
      });

  </script>
</body>
</html>

答案 2 :(得分:1)

您只需提及存储在s3中的图像的网址。

https://mybucket.s3.amazonaws.com/myimage.jpg

这应该有用。

答案 3 :(得分:0)

如果您的S3文件是公共的(您必须更改它,默认情况下它不公开),您可以从此模式中获取网址:

https://s3-<region>.amazonaws.com/<bucket-name>/<key>

所以,如果该地区 eu-west-1 ,请使用以下内容:

$scope.src = 'https://s3-eu-west-1.amazonaws.com/mybucket/myimage.jpg';