环回组件存储aws s3 ACL权限

时间:2016-02-23 17:08:08

标签: amazon-s3 permissions storage acl loopback

我正在研究这个项目,我设法通过我在环回模型上创建的端点上传图像,问题是我需要上传的图像可公开访问,似乎无法找到在哪里这样做。 我已经尝试使用aws sdk用putObjectACL更改对象权限但无法使其工作,它说我已经错误地构建了xml,因为我甚至无法计算如何填充方法所需的属性,所以我找到了改变它的方法,就是复制它并将ACL设置为'public-read'然后删除原始文件,然后再将其复制到原始文件名并再次删除其他副本,看起来像是一个非常顽皮的解决方案,我很确定必须有一个更简洁的方法来做到这一点。 我使用我的远程方法进行上传:

Container.upload(req,res,{container: "my-s3-bucket"},function(err,uploadInfo) { ... }

Container是我的模型连接到aws s3。然后我像这样进行权限更改(复制和删除):

var AWS = require('aws-sdk');
AWS.config.update({accessKeyId:"my-key-id",secretAccessKey:"my-key", region:"us-east-1"});

var s3 = new AWS.S3();
s3.copyObject( {
          Bucket:'my-s3-bucket',
          CopySource: 'my-s3-bucket/'+filename,
          Key: filename+"1",
          ACL: 'public-read'
        }, function(err,info) {
          if (err) return cb(err);

          s3.deleteObject( {
            Bucket:'my-s3-bucket',
            Key:filename
          }, function(err,info) {
            if (err) return cb(err);

            s3.copyObject( {
              Bucket: 'my-s3-bucket',
              CopySource: 'my-s3-bucket/'+filename+"1",
              Key: filename,
              ACL: 'public-read'
            }, function(err,info) {
              if (err) return cb(err);

              s3.deleteObject( {
                Bucket: 'my-s3-bucket',
                Key: my-s3-bucket+"1"
              }, function(err,info) {
                if (err) return cb(err);

                cb(null,uploadInfo);
              })
            })
          })
        });

我想知道是否有更清洁的东西:

Container.upload(req,res,{container: "my-s3-bucket", ACL:'public-read'},function(err,uploadInfo) { ... }

提前致谢:)

2 个答案:

答案 0 :(得分:5)

对不起,这有点晚了但答案就在这里:

https://github.com/strongloop/loopback-component-storage/pull/47

他们增加了对应用acls和其他一些东西的支持:

var dsImage = loopback.createDataSource({
   connector: require('loopback-component-storage'),
   provider: 'filesystem',
   root: path.join(__dirname, 'images'),

   getFilename: function(fileInfo) {
     return 'image-' + fileInfo.name;
   },
   acl: 'public-read',
   allowedContentTypes: ['image/png', 'image/jpeg'],
   maxFileSize: 5 * 1024 * 1024
 });

将该acl放入' public-read',就可以了。

答案 1 :(得分:1)

所以最后我不得不丢弃整个loopback组件存储,因为我还需要从文件中获取一些额外的参数,我用formidable解析表单并直接用aws sdk上传文件,就像这样:

var formidable = require('formidable');

var form = new formidable.IncomingForm();

form.parse(req, function(err,fields,files) {
  if (err) return cb(err);

  var fs = require('fs');
  var AWS = require('aws-sdk');

  AWS.config.update({
    accessKeyId:"my-key-id",
    secretAccessKey:"my-key",
    region:"us-east-1"
  });

  var s3 = new AWS.S3();

  s3.putObject({
    Bucket:'shopika',
    Key: files.file.name,
    ACL:'public-read', //Public plz T^T
    Body: fs.createReadStream(files.file.path),
    ContentType:files.file.type
  }, function(err,data) {
    if (err) return cb(err);

  //Upload success, now I have the params I wanted in 'fields' and do my stuff with them :P
    cb(null,data);
  });
});