在使用koa2进行文件上传的时候,我写了一个中间件用来处理url,然而我在从新配置上传文件的url的时候,需要指定一下,upload.single('file'),这让我原来的url处理中间件会出错,才开始,我在中间件的Post那里做了个判断,如果url===“”uploadFile“”,增加upload.single('file'),然而上床文件没有什么反应。
最后突然看到,我的中间件那里可以自定义一个新的函数,让中间件函数处理的不是.js文件,而是自定义一个新的函数,专门用来处理文件上传,这样也不用在原来的主文件中增加代码,妨碍主文件的可读性。废话不说上代码:
controller.js
var fs = require('fs');
function addMapping(router,mapping) {
for (var url in mapping) {
if (url.startsWith('GET')) {
//如果url类似GET ***
var path = url.substring(4);
router.get(path,mapping[url]);
console.log(`register URL mapping:GET ${path}`);
} else if (url.startsWith('POST')) {
var path = url.substring(5);
router.post(path,mapping[url]);
console.log(`register URL mapping: POST ${path}`);
} else if (url.startsWith('PUT')) {
var path = url.substring(4);
router.put(path,mapping[url]);
console.log(`register URL mapping: PUT ${path}`);
} else if (url.startsWith('DELETE')) {
var path = url.substring(7);
router.del(path,mapping[url]);
console.log(`register URL mapping: DELETE ${path}`);
}else {
console.log(`invalid URL :${url}`);
}
}
}
function addControllers(router,dir) {
//使用sync是因为启动时只用一次,不存在性能问题
fs.readdirSync(__dirname + '/'+ dir).filter((f) => {
//过滤出.js文件
return f.endsWith('.js');
}).forEach((f) => {
console.log(`process controller:${f}...`);
//导入js文件
let mapping = require(__dirname + '/' + dir + '/' + f);
addMapping(router,mapping);
});
}
function addUploadFile(router) {
//文件上传
const multer = require('koa-multer');
//配置
var storage = multer.diskStorage({
//文件保存路径
destination:function (req,file,cb) {
cb(null,'./public/uploads/img/')
},
filename:function (req,file,cb){
var fileFormat = (file.originalname).split(".");
cb(null,Date.now() + "." + fileFormat[fileFormat.length - 1]);
}
})
var upload = multer({storage:storage});
//upload.single('file')这里面的file是上传空间的name<input type="file" name="file"/>
router.post('/uploadFile',upload.single('file'),async (ctx,next) => {
ctx.response.body ="<h1>上传成功!</h1>";
/*ctx.body = {
filename: ctx.req.file.filename//返回文件名
} */
ctx.redirect('/index');
})
console.log(`register URL mapping: POST /uploadFile`);
}
module.exports = function (dir) {
let controllers_dir = dir || 'controllers',
router = require('koa-router')();
addControllers(router,controllers_dir);
addUploadFile(router);
return router.routes();
};
app.js
const Koa = require('koa');
const bodyParser = require('koa-bodyparser');
const controller = require('./controller');
const templating = require('./templating');
const app = new Koa();
const isProduction = process.env.NODE_ENV === 'production';
app.use(async(ctx,next) => {
console.log(`Process ${ctx.request.method} ${ctx.request.url}...`);
var start = new Date().getTime(),
execTime;
await next();
execTime = new Date().getTime() - start;
ctx.response.set('X-Response-Time', `${execTime}ms`);
});
app.use(bodyParser());
app.use(templating('views',{
noCache: !isProduction,
watch: !isProduction
}));
// static file support:
let staticFiles = require('./static-files');
app.use(staticFiles('/static/', __dirname + '/static'));
app.use(controller());
app.listen(3000);
console.log('app started at port 3000....');
这样就完美的使用了中间件处理了文件上传。