前几天在弄文件上传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


 

    

版权声明:本文为风吹叶子吖原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://www.cnblogs.com/yezi1116/p/16107270.html