5

我正在使用 Meteor CollectionFS。目前我的文件上传是在客户端上执行的。我想在服务器上执行文件上传,以便其他平台(如 andriod 或 ios)可以使用我的文件上传服务。

目前这里是我的代码:

客户端.html

<input type="file" custom-on-change="uploadFile">

客户端控制器.js

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);
    }
  };
});

Schema.js

Images = new FS.Collection("images", {
    stores: [
      new FS.Store.FileSystem("images", {path: '~/uploads'})
    ]
});

该代码非常适合我。但正如您所见,一切都在客户端控制器中完成。如何在 Meteor 的服务器控制器上执行此操作?

如何将我的文件发送到服务器,以便在那里处理、插入或上传我的图像?

编辑

如您所知,Android 应用程序将发送一个 base64 编码的字符串。那么我将如何处理呢?我想在 Meteor Server 上有一个集中的图像上传功能。

4

1 回答 1

2

您可以将该逻辑放在Meteor Method中。然后,您可以决定是否希望该方法仅在服务器上运行或同时在客户端和服务器上运行(延迟补偿)。

所以我会将您的控制器更改为:

$scope.uploadFile = function(event){
  Meteor.call("uploadFiles", event.target.files);
};

Schema.js (或任何其他可以在服务器或客户端和服务器上运行的文件 -在此处阅读有关 Meteor 文件结构的更多信息)

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 指南上阅读有关 Meteor 方法的更多信息。

于 2015-12-19T20:57:51.910 回答