显示从 s3 获取的图像
display images fetched from 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);
但是显示错误:
未捕获类型错误:无法在 'FileReader' 上执行 'readAsDataURL':参数 1 不是 'Blob'.
类型
请帮助我在 img 标签中显示图像文件的代码
我的 S3 存储桶不是 public
编辑:
我对 s3 不感兴趣。我想知道的是
如何使用 HTML 图像标签 [=13= 以文件对象 (s3 obj) 的形式显示您在 javascript 代码中的图像]
如果您的 S3 文件是 public(您必须更改它,默认情况下它不是 public),您可以从此架构中获取 url:
https://s3-<region>.amazonaws.com/<bucket-name>/<key>
因此,如果该区域是 eu-west-1,并且是这样的:
$scope.src = 'https://s3-eu-west-1.amazonaws.com/mybucket/myimage.jpg';
您不会“获取”要显示的图像。您只需将图像 URL 指向它们的存储位置(在您的情况下为 S3)。因此,与其拉取单个对象,不如拉取该存储桶 (bucket.listObjects
) 中的文件列表,然后将它们添加到 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;
}
});
这里假设文件有读权限。由于显而易见的原因,如果没有 public 读取权限,将无法访问它们。
编辑: 根据评论,问题是寻求在页面上加载实际图像。方法如下:
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 获取的数据是一个字节数组。您需要将其转换为 base64 编码的数据 URI。编码功能是从 here. Here's one working jsFiddle 借用的,删除了凭据。
你只需要提到存储在 s3 中的图像 url。
https://mybucket.s3.amazonaws.com/myimage.jpg
这应该有效。
使用 promise 从 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>
我想从 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);
但是显示错误:
未捕获类型错误:无法在 'FileReader' 上执行 'readAsDataURL':参数 1 不是 'Blob'.
类型
请帮助我在 img 标签中显示图像文件的代码
我的 S3 存储桶不是 public
编辑:
我对 s3 不感兴趣。我想知道的是
如何使用 HTML 图像标签 [=13= 以文件对象 (s3 obj) 的形式显示您在 javascript 代码中的图像]
如果您的 S3 文件是 public(您必须更改它,默认情况下它不是 public),您可以从此架构中获取 url:
https://s3-<region>.amazonaws.com/<bucket-name>/<key>
因此,如果该区域是 eu-west-1,并且是这样的:
$scope.src = 'https://s3-eu-west-1.amazonaws.com/mybucket/myimage.jpg';
您不会“获取”要显示的图像。您只需将图像 URL 指向它们的存储位置(在您的情况下为 S3)。因此,与其拉取单个对象,不如拉取该存储桶 (bucket.listObjects
) 中的文件列表,然后将它们添加到 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;
}
});
这里假设文件有读权限。由于显而易见的原因,如果没有 public 读取权限,将无法访问它们。
编辑: 根据评论,问题是寻求在页面上加载实际图像。方法如下:
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 获取的数据是一个字节数组。您需要将其转换为 base64 编码的数据 URI。编码功能是从 here. Here's one working jsFiddle 借用的,删除了凭据。
你只需要提到存储在 s3 中的图像 url。
https://mybucket.s3.amazonaws.com/myimage.jpg
这应该有效。
使用 promise 从 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>