1. 程式人生 > 其它 >Nodejs koa實現上傳檔案

Nodejs koa實現上傳檔案

前幾天在弄檔案上傳demo,於是自己先搭建上傳檔案的環境,廢話不多說,開整;

  我用的koa腳手架,實現檔案上傳的話要用的  koa-body  第三方中介軟體

首先在app.js 引入並且使用(koaBody 裡面的引數在npm上有參考)

const Koa = require('koa')
const app = new Koa()
const views = require('koa-views')
const json = require('koa-json')
const onerror = require('koa-onerror')
const bodyparser = require('koa-bodyparser')
const logger 
= require('koa-logger') const koaBody = require('koa-body') const path = require('path') const index = require('./routes/index') const users = require('./routes/users') // error handler onerror(app) // middlewares // app.use(bodyparser({ // enableTypes: ['json', 'form', 'text'] // })) app.use(json()) app.use(logger()) app.use(require(
'koa-static')(__dirname + '/public')) app.use(views(__dirname + '/views', { extension: 'ejs' })) app.use(koaBody({ multipart: true, formidable: { maxFileSize: 200 * 1024 * 1024 // 設定上傳檔案大小最大限制,預設2M } })); // 配置跨域 app.use(async (ctx, next) => { ctx.set('Access-Control-Allow-Origin', '*'); ctx.set(
'Access-Control-Allow-Headers', 'Content-Type, Content-Length, Authorization, Accept, X-Requested-With , yourHeaderFeild'); ctx.set('Access-Control-Allow-Methods', 'PUT, POST, GET, DELETE, OPTIONS'); // Content-Type表示具體請求中的媒體型別資訊 ctx.set("Content-Type", "application/json;charset=utf-8"); await next(); }) // logger app.use(async (ctx, next) => { const start = new Date() await next() const ms = new Date() - start console.log(`${ctx.method} ${ctx.url} - ${ms}ms`) }) // routes app.use(index.routes(), index.allowedMethods()) app.use(users.routes(), users.allowedMethods()) // error-handling app.on('error', (err, ctx) => { console.error('server error', err, ctx) }); module.exports = app

然後在index.js

router.post('/upload', async (ctx, next) => {
  // console.log(ctx.request.files);
  const files = ctx.request.files[''];
  // console.log(files[0].path);
  files.forEach(item => {
    const reader = fs.createReadStream(item.path);
    //獲取上傳副檔名
    let filePath = path.join(__dirname, '../data/') + `/${item.name}`;
    console.log(filePath);
    const upStream = fs.createWriteStream(filePath);
    //可讀流通過管道寫入可寫流
    reader.pipe(upStream);
  })

  ctx.body = {
    meg: "successul",
    code: 200,
    data: null
  }
})

PS:坑1:低版本的fiel在 ctx.request.body中,這是前面看別人的文章,新版本的話是在ctx.request.files中;

  坑2:多檔案是一個物件,他的key是‘’,也就有了第一個  ctx.request.files[‘ ’],然後使用迴圈插入到儲存的檔案中;

  因為看前面的文章別人使用 for in 直接迴圈的,直接報錯 path 什麼錯誤的 

  直達:https://www.jianshu.com/p/34d0e1a5ac70