【问题标题】:Create User with Avatar in Sails.js fails when Avatar is an image/png当 Avatar 是图像/png 时,在 Sails.js 中使用 Avatar 创建用户失败
【发布时间】:2016-04-25 11:37:09
【问题描述】:

我使用sails generate 命令生成并实现了一个名为User 的新API。当我尝试上传 svg 或 jpg 图像时,它工作得很好,文件被上传并在数据库中创建用户。但是,当我尝试使用 png 文件时,保存到数据库失败!尽管 png 文件会按预期上传,但不会保存用户。调试时,Object Param 为空,除了“company”字段。

生成 api

$ sails generate api user   

用户控制器 (api/controller/UserController.js)

'create': function (req, res, next) {
        var params = req.params.all();
        var format = req.param('format');
        delete params['format'];

        req.file('avatar').upload({
            maxBytes: 10000000,
            dirname: sails.config.appPath + '/assets/images/avatar/'
        }, function (err, uploadedFiles) {
            if (err) return res.negotiate(err);
            console.log(uploadedFiles.length + ' file(s) uploaded successfully!');
            console.log(uploadedFiles);
            params["avatar"] = uploadedFiles[0].fd;

            User.create(params, function userCreated(err, user) {
                if (err) {
                    req.session.flash = {
                        err: err
                    }
                    return res.redirect("/user/new");
                }

                if (format == 'json') {
                    res.json(user);
                } else {
                    res.redirect('user/show/' + user.id);
                }

            });

        });
    },

我的意见/用户/new.ejs:

<form id="register-form" action="/user/create" method="post" enctype="multipart/form-data">

    <input id="icon_prefix" type="text" name="company" class="validate">
    <input name="avatar" type="file">
    <input class="file-path validate" type="text">
    <input id="icon_prefix" type="text" name="first_name" class="validate">
    <input id="icon_prefix" type="text" name="last_name" class="validate">
    <input id="icon_telephone" type="tel" name="phone"
    <input id="icon_mail" type="email" name="email" class="validate" required="" aria-required="true">
    <input name="type" value="Auftraggeber" type="radio" id="auftraggeber" checked/>
    <input name="type" value="Auftragnehmer" type="radio" id="auftragnehmer" disabled/>
    <input id="password" type="password" name="password" pattern=".{6,}" title="6 characters minimum"
    <input id="confirmation" type="password" class="validate">
    <input type="hidden" value="<%= _csrf %>">
    <input type="checkbox" id="accept"/>
    <input type="checkbox" id="not_robot"/>
    <button class="btn-large waves-effect waves-light" type="submit">Submit
    </button>
</form>

用户模型 (api/models/User.js)

module.exports = {

    schema: true,
    attributes: {
        avatar: {
            type: "String"
        },
        first_name: {
            type: "String",
            required: true
        },
        last_name: {
            type: "String",
            required: true
        },
        type: {
            type: "String",
            enum: ['Auftraggeber', 'Auftragnehmer']
        },
        phone: {
            type: "String",
            unique: true
        },
        email: {
            type: "String",
            email: true,
            unique: true,
            required: true
        },
        password: {
            type: "String",
            required: true
        },
        company: {
            type: "String",
            required: true
        },
        toJSON: function () {
            var obj = this.toObject();
            delete obj.password;
            return obj;
        }

    }

};

【问题讨论】:

    标签: forms api upload sails.js


    【解决方案1】:

    你可以使用skipper包来处理不同类型的图片

    在终端运行此命令

    npm install skipper --save
    

    在控制器顶部app.use(require('skipper')());

    现在可以使用这个包了

    req.file('image').upload({
      // ...any other options here...
    }, ...);
    

    【讨论】:

    • 我可以测试它:错误:钩子 (controllers) 加载失败!错误:ReferenceError:未定义应用程序。这不是sails如何与app.use()=>一起工作的方式,而不是我将它添加到我的config/policies.js:'*':require('skipper')(),但它不起作用全部。它的加载和加载,并且对象参数再次为空。你曾经使用过sails.js 吗?上传部分+在数据库中保存数据对你有用吗?谢谢
    【解决方案2】:

    我搜索了两个多星期,发现了这个: https://github.com/balderdashy/sails/issues/2326

    您不必安装skipper 和require('skipper') => Sails 会自动与skipper 一起提供!也不要将其用作政策,它不会起作用(对我来说不是)。

    对于具有文本输入和文件输入的 multipart/form-data 表单,您要在其中上传图像/文件并保存数据(文件名)立即在数据库中是:您的 html 表单中输入字段的顺序很重要!将文本输入字段放在 html 表单的顶部,将文件输入字段放在底部。

    【讨论】:

      猜你喜欢
      • 2023-02-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-22
      • 2015-09-25
      相关资源
      最近更新 更多