当头像是 image/png 时,使用 Sails.js 中的头像创建用户失败
Create User with Avatar in Sails.js fails when Avatar is an image/png
我使用 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);
}
});
});
},
我的views/user/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;
}
}
};
您可以使用 skipper 包来处理不同类型的图像
运行终端中的这个命令
npm install skipper --save
在控制器的顶部app.use(require('skipper')());
现在可以使用这个包
req.file('image').upload({
// ...any other options here...
}, ...);
我搜索了 2 个多星期,发现了这个:
https://github.com/balderdashy/sails/issues/2326
您不必安装 skipper 和 require('skipper') => Sails 会自动附带 skipper!也不要将其用作策略,它不会起作用(对我来说不起作用)。
multipart/form-data表单有文本输入和文件输入,要上传image/file 并立即将数据(文件名)保存在数据库中:html 表单中输入字段的顺序很重要!将文本输入字段放在 html 表单的顶部,将文件输入字段放在底部。
我使用 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);
}
});
});
},
我的views/user/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;
}
}
};
您可以使用 skipper 包来处理不同类型的图像
运行终端中的这个命令
npm install skipper --save
在控制器的顶部app.use(require('skipper')());
现在可以使用这个包
req.file('image').upload({
// ...any other options here...
}, ...);
我搜索了 2 个多星期,发现了这个: https://github.com/balderdashy/sails/issues/2326
您不必安装 skipper 和 require('skipper') => Sails 会自动附带 skipper!也不要将其用作策略,它不会起作用(对我来说不起作用)。
multipart/form-data表单有文本输入和文件输入,要上传image/file 并立即将数据(文件名)保存在数据库中:html 表单中输入字段的顺序很重要!将文本输入字段放在 html 表单的顶部,将文件输入字段放在底部。