2015-04-20 2 views
1

У меня есть загрузчик изображений, который использует amazon s3 для хранения файлов. Я пытаюсь обновить значение users.avatar для URL-адреса amazon при загрузке.Meteor Store URL-адрес изображения как аватара

Вот мое событие загрузки:

Template.avatarUpload.events({ 
"click button.upload": function(){ 
    event.preventDefault(); 
    var files = $("input.avatar-upload")[0].files 

    S3.upload({ 
      files: files, 
      path: "avatars" 
     }, function(e,r) { 
      console.log(r); 
    }); 
    } 
}) 

Я пытался что-то вроде следующего на основе нескольких других StackOverflow QA годов:

Сначала это, но я столкнулся с проблемой, где я не мог магазин files.url не получает сообщение об ошибке (обновление не удалось: MongoError: '$ наборов' пусто Вы должны указать поле следующим образом:. {$ модника: {: ...}})

Meteor.users.update({_id:Meteor.user()._id}, {$set:{"profile.name": files.url}}) 

Тогда как это:

var set = {avatar: {}}; 
    set.avatar[files.url]; 

    Meteor.users.update({ 
     _id: Meteor.user()._id 
    }, {$set: set}); 

Но не повезло. В основном пытается взять URL-адрес и сохранить его в users.avatar. Мой json выглядит так:

users = [{ 
    username: "normcore", 
    avatar: "avatar_url" 
}] 

ответ

1

Вот как мы его работаем. Я оставлю это здесь для тех, кто имея тот же вопрос:

стороне клиента:

Template.avatarUpload.events({ 
"click button.upload": function(){ 
    event.preventDefault(); 
    var files = $("input.avatar-upload")[0].files 


    S3.upload({ 
      files: files, 
      path: "avatars" 
     }, function(e,r) { 
      console.log(r); 
      console.log(Meteor.user()); 
      var user = Meteor.user(); 
      var student = {"_id": user._id }; 
      console.log(student); 
      var url = r.secure_url; 
      Meteor.call('updateAvatar', student, url, function(error) { 
       if (error) { 
        return console.log(error); 
       } else { 
        return console.log('success'); 
       } 
      }); 
    }); 
} 
}); 
Template.avatarUpload.helpers({ 
"files": function(){ 
    return S3.collection.find(); 
} 
}); 

стороне сервера:

Meteor.methods({ 
    updateAvatar: function(user, url) { 
    console.log(user); 
    check(user, { 
     _id: String 
    }); 
    check(url, String); 

    return Meteor.users.update({_id:Meteor.user()._id}, 
     { 
     $set: { 
      "profile.avatar": url 
     } 
     }, function(error) { 
     if (error) { 
      return console.log(error); 
     } 
     }); 
    } 
}); 
1

Опубликовать весь код для помощника.

В целом, это то, что ваш код должен выглядеть следующим образом:

Template.avatarUpload.events({ 
    "click button.upload": function(){ 
     event.preventDefault(); 
     var files = $("input.avatar-upload")[0].files 
     S3.upload({ 
      files: files, 
      path: "avatars" 
     }, function(e,r) { 
      if(e) { 
       console.log(r); 
      } else if(r) { 
       console.log(r); 
       Meteor.users.update(Meteor.user(), {$set: {avatar: r.url}}); // Correct this to actual URL in response. If multiple files 
      } 
     }); 
    }, 
}) 

Вы должны выяснить, как обрабатывать случай нескольких загрузки файлов. Один из способов - не включать multi в свой тег ввода.

+0

Ok так что теперь я узнал, что это не будет хорошо, чтобы сделать это полностью на стороне клиента, я поставлю код в приведенном выше правиле, чтобы показать, как я пытаюсь это сделать. –

+0

Что происходит с клиентской стороной? –

+0

На самом деле это не будет работать так, как позволяют настройки Allows/Deny для группы пользователей для этого проекта –

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