koa2實現檔案上傳。
阿新 • • 發佈:2019-02-07
在使用koa2進行檔案上傳的時候,我寫了一箇中間件用來處理url,然而我在從新配置上傳檔案的url的時候,需要指定一下,upload.single('file'),這讓我原來的url處理中介軟體會出錯,才開始,我在中介軟體的Post那裡做了個判斷,如果url===“”uploadFile“”,增加upload.single('file'),然而上床檔案沒有什麼反應。
最後突然看到,我的中介軟體那裡可以自定義一個新的函式,讓中介軟體函式處理的不是.js檔案,而是自定義一個新的函式,專門用來處理檔案上傳,這樣也不用在原來的主檔案中增加程式碼,妨礙主檔案的可讀性。廢話不說上程式碼:
controller.js
app.jsvar 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(); };
這樣就完美的使用了中介軟體處理了檔案上傳。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....');