NodeJs koa2實(shí)現(xiàn)文件上傳

知識(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ì)。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末刑棵,一起剝皮案震驚了整個(gè)濱河市巴刻,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌蛉签,老刑警劉巖胡陪,帶你破解...
    沈念sama閱讀 221,406評(píng)論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件沥寥,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡柠座,警方通過(guò)查閱死者的電腦和手機(jī)邑雅,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,395評(píng)論 3 398
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)妈经,“玉大人淮野,你說(shuō)我怎么就攤上這事〈蹬荩” “怎么了骤星?”我有些...
    開(kāi)封第一講書(shū)人閱讀 167,815評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)爆哑。 經(jīng)常有香客問(wèn)我洞难,道長(zhǎng),這世上最難降的妖魔是什么揭朝? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 59,537評(píng)論 1 296
  • 正文 為了忘掉前任廊营,我火速辦了婚禮,結(jié)果婚禮上萝勤,老公的妹妹穿的比我還像新娘。我一直安慰自己呐伞,他們只是感情好敌卓,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,536評(píng)論 6 397
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著伶氢,像睡著了一般趟径。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上癣防,一...
    開(kāi)封第一講書(shū)人閱讀 52,184評(píng)論 1 308
  • 那天蜗巧,我揣著相機(jī)與錄音,去河邊找鬼蕾盯。 笑死幕屹,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的级遭。 我是一名探鬼主播望拖,決...
    沈念sama閱讀 40,776評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼挫鸽!你這毒婦竟也來(lái)了说敏?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 39,668評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤丢郊,失蹤者是張志新(化名)和其女友劉穎盔沫,沒(méi)想到半個(gè)月后医咨,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,212評(píng)論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡架诞,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,299評(píng)論 3 340
  • 正文 我和宋清朗相戀三年拟淮,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片侈贷。...
    茶點(diǎn)故事閱讀 40,438評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡惩歉,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出俏蛮,到底是詐尸還是另有隱情撑蚌,我是刑警寧澤,帶...
    沈念sama閱讀 36,128評(píng)論 5 349
  • 正文 年R本政府宣布搏屑,位于F島的核電站争涌,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏辣恋。R本人自食惡果不足惜亮垫,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,807評(píng)論 3 333
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望伟骨。 院中可真熱鬧饮潦,春花似錦、人聲如沸携狭。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 32,279評(píng)論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)逛腿。三九已至稀并,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間单默,已是汗流浹背碘举。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,395評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留搁廓,地道東北人引颈。 一個(gè)月前我還...
    沈念sama閱讀 48,827評(píng)論 3 376
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像枚抵,于是被迫代替她去往敵國(guó)和親线欲。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,446評(píng)論 2 359

推薦閱讀更多精彩內(nèi)容

  • 一汽摹、基本用法 1.1 架設(shè) HTTP 服務(wù) // demos/01.jsconst Koa = require('...
    majun00閱讀 1,364評(píng)論 0 5
  • Spring Cloud為開(kāi)發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見(jiàn)模式的工具(例如配置管理李丰,服務(wù)發(fā)現(xiàn),斷路器逼泣,智...
    卡卡羅2017閱讀 134,695評(píng)論 18 139
  • 原文鏈接:http://www.reibang.com/p/6b816c609669 前傳 出于興趣最近開(kāi)始研究k...
    懸筆e絕閱讀 7,220評(píng)論 1 11
  • Koa 必須使用 7.6 以上的版本趴泌。如果你的版本低于這個(gè)要求舟舒,就要先升級(jí) Node。 基本用法 Koa 提供一個(gè)...
    Gukson666閱讀 2,465評(píng)論 0 1
  • 1.簡(jiǎn)書(shū) koa是由Express原班人馬打造嗜憔,致力于成為一個(gè)更小秃励、更富有表現(xiàn)力、更健壯的Web框架吉捶。使用koa編...
    不去解釋閱讀 2,669評(píng)論 0 11