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