javascript - Meteor collectionfs 插入服务器端

标签 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) {
        //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);


        });
    }
});

服务器.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;
            }
        });
    }
});

但是还是不行,求大神指教。 服务器端如何插入?

最佳答案

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

首先定义一个集合:

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

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 文档以阅读有关允许/拒绝的更多信息 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) {

      });
    });
  }
});

这应该是您需要的一切。

关于javascript - Meteor collectionfs 插入服务器端,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23044259/

相关文章:

javascript - 使用阻塞长同步操作会暂停 Node.js 中的所有用户吗?

javascript - 通过 Meteor Iron Router 获取 Json/Collection 的最简单方法

javascript - 无法返回 Meteor/MongoDB 中的当前用户对象

mongodb - 在 Meteor.js 中,我如何让两个开发项目使用同一个 Mongo 实例?

javascript - MongoDB 和 GridFS

python - 使用 python 和 mongoDB 索引 20M 的记录

javascript - 我试图理解 Javascript 中的这段嵌套对象

javascript - 使用 for 循环在 JavaScript 中填充二维数组

mongodb - 如何使用 Mongo 控制台从 MongoDB 的 GridFS 中删除文件(以类似事务的方式)

javascript - 如何在javascript中为phonegap实现搜索功能?