【发布时间】:2015-11-06 17:42:12
【问题描述】:
我正在创建一个带有表单的简单页面,用于将图像和其他数据上传到 Sql Server 数据库。我的服务器是用 Node.js 和 express 构建的,我正在使用 Sequelize 连接到数据库,我正在使用 multer 来获取 req.files。
我是 multer 新手,所以我可能遗漏了一些明显的东西,但我正在尝试使用 multer 从表单上传三个图像,从 req.files 中的文件对象读取缓冲区,使用 .toString( ) 在这些缓冲区上,然后使用 Sequelize 将这些 base 64 字符串写入 Sql Server 数据库。问题是它只为 req.files 数组中的最后一项写入字符串。不管它是哪一个,但它只写最后一个 Node.js 到控制台的输出说它正在将所有三个字符串写入数据库,但是当你查看表时,没有任何值柱子。我不确定我做错了什么,任何帮助将不胜感激。我将粘贴下面的代码,如果更多信息有帮助,请告诉我。
在此先感谢您的帮助!
这是我的路线:
'use strict';
var Event = require('../models/Event');
var fs = require('fs');
var clc = require('cli-color');
var multer = require('multer');
var storage = multer.memoryStorage();
var upload = multer({ storage: storage });
var bodyparser = require('body-parser');
var path = require('path');
var Sql = require('sequelize');
var sql = new Sql('events_page', 'eventsUser', 'p@ssw0rd1', {
host: 'localhost',
dialect: 'mssql',
pool: {
max: 5,
min: 0,
idle: 10000
}
});
module.exports = function (router) {
router.route('/createevent')
.post(upload.array('images', 3), function (req, res, next) {
sql.sync()
.then(function () {
Event.create(req.body)
.then(function (newEvent) {
newEvent.update({
eventHeaderImage: req.files[0].buffer.toString('base64'),
eventBackgroundImage: req.files[1].buffer.toString('base64'),
eventSliderImage: req.files[2].buffer.toString('base64')
})
.then(function (eventWithPics) {
res.redirect('/admin');
});
});
});
});
};
这是我的服务器:
'use strict';
var express = require('express');
var app = express();
var clc = require('cli-color');
var port = process.env.PORT || 3000;
var time = new Date();
var dbRouter = express.Router();
var adminRouter = express.Router();
require('./routes/db-routes')(dbRouter);
require('./routes/admin-routes')(adminRouter);
app.use(express.static(__dirname + '/'));
app.use('/', dbRouter);
app.use('/', adminRouter);
app.listen(port, function () {
console.log(clc.cyanBright('server started on port ' + port + ' at ' + time));
});
这是我的事件表的架构:
'use strict';
var fs = require('fs');
var path = require('path');
var Sql = require('sequelize');
var sql = new Sql('events_page', 'eventsUser', 'p@ssw0rd1', {
host: 'localhost',
dialect: 'mssql',
pool: {
max: 5,
min: 0,
idle: 10000
}
});
var Event = module.exports = sql.define('Event', {
eventName: Sql.STRING,
eventLocation: Sql.STRING,
eventStartDate: Sql.DATE, //the start date...
eventEndDate: Sql.DATE, // the end date...
eventHeaderImage: Sql.TEXT, //bas64 string of header image
eventBackgroundImage: Sql.TEXT, //image to appear on event slide on homepage
eventSlideUpText: Sql.TEXT, //slide up text for future events page
sponsorsHeading: Sql.TEXT, //heading for sponsors section
sponsorsParagraph: Sql.TEXT, // paragraph below heading on sponsors section
eventSliderImage: Sql.TEXT, //image for front page slider
homepageBulletOne: Sql.STRING,
homepageBulletTwo: Sql.STRING,
homepageBulletThree: Sql.STRING
},
{
getterMethods : {
eventUrl: function () {
return this.eventName.replace(/\W/g, '').toLowerCase() + '-' + this.eventStartDate.getFullYear();
}
}
});
Event.sync({force: false});
最后是 HTML:
<form action="/createevent" id="createEventForm" method="post" enctype="multipart/form-data">
<label class="col_4" for="newEventName">Event Name</label>
<input class="col_8" id="newEventName" name="eventName" type="text submit" placeholder="Event Name" />
<label class="col_4" for="newEventLocation">Event Location</label>
<input class="col_8" id="newEventLocation" name="eventLocation" type="text submit" placeholder="Event Location" />
<label class="col_4" for="newEventStartDate">Start Date</label>
<input class="col_8" id="newEventStartDate" name="eventStartDate" type="date" placeholder="Event Start Date" />
<label class="col_4" for="newEventEndDate">End Date</label>
<input class="col_8" id="newEventEndDate" name="eventEndDate" type="date" placeholder="Event End Date" />
<label class="col_4" for="newEventHeaderImage">Header Image</label>
<input class="col_8" id="newEventHeaderImage" name="images" type="file" placeholder="Header Image" />
<label class="col_4" for="newEventBackgroundImage">Future Page Image</label>
<input class="col_8" id="newEventBackgroundImage" name="images" type="file" placeholder="Image for Future Events Page" />
<label class="col_4" for="newEventSlideUpText">Future Page Text</label>
<input class="col_8" id="newEventSlideUpText" name="eventSlideUpText" type="text submit" placeholder="Text for Future Events Page" />
<label class="col_4" for="newSponsorsHeading">Sponsor Tab Heading</label>
<input class="col_8" id="newSponsorsHeading" name="sponsorsHeading" type="text submit" placeholder="Heading for Sponsor Tab" />
<label class="col_4" for="newSponsorsParagraph">Sponsor Tab Intro Paragraph</label>
<input class="col_8" id="newSponsorsParagraph" name="sponsorsParagraph" type="text submit" placeholder="Intro Paragraph for Sponsor Tab" />
<label class="col_4" for="newEventSliderImage">Image for Homepage slider</label>
<input class="col_8" id="newEventSliderImage" name="images" type="file" placeholder="Image for Homepage slider" />
<label class="col_4" for="newHomepageBulletOne">Homepage Bullet One</label>
<input class="col_8" id="newHomepageBulletOne" name="homepageBulletOne" type="text submit" placeholder="Heading for Sponsor Tab" />
<label class="col_4" for="newHomepageBulletTwo">Homepage Bullet Two</label>
<input class="col_8" id="newHomepageBulletTwo" name="homepageBulletTwo" type="text submit" placeholder="Heading for Sponsor Tab" />
<label class="col_4" for="newHomepageBulletThree">Homepage Bullet Three</label>
<input class="col_8" id="newHomepageBulletThree" name="homepageBulletThree" type="text submit" placeholder="Heading for Sponsor Tab" />
<br />
<br />
<button class="medium" id="createEventButton" type="submit">Create Event</button>
</form>
【问题讨论】:
标签: javascript node.js express multer