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