Meteor CollectionFS - 在服务器上上传图像

时间:2015-12-15 13:18:28

标签: angularjs meteor image-resizing graphicsmagick collectionfs

我正在使用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服务器上有一个集中的图像上传功能。

1 个答案:

答案 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上阅读更多关于流星方法的内容。