AWS。存储和显示用户的个人资料图片

时间:2016-07-20 06:10:56

标签: angularjs node.js amazon-web-services amazon-s3

我要求存储和显示我的用户的个人资料图片。所以我在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});
                    });

1 个答案:

答案 0 :(得分:1)

这是因为您从签名网址获取了网址,并且签名网址已按设计过期。

来自AWS文档上的Share an Object with Others

  

默认情况下,所有对象都是私有的。只有对象所有者才有权访问这些对象。但是,对象所有者可以选择通过使用自己的安全凭证创建预签名URL来与其他人共享对象,以授予下载对象的时间限制权限。

似乎你并没有完全存储必须授予访问权限的“秘密”资源,那么这里最好的方法是公开存储图像。这是微不足道的,您只需在致电ACLpublic-read时将PutObject设置为upload即可。这样你就可以知道对象的URL,而不必实际检索它:

https://s3-[region].amazonaws.com/[bucket]/[file]

这就是你的上传声明:

s3.upload({ Body: body, ACL: 'public-read' }, function (err, data) {
相关问题