Nodejs koa實現上傳檔案
阿新 • • 發佈:2022-04-06
前幾天在弄檔案上傳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