大家好我使用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;
}
});
}
});
但它仍然不起作用,请帮我解决这个问题。 如何在服务器端插入?
答案 0 :(得分:7)
一个例子。我没有测试它,但它显示了你必须去的方式。
首先定义一个集合:
我认为这一步已经很清楚了。
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和deny函数。如果删除不安全的包,则所有insert / updates / removed必须通过allow / deny函数。如果一个命令通过了允许回调,它就可以插入到你的集合中(如果没有deny函数使它失效)
在这个例子中,如果有用户,并且图像的元数据用户是用户本身,我只想插入图像。您必须自己设置元数据用户。对于测试,只需在每个允许函数中返回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) {
});
});
}
});
这应该是你需要的一切。
答案 1 :(得分:0)
确保应用允许和拒绝规则,如下所示:
Images.allow({
insert: function() { return true },
update: function() { return true },
remove: function() { return false }
});
如果使用流媒体
,也必须应用更新