Meanjs 无法将图像保存到嵌套模式中
Posted
技术标签:
【中文标题】Meanjs 无法将图像保存到嵌套模式中【英文标题】:Meanjs unable to save image into nested schema 【发布时间】:2015-06-18 17:09:13 【问题描述】:我的 Meanjs 应用程序应该将徽标上传到我的 UserSchema 中的嵌套模式中。我能够成功上传文件,因为我能够成功地为用户存储个人资料照片。但是,当我尝试将图像保存到嵌套架构中时,它会失败。
我的模型看起来像这样:
ClubSchema = name:String,
logo:Buffer;
UserSchema = name:String,
photo:Buffer,
club:[ClubSchema]
我能够成功地将所有数据插入到我的 ClubSchema 中,但不是徽标。
我的 client.controller.js
var user = new Users($scope.user);
console.dir(user.club); //I can see the logo here
for(var i = 0;i<user.club.length;i++)
user.club[i].logo = $scope.uploadedLogos[i]; //Still trying to force it into the object
user.club[i].hasLogo = true; //Mysterious hasLogo = false appears
user.$update(function(response)
$scope.success = true;
console.log('Inside scope success User is ');
console.dir(user); //hasLogo=false appears in this and no logo
$location.path('/');
, function(response)
$scope.error = response.data.message;
);
我的 server.controller.js
if (user)
// Merge existing user
user = _.extend(user, req.body);
user.updated = Date.now();
user.displayName = user.name;
user.save(function(err)
if (err)
return res.status(400).send(
message: errorHandler.getErrorMessage(err)
);
else
req.login(user, function(err)
if (err)
res.status(400).send(err);
else
res.json(user);
);
);
else
res.status(400).send(
message: 'User is not signed in'
);
hasLogo 字段完全令人困惑,因为我的代码中不存在这样的赋值。我添加了hasLogo = true,希望以某种方式将hasLogo设置为true并上传图像,但这也不起作用。我不知道这个 hasLogo 是从哪里来的。在 hasLogo = true 循环之后,如果我打印对象,我可以看到两个 hasLogo 字段,一个为 true,另一个为 false。 $update 成功后,始终为 false。我的模型不包含 hasLogo 字段。
【问题讨论】:
user.club[i].logo 是 logo 出现的地方,对吧..? $scope.uploadedLogos[i] 有什么? $scope.uploadedLogos[i] 只是我创建的一个单独的数组,用于对正在上传的徽标进行辅助存储,然后将它们重新分配给 $scope.user.club[i].logo 以防万一它被删除了。无济于事,因为它仍然会在我尝试更新的最终用户对象中被删除。 与最终用户对象没有真正的关联。只是我正在尝试的东西。我尝试使用 $scope.user 更新的最终 var 用户仍然不包含徽标 你从客户那里得到的标志是这种格式的吗? “数据:图像/ PNG; BASE64,iVBORw0KGgoAAAANSUhEUgAAAc4AAAHOCAMAAAAmOBmCAAAAM1BMVEUyicg9j8pJlcxUm85godBrp9J3rdSCs9aNudiZv9ukxd2wy9 + 70eHH1 + PS3eXe4 + fp6elALxDWAAAMG0lEQVR42u3da7qkKgyF4aiUhYrA / Ed7fvT96e7Te3sjJN + aQfkWEKKiVGIowiWAk8BJ4CRwwkngJHASOAmccBI4CZwETgInnAROAieBk8AJJ4GTwEngJHDCSeAkcBI4CZxwEjgJnAROAiecBE4CJ4ETTgIngZPASeCEk8BJ4CRwEjjhJHASOAmcBE44CZwETgIngRNOAieBk8BJvHCmtMY4h18zx7ikVODsyHGNYZL / zxTiYlHVFGdJ8TXKxzOGuBU4NSav8yRHMs5rhlNVtvcoZzLORkapGBiWL7kiYclwtl4tl0muy9S9aNecF ==”跨度> 是的,我正在使用 ng-file-upload 指令上传文件。使用此指令完美上传用户的照片。顺便说一句,我通过使 Club 完全成为一个单独的模块并与用户模型分开创建/更新它找到了一个解决方法。不确定这是否是正确的方法,但它确实有效。不过很想知道原始实现有什么问题。 【参考方案1】:这是我使用 MEAN.JS 进行文件上传的方式。
型号
var UserSchema = new mongoose.Schema(
name:type:String,required:true,
photo:Buffer // Image
);
服务器控制器
var userPicture = function(req,res) // Stores Picture for a user matching the ID.
user.findById(req.param('id'), function (err, user)
console.log(req.files) // File from Client
if(req.files.file) // If the Image exists
var fs = require('node-fs');
fs.readFile(req.files.file.path, function (dataErr, data)
if(data)
user.photo ='';
user.photo = data; // Assigns the image to the path.
user.save(function (saveerr, saveuser)
if (saveerr)
throw saveerr;
res.json(HttpStatus.OK, saveuser);
);
);
return
res.json(HttpStatus.BAD_REQUEST,error:"Error in file upload");
);
;
客户端控制器
$scope.saveuserImage = function()
$scope.upload = $upload.upload( // Using $upload
url: '/user/'+$stateParams.id+'/userImage', // Direct Server Call.
method:'put',
data:'', // Where the image is going to be set.
file: $scope.file
).progress(function (evt) )
.success(function ()
var logo = new FileReader(); // FileReader.
$scope.onAttachmentSelect = function(file)
logo.onload = function (e)
$scope.image = e.target.result; // Assigns the image on the $scope variable.
$scope.logoName = file[0].name; // Assigns the file name.
$scope.$apply();
;
logo.readAsDataURL(file[0]);
$scope.file = file[0];
$scope.getFileData = file[0].name
;
location.reload();
$scope.file = "";
$scope.hideUpload = 'true'
);
$scope.getFileData = '';
// location.reload()
;
HTML
<input ng-file-select="onAttachmentSelect($files)" ng-model="getFileData" name="upload" type="file" required="true">
ng-file-select 用于从客户端获取文件。
这对我来说很好。希望这可以帮助。
【讨论】:
我已经可以成功上传图片了。问题在于将其插入到我的 mongodb 文档中的嵌套字段中。以上是关于Meanjs 无法将图像保存到嵌套模式中的主要内容,如果未能解决你的问题,请参考以下文章