1.0 前言

文件上传是我们工作中长用到的功能,比如,用户上传图像,上传附件,这节我们讲解基于 Koa 的文件上传。

2.0 单文件上传

2.0.1 中间件选择

在 Koa 中文件上传常用中间件有以下三个:

其中 koa-body 用的最多,最方便,接下来我们用它做代码案例。

2.0.2 koa-body 使用

步骤一:前端代码,通过 FormData 传递参数

image.png

  1. $("#add-button").bind("click", function() {
  2. var userName = $("#userName").val()
  3. var userEmail = $("#userEmail").val()
  4. var file = $("#photo")[0].files[0]
  5. var formData = new FormData()
  6. formData.append("name", userName)
  7. formData.append("email", userEmail)
  8. formData.append("file", file)
  9. $.ajax({
  10. type: "POST",
  11. enctype: 'multipart/form-data',
  12. url: "/user/add",
  13. data: formData,
  14. processData: false,
  15. contentType: false,
  16. cache: false,
  17. success: function(data){
  18. }
  19. });
  20. })

步骤二:下载koa-body npm包

  1. npm install koa-body --save

步骤三:在koa项目中引用koa-body中间件

  1. // app.js
  2. const Koa = require('koa')
  3. const koaBody = require('koa-body');
  4. const app = new Koa()
  5. app.use(koaBody({
  6. multipart:true, // 支持文件上传
  7. formidable:{
  8. uploadDir:path.join(__dirname,'static/upload/'), // 设置文件上传目录
  9. keepExtensions: true, // 保持文件的后缀
  10. maxFieldsSize:2 * 1024 * 1024, // 文件上传大小
  11. onFileBegin:(name,file) => { // 文件上传前的设置
  12. console.log(`name: ${name}`);
  13. },
  14. }
  15. }));

步骤四:获取文件上传后的文件路径

通过ctx.request.files获取上传的文件。

  1. // controller/user.js
  2. function add(ctx) {
  3. // 获取文件路径,这里注意,我在前端 发起请求的时候,FormData 的 key 是 file,所以这里用 *.file,可以接着看多文件上传
  4. const { path } = ctx.request.files.file
  5. const { name, email } = ctx.request.body // 获取 request body 字段
  6. console.log(path)
  7. array.push({
  8. id: array.length,
  9. imgUrl: path.split("/static")[1],
  10. name,
  11. email
  12. })
  13. ctx.body = {
  14. success: true
  15. }
  16. }
  17. module.exports = {
  18. add
  19. }

这样就实现了单文件上传,核心的关注点是 koa-body 的使用,还有获取文件路径的方法,使用还是非常方便的。具体 Demo 代码地址可以从总结中获取

3.0 多文件上传

有了单文件上传,就有多文件上传,多文件差别主要在获取上传后文件信息不一样,其他都是一样

步骤一:前端代码,通过 FormData 传递参数

这里 key 分别为file1,file2,后端获取就呀通过file1,file2获取。

  1. $("#add-button").bind("click", function() {
  2. var userName = $("#userName").val()
  3. var userEmail = $("#userEmail").val()
  4. var files = $("#photo")[0].files
  5. var formData = new FormData()
  6. formData.append("name", userName)
  7. formData.append("email", userEmail)
  8. // 这里 key 分别为file1,file2,后端获取就呀通过file1,file2获取
  9. for (let index = 0; index < files.length; index++) {
  10. const element = files[index];
  11. formData.append(`file${index+1}`, element)
  12. }
  13. $.ajax({
  14. type: "POST",
  15. enctype: 'multipart/form-data',
  16. url: "/user/add",
  17. data: formData,
  18. processData: false,
  19. contentType: false,
  20. cache: false,
  21. success: function(data){
  22. initUserData()
  23. }
  24. });
  25. })

步骤四:获取文件上传后的文件路径

  1. function add(ctx) {
  2. // 这里注意,我在前端 发起请求的时候,FormData 的 key 是 file,所以这里用 *.file
  3. const path1 = file1.path
  4. const { file1, file2 } = ctx.request.files
  5. const path2 = file2.path
  6. const { name, email } = ctx.request.body
  7. console.log(path1, path2)
  8. array.push({
  9. id: array.length,
  10. imgUrl: path1.split("/static")[1],
  11. name,
  12. email
  13. })
  14. ctx.body = {
  15. success: true
  16. }
  17. }

4.0 总结

这节我们一起学习了基于 koa-body 中间件 文件上传的例子,大家可以结合 Demo 好好理解下,总的来说,使用还是非常方便的,Demo 地址