【问题标题】:Meteor collectionfs insert server sideMeteor collectionfs 插入服务器端
【发布时间】:2014-05-27 11:28:49
【问题描述】:

大家好,我正在使用 collectionfs + gridfs + cfs 文件系统, 在 collectionfs 文档中,我找到了如何在客户端插入文件,如下所示:

Template.myForm.events({
  'change .myFileInput': function(event, template) {
    FS.Utility.eachFile(event, function(file) {
      Images.insert(file, function (err, fileObj) {
        //Inserted new doc with ID fileObj._id, and kicked off the data upload using HTTP
      });
    });
  }
});

在这种情况下将在客户端插入文件,但在我的情况下,我删除了不安全的,所以不能在客户端进行插入,我尝试在服务器端进行插入。所以这是我的代码:

Template.myForm.events({
    'change . myFileInput': function (event, template) {
        FS.Utility.eachFile(event, function (file) {
            var reader = new FileReader();
            reader.onload = function (fileLoadEvent) {
                Meteor.call('ImageUpload', file, reader.result, function (err, res) {
                    if (err) {
                        console.log(err);
                    } else {
                        alert(res);
                    }
                });
            };
            reader.readAsBinaryString(file);


        });
    }
});

server.js:

Meteor.methods({
    ImageUpload: function (fileInfo, fileData) {
        console.log(fileInfo);
        Images.insert(fileInfo, fileData, function (err, fileObj) {
            if (err) console.log(err)
            else {
                //Inserted new doc with ID fileObj._id, and kicked off the data upload using HTTP
                console.log(fileObj);
                return fileObj._id;
            }
        });
    }
});

但它仍然不起作用,请帮助我如何解决这个问题。 如何在服务器端插入?

【问题讨论】:

  • 它在客户端不起作用,因为您必须定义允许/拒绝规则。我建议您在客户端执行此操作;) 检查流星文档。
  • :o 但是我删除了不安全的,所以不能从客户端插入,它总是错误
  • 您是否定义了允许/拒绝规则?
  • 哎呀抱歉我不知道,我必须在哪里定义它?可以举个例子吗?

标签: javascript meteor gridfs meteorite


【解决方案1】:

给你一个例子。我没有测试它,但它显示了你必须走的路。

首先定义一个集合:

我想这一步你已经很清楚了。

var postImagesStoreFS = new FS.Store.FileSystem("postImages", {
  path: "~/workspace/uploads/"
});

Add 添加了一些过滤器。以防万一您需要类似的东西。

PostImages = new FS.Collection('postImages', {
  stores: [postImagesStoreFS ],
  filter: {
  maxSize: 3145728,
  allow: {
    contentTypes: ['image/*'],
    extensions: ['png', 'PNG', 'jpg', 'JPG', 'jpeg', 'JPEG']
  }
});

现在您可以在同一个 *.js 文件中定义您的允许和拒绝函数。如果您删除不安全的包,所有插入/更新/删除都必须通过允许/拒绝功能。如果一个命令通过了允许回调,它可以被插入到你的集合中(如果没有使它无效的拒绝函数)

在这个例子中,如果有用户并且图像的元数据用户是用户本身,我只想插入图像。您必须自行设置元数据用户。对于测试,只需在每个允许函数中返回 true,如 Pent 示例所示。查看流星文档以了解更多关于允许/拒绝http://docs.meteor.com/#allow

PostImages.allow({
  insert: function(userId, doc) {
    return (userId && doc.metadata.owner === userId);
  },
  update: function(userId, doc, fieldNames, modifier) {
    return (userId === doc.metadata.owner);
  },
  remove: function(userId, doc) {
    return false;
  },
  download: function(userId) {
    return !!userId;
  }
});

客户端模板应该像您发布的那样工作。以防万一您想使用一些元数据,我添加了一个更大的示例。

Template.myForm.events({
  'change .myFileInput': function(event, template) {
    FS.Utility.eachFile(event, function(file) {
      var fsFile = new FS.File(file);
      fsFile.metadata = {owner: Meteor.userId()};
      Images.insert(fsFile, function (err, fileObj) {

      });
    });
  }
});

这应该是你需要的一切。

【讨论】:

  • 哇,谢谢它的工作原理,但为什么我有这个错误? localhost:3000/cfs/files/postImages/i2uWz6MHNxqRbcBjA/…403(禁止)
  • 为什么url被禁止?
  • 你从哪里得到网址?
  • chaosbohne,你能确认你在允许规则中获取元数据吗?我为此使用gridfs,设置元数据(并且可以在数据库中看到它)但是如果我在允许规则中使用console.log(doc),我看不到任何元数据。
  • 您必须在活动的客户端设置元数据。请参阅我的示例或github.com/CollectionFS/… 以获取另一个示例。注意元数据必须设置为一个新的 FS.File 实例。
【解决方案2】:

确保像这样应用允许和拒绝规则:

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

如果使用流式传输,也必须应用更新

【讨论】:

  • 如果你想做的只是测试,这很好,如果你想控制谁可以改变事情,从安全的角度来看不是很好。
  • 这是为了允许公开上传并假设没有用户帐户,就像 imgur 一样
猜你喜欢
  • 2015-07-31
  • 2016-03-21
  • 2013-01-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多