Подтвердить что ты не робот

Отображать изображения, полученные из s3

Я хочу получить изображения из s3 и отобразить их на моей HTML-странице.

Angular HTML файл:

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

Angular Файл контроллера:

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);

Но это показывает ошибку:
Uncaught TypeError: не удалось выполнить 'readAsDataURL' в 'FileReader': параметр 1 не относится к типу 'Blob'.

Пожалуйста, помогите мне с кодом для отображения файла изображения в теге img
Моя корзина S3 не является общедоступной

EDIT:
Меня не интересует s3. я хочу знать, что как отобразить изображение, которое у вас есть в вашем javascript-коде, в виде файлового объекта (s3 obj), используя тег HTML-изображения

4b9b3361

Ответ 1

Вы не загружаете отображаемые изображения. Вы просто указываете 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, представляют собой массив байтов. Вам необходимо преобразовать его в URI базы64encoded данных. Функция encode заимствована из здесь. Здесь один рабочий jsFiddle с удаленными учетными данными.

Ответ 2

Вам нужно только указать URL-адрес изображения, хранящегося в s3.

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

Это должно работать.

Ответ 3

Если ваш S3 файл является общедоступным (вы должны его изменить, по умолчанию он не является общедоступным), вы можете получить URL-адрес из этой схемы:

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

Итак, если область eu-west-1 с чем-то вроде этого:

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

Ответ 4

Полная реализация получения изображения с 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>