我要求存储和显示我的用户的个人资料图片。所以我在nodeJs后端使用了S3.upload函数来存储图像。 存储图像后,我将链接存储在数据库中,以便在我的视图中使用 ng-source 来获取它。它工作但链接在几小时后已过期并且无法正常工作。以下是我上传的代码。 是否有任何解决方案或以其他更好的方式执行此操作。
var body = fs.createReadStream(file.file.path);
//Upload the photo to AWS
s3.upload({Body: body}, function (err, data) {
if (err) {
res.sendStatus(500);
}
if (data) {
//getSignedUrl and Store it in Database
var AWS = require('aws-sdk');
var url = req.params.doctorId + "/Images/" + fileName;
var s3 = new AWS.S3()
,params = {Bucket: S3Bucket, Key:url };
s3.getSignedUrl('getObject', params, function (err, url) {
if (err || url == null) res.status(500).send({msg: "amazon s3 error"});
else if (url) {
if(req.body.picture == 1) {
User.findByIdAndUpdate(req.params.doctorId, {$set: {'FileName.profilePicture': url}},
function (err, doc) {
if (err)
res.sendStatus(500);
else
res.send({url: url});
});
答案 0 :(得分:1)
这是因为您从签名网址获取了网址,并且签名网址已按设计过期。
来自AWS文档上的Share an Object with Others:
默认情况下,所有对象都是私有的。只有对象所有者才有权访问这些对象。但是,对象所有者可以选择通过使用自己的安全凭证创建预签名URL来与其他人共享对象,以授予下载对象的时间限制权限。
似乎你并没有完全存储必须授予访问权限的“秘密”资源,那么这里最好的方法是公开存储图像。这是微不足道的,您只需在致电ACL
或public-read
时将PutObject
设置为upload
即可。这样你就可以知道对象的URL,而不必实际检索它:
https://s3-[region].amazonaws.com/[bucket]/[file]
这就是你的上传声明:
s3.upload({ Body: body, ACL: 'public-read' }, function (err, data) {