Javascript Meteor collectionfs插入服务器端

Javascript Meteor collectionfs插入服务器端,javascript,meteor,gridfs,meteorite,Javascript,Meteor,Gridfs,Meteorite,大家好,我使用collectionfs+gridfs+cfs文件系统, 在collectionfs文档中,我发现如何在客户端插入文件,如下所示: Template.myForm.events({ 'change .myFileInput': function(event, template) { FS.Utility.eachFile(event, function(file) { Images.insert(file, function (err, fileObj) {

大家好,我使用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;
            }
        });
    }
});
但它仍然不起作用,请帮助我如何解决这个问题。
如何在服务器端插入?

请确保应用如下允许和拒绝规则:

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

如果使用流媒体,也必须应用更新,例如。我没有测试它,但它显示了你必须走的路

首先定义一个集合:

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

var postImagesStoreFS = new FS.Store.FileSystem("postImages", {
  path: "~/workspace/uploads/"
});
添加一些过滤器。以防万一你需要那样的东西

PostImages = new FS.Collection('postImages', {
  stores: [postImagesStoreFS ],
  filter: {
  maxSize: 3145728,
  allow: {
    contentTypes: ['image/*'],
    extensions: ['png', 'PNG', 'jpg', 'JPG', 'jpeg', 'JPEG']
  }
});
现在,您可以在同一个*.js文件中定义允许和拒绝函数。如果删除不安全的包,则所有插入/更新/删除操作都必须通过允许/拒绝函数。如果命令通过允许回调,则可以将其插入到集合中(如果没有使其无效的拒绝函数)

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

客户端模板应该与您发布的模板一样工作。为了防止你想使用一些元数据,我添加了一个更大的例子

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) {

      });
    });
  }
});

这应该是您需要的一切。

它在客户端不起作用,因为您必须定义允许/拒绝规则。我建议你在客户端做;)检查meteor文档:o但是我删除了不安全的,所以不能从客户端插入,它总是错误。您定义了允许/拒绝规则吗?对不起,我不知道,我必须在哪里定义它?可能有一个例子?哇,谢谢,它很有效,但为什么我会有这个错误?403(禁止)为什么要禁止url?您从哪里获取url?chaosbohne,您可以确认您在允许规则中获取元数据吗?我正在为此使用gridfs,设置元数据(并且可以在数据库中看到),但是如果我在allow规则中使用console.log(doc),我看不到任何元数据。您必须在事件中的客户端上设置元数据。参见我的示例或其他示例。注意,元数据必须设置为一个新的FS.File实例。如果您只想进行测试,那么这很好。如果您想控制谁可以更改内容,从安全角度来看,这不太好。这是为了允许公共上载,并且假设没有用户帐户,就像imgur一样
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) {

      });
    });
  }
});