2015-04-06 3 views
3

Я использую collectionFS для загрузки изображения, я хочу, чтобы мои пользователи могли загружать только одно изображение, а затем изменять его (загружать новый). У меня есть часть в месте, чтобы проверить, если изображение уже загружено, но дело в том, что я не могу изменить изображение, которое находится в дб, это код, я должен вставить новое изображение:Обновить изображение с помощью collectionfs

'change .myFileInput': function(event, template) { 
    FS.Utility.eachFile(event, function(file) { 
    var newFile = new FS.File(file); 
    newFile.metadata = { 
     createdBy:Meteor.userId(), 
    } 
    Imagess.insert(newFile, function (err, fileObj) { 
     if (err){ 
     // handle error 
     } else { 
     // handle success depending what you need to do 
     var currentUserId = Meteor.userId(); 
     var imagesURL = { 
      "profile.image": "/cfs/files/images/" + fileObj._id 
     }; 
     Meteor.users.update(currentUserId, {$set: imagesURL}); 
     } 
    }); 
}); 

Я не знаю, как изменить Imagess.insert на Imagess.update, я уже прочитал документацию метеоров, но не могу найти, как это сделать. Может кто-нибудь предложить способ или некоторые документы, где я могу узнать, как это сделать?

Заранее благодарен!

+0

Говоря о не понимании того, как [ 'update'] (http://docs.meteor.com/#/full/update), не просто написать заявление обновления' Meteor.users.update (currentUserId, {$ set: imagesURL}); '? Можете ли вы уточнить, что вы хотите сделать? Если 'Imagess' является коллекцией монго, вы можете сделать то же самое, что и с« Meteor.users ». –

+0

У меня есть базовое понимание инструкции обновления. Я хочу обновить изображение, это будет Imagess.update (currentUserId, {$ set: newFile, function (err, fileObj)? – Esteban89

ответ

2

Невозможно обновить текущее изображение с использованием FSCollection (в данном случае изображения), отметьте this Github Issue, где Raix и Aldeed расскажут о какой-то будущей работе, такой как FS.File.updateData(), но ее еще не реализовано.

Возможное обходное решение будет таким.

Template.example.events({ 
    'click #changeImage':function(event,template){ 
    var message = confirm("Do you wanna change this image?"); 
     if(message == true){ 
      var file = $('#changeImageInput').get(0).files[0], 
       newFile = new FS.File(file); 
       newFile.metadata = { 
         createdBy:Meteor.userId(), 
        } 
      var query = Images.findOne({'metadata.createdBy':Meteor.userId()}) //supposing there is only one image if not use a .fetch() and a for instead. 

      //removing the current image. 
      Images.remove({_id:query._id},function(err,result){ 
      //if there is not error removing the image, insert new one with the same metadata 
      if(!err){ 
       Images.insert(fsFile,function(){ 
       if(!err){ 
       console.log("New image get upload") 
       } 
       }) 
      } 
      });     
     }else{ 
      console.log("user don't want to change the image") 
     }     
    } 
}) 
0

это будет Imagess.update (currentUserId, {$ набор: NewFile, функция (эээ, fileObj)

Неа


Синтаксис обновления коллекции Монго метеора?. оператор моделируется после that of mongo Shell's. В этом случае, если вы хотите сделать обновление, вам необходимо указать, какая запись будет обновлена ​​в вашем первом параметре.

Imagess.update({_id:theImageId},newFile); 

В монго, обновление на самом деле просто переписывается.

Это перепишет запись в Imagess, которая удовлетворяет заявлению _id:theImageId в новый объект JSON, newFile. Но вы уверены, что это то, что вы хотите? Если вы хотите, чтобы иметь возможность изменить изображение пользователя, это заявление уже сделал это для вас:

Meteor.users.update(currentUserId, {$set: imagesURL}); 

Если это действительно то, что вы хотите, то вы должны каким-то образом получить идентификатор записи Imagess данных (или любое его свойство), которое вы хотите обновить в первую очередь.

Примечание: оператор insert возвращает идентификатор вставленной записи данных.

Смежные вопросы