我有一个图像上传器,它使用amazon s3来存储文件。我试图在上传时将我的users.avatar值更新为亚马逊网址。
这是我的上传活动:
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:'$ set'为空。你必须指定一个字段如下:{$ mod :{:...}})
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"
}]
答案 0 :(得分: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。
答案 1 :(得分: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);
}
});
}
});