NodeJs koa2實現文件上傳


[轉載自:]https://www.jianshu.com/p/34d0e1a5ac70

知識講解

koa2框架是一個基於中間件的框架,也就是說,需要使用到的功能,比如路由(koa-router),日志(koa-logger),都可以找到相應的中間件庫,即npm包,然后通過app.use(...)引進來。
本文的主題:實現文件上傳就是通過引用相應的中間來實現的。
我查了一下資料,發現可以實現文件上傳的中間件有3個,選擇其中一個就可以了:
1)koa-body
2)busboy
3)koa-multer
關於以上三種中間件的差異可以自行網上查資料,這里我選擇比較順眼的koa-body,實用簡單。

代碼實現

步驟一:下載koa-body npm包

npm install koa-body –save

npm install koa-body --save

步驟二:在koa項目中引用koa-body中間件

const koaBody = require('koa-body');
app.use(koaBody({
    multipart: true,
    formidable: {
        maxFileSize: 200*1024*1024    // 設置上傳文件大小最大限制,默認2M
    }
}));

步驟三:使用koa-body中間件后,即可通過ctx.request.files獲取上傳的文件

提醒:Smile
新版本的koa-body通過ctx.request.files獲取上傳的文件
舊版本的koa-body通過ctx.request.body.files獲取上傳的文件
朋友們千萬不要入坑哈,本人就入坑過半天。

步驟四:獲取到文件之后,通過fs將文件保存到服務器的指定目錄

上傳單個文件:

router.post('/uploadfile', async (ctx, next) => {
  // 上傳單個文件
  const file = ctx.request.files.file; // 獲取上傳文件
  // 創建可讀流
  const reader = fs.createReadStream(file.path);
  let filePath = path.join(__dirname, 'public/upload/') + `/${file.name}`;
  // 創建可寫流
  const upStream = fs.createWriteStream(filePath);
  // 可讀流通過管道寫入可寫流
  reader.pipe(upStream);
  return ctx.body = "上傳成功!";
});

 

上傳多個文件:

router.post('/uploadfiles', async (ctx, next) => {
  // 上傳多個文件
  const files = ctx.request.files.file; // 獲取上傳文件
  for (let file of files) {
    // 創建可讀流
    const reader = fs.createReadStream(file.path);
    // 獲取上傳文件擴展名
    let filePath = path.join(__dirname, 'public/upload/') + `/${file.name}`;
    // 創建可寫流
    const upStream = fs.createWriteStream(filePath);
    // 可讀流通過管道寫入可寫流
    reader.pipe(upStream);
  }
 return ctx.body = "上傳成功!";
});

前端代碼

順便把前端的代碼也附上,前端通過提交表單,把文件發送到你的服務器

<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>

 

最后總結

今天在項目中實現文件上傳的時候,也一不小心入了一下坑,為什么呢?(請看以上步驟三)
在網上找的大部分資料都是通過ctx.request.body.files來獲取上傳的文件,這個是舊版本的koa-body的獲取文件方法,為了安全考慮,新版本的koa-body采用ctx.request.files來獲取文件。
總結原因,以后要學會找官方文檔,以官方文檔為主,其他文檔為輔,這樣才對。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM