koa2实现文件上传。

来源:互联网 发布:al软件平面设计教程 编辑:程序博客网 时间:2024/06/06 02:42

在使用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....');
这样就完美的使用了中间件处理了文件上传。





原创粉丝点击