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 无法将图像保存到嵌套模式中的主要内容,如果未能解决你的问题,请参考以下文章

无法通过模型传输数据使用局部视图以模态加载图像

Mongoose:保存具有不同模式的嵌套 JSON

qpixmap qclipboard 并保存图像倒置

PIL 无法将模式 F 写入 jpeg

使用 Angularjs 和 Mongoose (meanjs) 创建子文档并保存值

修改正则表达式模式以将嵌套标记捕获到对象数组中