知識(shí)講解
koa2框架是一個(gè)基于中間件的框架晾腔,也就是說(shuō),需要使用到的功能啊犬,比如路由(koa-router)灼擂,日志(koa-logger),都可以找到相應(yīng)的中間件庫(kù)觉至,即npm包剔应,然后通過(guò)app.use(...)引進(jìn)來(lái)。
本文的主題:實(shí)現(xiàn)文件上傳就是通過(guò)引用相應(yīng)的中間來(lái)實(shí)現(xiàn)的语御。
我查了一下資料峻贮,發(fā)現(xiàn)可以實(shí)現(xiàn)文件上傳的中間件有3個(gè),選擇其中一個(gè)就可以了:
1)koa-body
2)busboy
3)koa-multer
關(guān)于以上三種中間件的差異可以自行網(wǎng)上查資料应闯,這里我選擇比較順眼的koa-body纤控,實(shí)用簡(jiǎn)單。
代碼實(shí)現(xiàn)
步驟一:下載koa-body npm包
npm install koa-body --save
步驟二:在koa項(xiàng)目中引用koa-body中間件
const koaBody = require('koa-body');
app.use(koaBody({
multipart: true,
formidable: {
maxFileSize: 200*1024*1024 // 設(shè)置上傳文件大小最大限制碉纺,默認(rèn)2M
}
}));
步驟三:使用koa-body中間件后船万,即可通過(guò)ctx.request.files獲取上傳的文件
提醒:
新版本的koa-body通過(guò)ctx.request.files獲取上傳的文件
舊版本的koa-body通過(guò)ctx.request.body.files獲取上傳的文件
朋友們千萬(wàn)不要入坑哈,本人就入坑過(guò)半天骨田。
步驟四:獲取到文件之后耿导,通過(guò)fs將文件保存到服務(wù)器的指定目錄
上傳單個(gè)文件:
router.post('/uploadfile', async (ctx, next) => {
// 上傳單個(gè)文件
const file = ctx.request.files.file; // 獲取上傳文件
// 創(chuàng)建可讀流
const reader = fs.createReadStream(file.path);
let filePath = path.join(__dirname, 'public/upload/') + `/${file.name}`;
// 創(chuàng)建可寫(xiě)流
const upStream = fs.createWriteStream(filePath);
// 可讀流通過(guò)管道寫(xiě)入可寫(xiě)流
reader.pipe(upStream);
return ctx.body = "上傳成功!";
});
上傳多個(gè)文件:
router.post('/uploadfiles', async (ctx, next) => {
// 上傳多個(gè)文件
const files = ctx.request.files.file; // 獲取上傳文件
for (let file of files) {
// 創(chuàng)建可讀流
const reader = fs.createReadStream(file.path);
// 獲取上傳文件擴(kuò)展名
let filePath = path.join(__dirname, 'public/upload/') + `/${file.name}`;
// 創(chuàng)建可寫(xiě)流
const upStream = fs.createWriteStream(filePath);
// 可讀流通過(guò)管道寫(xiě)入可寫(xiě)流
reader.pipe(upStream);
}
return ctx.body = "上傳成功态贤!";
});
前端代碼
順便把前端的代碼也附上舱呻,前端通過(guò)提交表單,把文件發(fā)送到你的服務(wù)器
<form action="http://localhost:8080/api/upload" method="post" enctype="multipart/form-data">
<input type="file" name="file" id="file" value="" multiple="multiple" />
<input type="submit" value="提交"/>
</form>
最后總結(jié)
今天在項(xiàng)目中實(shí)現(xiàn)文件上傳的時(shí)候悠汽,也一不小心入了一下坑箱吕,為什么呢?(請(qǐng)看以上步驟三)
在網(wǎng)上找的大部分資料都是通過(guò)ctx.request.body.files來(lái)獲取上傳的文件介粘,這個(gè)是舊版本的koa-body的獲取文件方法殖氏,為了安全考慮,新版本的koa-body采用ctx.request.files來(lái)獲取文件姻采。
總結(jié)原因雅采,以后要學(xué)會(huì)找官方文檔,以官方文檔為主慨亲,其他文檔為輔婚瓜,這樣才對(duì)。