我想从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代码中显示您的图像
答案 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';