我正在使用Meteor CollectionFS。目前我的文件上传是在客户端上执行的。我想在服务器上执行文件上传,以便其他平台(如andriod或ios)可以使用我的文件上传服务。
目前这是我的代码:
client.html
app.controller('clientController', function ($scope, $meteor, $filter) {
$scope.uploadFile = function(event){
var files = event.target.files;
for (var i = 0, ln = files.length; i < ln; i++) {
files[i].userId = Meteor.userId();
Images.insert(files[i], function (err, fileObj) {
});
}
};
});
app.directive('customOnChange', function() {
return {
restrict: 'A',
link: function (scope, element, attrs) {
var onChangeHandler = scope.$eval(attrs.customOnChange);
element.bind('change', onChangeHandler);
}
};
});
clientController.js
Images = new FS.Collection("images", {
stores: [
new FS.Store.FileSystem("images", {path: '~/uploads'})
]
});
Schema.js
{{1}}
这段代码非常适合我。但正如您所看到的,一切都在客户端控制器中完成。如何在Meteor中的服务器控制器上执行此操作?
如何将文件发送到服务器,以便我可以在那里处理,插入或上传图像?
修改
如您所知,Android应用程序将发送base64编码的字符串。那我该怎么对待呢?我想在Meteor服务器上有一个集中的图像上传功能。
答案 0 :(得分:2)
您可以将该逻辑放在Meteor Method内。 然后,您可以决定是希望该方法仅在服务器上运行,还是在客户端和服务器上运行(延迟补偿)。
所以我会把你的控制器改为:
$scope.uploadFile = function(event){
Meteor.call("uploadFiles", event.target.files);
};
Schema.js (或可在服务器或客户端和服务器上运行的任何其他文件 - 阅读有关Meteor文件结构的更多信息here)
Images = new FS.Collection("images", {
stores: [
new FS.Store.FileSystem("images", {path: '~/uploads'})
]
});
Meteor.methods({
uploadFiles: function (files) {
for (var i = 0, ln = files.length; i < ln; i++) {
files[i].userId = Meteor.userId();
Images.insert(files[i], function (err, fileObj) {
});
}
}
});
该方法还可以返回值,在服务器和客户端上运行。 我还会在Meteor guide上阅读更多关于流星方法的内容。