Meteor:无法使用CollectionFS将图像上传到S3

时间:2015-03-15 19:02:52

标签: javascript file-upload meteor amazon-s3

我正在尝试使用this指南测试上传功能,唯一的例外是使用cfs-s3包。这是非常基本的简单代码,但我在客户端控制台上收到错误 - Error: Access denied. No allow validators set on restricted collection for method 'insert'. [403]

即使我已经以各种可能的方式设置allow insert,我也会收到此错误。

这是我的客户代码:

// client/images.js
var imageStore = new FS.Store.S3("images");

Images = new FS.Collection("images", {
    stores: [imageStore],
    filter: {
        allow: {
            contentTypes: ['image/*']
        }
    }
});

Images.deny({
 insert: function(){
 return false;
 },
 update: function(){
 return false;
 },
 remove: function(){
 return false;
 },
 download: function(){
 return false;
 }
 });

Images.allow({
 insert: function(){
 return true;
 },
 update: function(){
 return true;
 },
 remove: function(){
 return true;
 },
 download: function(){
 return true;
 }
});

主页上有一个简单的文件输入按钮 -

// client/home.js
'change .myFileInput': function(e, t) {
    FS.Utility.eachFile(e, function(file) {
        Images.insert(file, function (err, fileObj) {
          if (err){
             console.log(err)  // --- THIS is the error
          } else {
             // handle success depending what you need to do

            console.log("fileObj id: " + fileObj._id)
            //Meteor.users.update(userId, {$set: imagesURL});
          }
        });
     });
}

我已经在S3上设置了正确的政策和所有内容,但我并不认为这个错误与S3有关。

// server/images.js
var imageStore = new FS.Store.S3("images", {
    accessKeyId: "xxxx",
    secretAccessKey: "xxxx",
    bucket: "www.mybucket.com"
});

Images = new FS.Collection("images", {
    stores: [imageStore],
    filter: {
        allow: {
            contentTypes: ['image/*']
        }
    }
});

我也已适当地发布和订阅了这些收藏品。我一直在挖掘几个小时,但似乎无法弄清楚发生了什么。

编辑:我刚读了insecure个包,现在一切正常。所以基本上,问题是允许/拒绝规则,但我实际上是这样做的。我不确定为什么它不承认规则。

1 个答案:

答案 0 :(得分:4)

您需要在仅服务器代码中定义FS.Collection的allow/deny规则。这些是应用于FS.Collection创建的基础Mongo.Collection的服务器端规则。

最佳方法是将AWS密钥导出为以下环境变量:AWS_ACCESS_KEY_ID,AWS_SECRET_ACCESS_KEY,从FS.Store中删除accessKeyId和secretAccessKey选项,然后移动FS.Collection构造函数调用以在客户端和服务器。 cfs:s3

中提到了使用env vars的便利性

除此之外,您还可以使用Meteor.settings.public来控制存储桶名称,当您想根据环境使用不同的存储桶时,这很方便。