1.0 前言
文件上传是我们工作中长用到的功能,比如,用户上传图像,上传附件,这节我们讲解基于 Koa 的文件上传。
2.0 单文件上传
2.0.1 中间件选择
在 Koa 中文件上传常用中间件有以下三个:
其中 koa-body 用的最多,最方便,接下来我们用它做代码案例。
2.0.2 koa-body 使用
步骤一:前端代码,通过 FormData 传递参数

$("#add-button").bind("click", function() {var userName = $("#userName").val()var userEmail = $("#userEmail").val()var file = $("#photo")[0].files[0]var formData = new FormData()formData.append("name", userName)formData.append("email", userEmail)formData.append("file", file)$.ajax({type: "POST",enctype: 'multipart/form-data',url: "/user/add",data: formData,processData: false,contentType: false,cache: false,success: function(data){}});})
步骤二:下载koa-body npm包
npm install koa-body --save
步骤三:在koa项目中引用koa-body中间件
// app.jsconst Koa = require('koa')const koaBody = require('koa-body');const app = new Koa()app.use(koaBody({multipart:true, // 支持文件上传formidable:{uploadDir:path.join(__dirname,'static/upload/'), // 设置文件上传目录keepExtensions: true, // 保持文件的后缀maxFieldsSize:2 * 1024 * 1024, // 文件上传大小onFileBegin:(name,file) => { // 文件上传前的设置console.log(`name: ${name}`);},}}));
步骤四:获取文件上传后的文件路径
通过ctx.request.files获取上传的文件。
// controller/user.jsfunction add(ctx) {// 获取文件路径,这里注意,我在前端 发起请求的时候,FormData 的 key 是 file,所以这里用 *.file,可以接着看多文件上传const { path } = ctx.request.files.fileconst { name, email } = ctx.request.body // 获取 request body 字段console.log(path)array.push({id: array.length,imgUrl: path.split("/static")[1],name,})ctx.body = {success: true}}module.exports = {add}
这样就实现了单文件上传,核心的关注点是 koa-body 的使用,还有获取文件路径的方法,使用还是非常方便的。具体 Demo 代码地址可以从总结中获取
3.0 多文件上传
有了单文件上传,就有多文件上传,多文件差别主要在获取上传后文件信息不一样,其他都是一样
步骤一:前端代码,通过 FormData 传递参数
这里 key 分别为file1,file2,后端获取就呀通过file1,file2获取。
$("#add-button").bind("click", function() {var userName = $("#userName").val()var userEmail = $("#userEmail").val()var files = $("#photo")[0].filesvar formData = new FormData()formData.append("name", userName)formData.append("email", userEmail)// 这里 key 分别为file1,file2,后端获取就呀通过file1,file2获取for (let index = 0; index < files.length; index++) {const element = files[index];formData.append(`file${index+1}`, element)}$.ajax({type: "POST",enctype: 'multipart/form-data',url: "/user/add",data: formData,processData: false,contentType: false,cache: false,success: function(data){initUserData()}});})
步骤四:获取文件上传后的文件路径
function add(ctx) {// 这里注意,我在前端 发起请求的时候,FormData 的 key 是 file,所以这里用 *.fileconst path1 = file1.pathconst { file1, file2 } = ctx.request.filesconst path2 = file2.pathconst { name, email } = ctx.request.bodyconsole.log(path1, path2)array.push({id: array.length,imgUrl: path1.split("/static")[1],name,})ctx.body = {success: true}}
4.0 总结
这节我们一起学习了基于 koa-body 中间件 文件上传的例子,大家可以结合 Demo 好好理解下,总的来说,使用还是非常方便的,Demo 地址
