5

Meteor CollectionFS kullanıyorum. Şu anda dosya yüklemem istemcide gerçekleştiriliyor. Sunucuya dosya yükleme işlemini yapmak istiyorum, böylece andriod veya ios gibi diğer platformlar dosya yükleme hizmetlerimi kullanabilir. Şu anda buradaMeteor CollectionFS - Resim sunucuda yükleme

benim kodudur:

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

Bu kod benim için mükemmel çalışıyor. Ama gördüğünüz gibi her şey istemci kontrolünde yapılır. Bunu Meteor'da sunucu denetleyicilerinde nasıl yapabilirim?

Dosyamı sunucuya nasıl gönderebilirim böylece görüntüleri oraya işleyebilir, yükleyebilir veya yükleyebilirim?

DÜZENLEME Bir Android App dize kodlanmış bir base64 gönderme olacağını bildiği gibi

. Peki bunu nasıl tedavi edeceğim? Meteor Server'da Görüntü Yükleme için merkezi bir fonksiyona sahip olmak istiyorum.

+0

Sorunu tam olarak anlamadım. Dosyayı sunucuya zaten gönderiyorsunuz. Bu kod bir cordova uygulamasında çalışmıyor mu? –

+0

@SerkanDurusoy Bu kod web için mükemmel çalışıyor. Fakat gördüğünüz gibi tüm kod müşteriye yerleştirilir. Bir android uygulaması resim yükleme yöntemimi kullanmak isterse ne olur? O kapalı bir base64 kodlanmış dizesi gönderir. Peki bunu nasıl tedavi edeceğim? – StormTrooper

cevap

2

Bu mantığı Meteor Method içine yerleştirebilirsiniz. Daha sonra, bu yöntemin yalnızca sunucuda veya istemcide ve sunucuda (gecikme telafisi) çalışmasını isteyip istemediğinize karar verebilirsiniz.

Yani sizin denetleyici değiştirecek:

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

Schema.js (veya sunucu veya istemci ve sunucu üzerinde çalışabilir başka bir dosya - Meteor dosya yapısı here hakkında daha fazla okuyun)

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

    } 
}); 

Yöntem ayrıca değerleri sunucuya ve istemciye göre de gönderebilir. Ayrıca, Meteor guide'daki Meteor Yöntemleri hakkında daha fazla bilgi edinebilirim.

+0

Burada iki şey sormak istiyorum. Bir sunucu işlevine event.target.files (A FILE OBJECT) iletebileceğimizden emin misiniz? Ve bildiğiniz gibi bir android uygulaması bir dosya obj değil base64 kodlu bir dize gönderiyor olacak. Peki bunu nasıl halledeceğim? – StormTrooper

+0

Bu şekilde denedim. Meteor.methods dosyasında boş nesne alıyorum. Bunu beğendi: {'0': {}} – StormTrooper

+0

Evet Genel bir şey yazdım, bu tam bir çözüm değil ama umarım – Urigo