1. 程式人生 > >koa2實現檔案上傳。

koa2實現檔案上傳。

在使用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....');
這樣就完美的使用了中介軟體處理了檔案上傳。