I want to fetch images from s3 and display them on my HTML page.
Angular HTML file:
<section data-ng-controller="myCtrl"> <img ng-src="{{src}}" width="200px" height="200px"> </section>
Angular Controller file:
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 }); }]);
I found something call FileReader and tried this one:
var reader = new FileReader(); reader.onload = function(event) { $scope.src = event.target.result; } reader.readAsDataURL(file);
But it shows error:
Uncaught TypeError: Failed to execute 'readAsDataURL' on 'FileReader': parameter 1 is not of type 'Blob'.
Please help me with the code to display image file in the img tag
My S3 bucket is not public
EDIT:
I am not interested in s3. what i want to know is that
how to display an image which you have in your javascript code in the form of a file object(s3 obj) using the HTML image tag
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.
In AWS Explorer, expand the Amazon S3 node, and double-click a bucket or open the context (right-click) menu for the bucket and choose Browse. In the Browse view of your bucket, choose Upload File or Upload Folder. In the File-Open dialog box, navigate to the files to upload, choose them, and then choose Open.
To open the overview pane for an objectSign in to the AWS Management Console and open the Amazon S3 console at https://console.aws.amazon.com/s3/ . In the Buckets list, choose the name of the bucket that contains the object. In the Objects list, choose the name of the object for which you want an overview.
You don't "fetch" the images to display. You just point the image URL to the location where they are stored (S3 in your case). So instead of pulling individual object, pull the list of files in that bucket (bucket.listObjects
) and then add them to the source of the thumbnails/images.
<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; } });
Assuming here that the files have read permission. They won't be accessible without public read permission for obvious reasons.
EDIT: Based on the comment, the question is seeking to load the actual image on the page. Here's how to do it:
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'); }
The data you get from the S3 is a byte array. You need to convert it into the base64encoded data URI. The encode function is borrowed from here. Here's one working jsFiddle with credentials removed.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With