5

Meteor CollectionFS を使用しています。現在、ファイルのアップロードはクライアントで実行されています。サーバーでファイルのアップロードを実行して、andriod や ios などの他のプラットフォームがファイル アップロードのサービスを使用できるようにしたいと考えています。

現在、私のコードは次のとおりです。

client.html

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

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

スキーマ.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 guideの Meteor Methods についても読みたいと思います。

于 2015-12-19T20:57:51.910 に答える