5

Sto usando Meteor CollectionFS. Attualmente il mio caricamento dei file viene eseguito sul client. Voglio eseguire il caricamento di file sul server in modo che altre piattaforme come andriod o ios possano utilizzare i miei servizi di caricamento di file.Meteor CollectionFS - Caricamento immagine sul server

Attualmente Ecco il mio codice:

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

Schema.js

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

Il codice funziona perfettamente per me. Ma come vedi tutto è fatto nel controller del client. Come posso eseguire questo sui controller server in Meteor?

Come posso inviare il mio file al server in modo che possa elaborare, inserire o caricare le mie immagini lì?

EDIT

Come lei sa che un App Android sarà l'invio di un base64 stringa codificata. Quindi come lo tratterò qui? Voglio avere una funzione centralizzata per il caricamento delle immagini su Meteor Server.

+0

Non capisco la tua domanda. Stai già inviando il file al server. Questo codice non funziona in un'app cordova? –

+0

@SerkanDurusoy Questo codice funziona perfettamente per il web. Ma come vedi tutto il codice è posto sul client. Cosa succede se un'app per Android desidera utilizzare il metodo di caricamento delle immagini? Egli decreterà l'invio di una stringa codificata in base64. Quindi, come lo tratterò? – StormTrooper

risposta

2

È possibile inserire tale logica all'interno di Meteor Method. Quindi è possibile decidere se si desidera che il metodo venga eseguito solo sul server o sul client e sul server (compensazione della latenza).

Così vorrei cambiare il controller a:

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

Schema.js (o qualsiasi altro file che può essere eseguito sul server o client e server - Per saperne di più la struttura dei file 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) { 
     }); 
    } 

    } 
}); 

Il metodo può anche restituire valori, eseguito su server e client. Vorrei anche saperne di più su Metodi Meteor su Meteor guide.

+0

Voglio chiedere due cose qui. Sei sicuro di poter passare event.target.files (A FILE OBJECT) a una funzione del server? E come sai, un'app per Android invierà una stringa codificata in base 64 e non un file obj. Quindi come lo gestirò? – StormTrooper

+0

Ho provato in quel modo. Ottengo oggetto vuoto di file in Meteor.methods. In questo modo: {'0': {}} – StormTrooper

+0

Sì, ho scritto una cosa generale, non è una soluzione completa ma spero che tu abbia l'idea – Urigo