1-1 初始化仓库

  1. yarn init -y

1-2 安装依赖

  1. yarn add koa koa-router koa-body

1-3 配置index.js

ctx.requst.files 读取上传的文件

  1. const koa = require("koa");
  2. const app = new koa();
  3. const router = require("koa-router")();
  4. const koaBody = require("koa-body");
  5. router.post("/file", async ctx => {
  6. console.log(ctx.request.files);
  7. ctx.body = "上传成功"
  8. })
  9. app.use(koaBody({
  10. multipart: true,
  11. formidable: {
  12. maxFileSize: 200 * 1024 * 1024, //设置默认上传文件的大小
  13. // 保留文件扩展名
  14. keepExtensions: true
  15. }
  16. }))
  17. app.use(router.routes());
  18. app.listen(5000);

html:

@ html/file.html
<form action="http://localhost:5000/file" 
    enctype="multipart/form-data"
    method="post">
        <input type="file" name="logo"> <br>
        <input type="submit">
</form>

Tips:表单上传文件 一定要加上enctype =”multipart/form-data”

1-4 需要将数据上传到服务器

# path.basename()  可以获取路径中图片的名字及其拓展名
const path = require("path");
var file ="c:/data/logo.jpg";
console.log(path.basename(file))  //logo.jpg
# index.js
router.post("/file", async ctx => {
    var file = ctx.request.files.logo.path
    var baseName = path.basename(file);
    console.log(baseName)
    /* 1、创建一个可读流 */
    var reader =  fs.createReadStream(file);
    /* 2、设置上传图片的文件名 */
    var upFilePath =  `./static/${baseName}`;
    /* 3、创建一个可写流 */
    var writer = fs.createWriteStream(upFilePath);
    /* 4、可读流通过管道写入可写流 */
    reader.pipe(writer);

    ctx.body = "上传成功"
})

1-5 完成版

const koa = require("koa");
const app = new koa();
const fs = require("fs");
const path = require("path");
const router = require("koa-router")();
const koaBody = require("koa-body");
const static = require("koa-static");
router.post("/file", async ctx => {
    var file = ctx.request.files.logo.path
    var baseName = path.basename(file);
    console.log(baseName)
    /* 1、创建一个可读流 */
    var reader =  fs.createReadStream(file);
    /* 2、设置上传图片的文件名 */
    var upFilePath =  `./static/${baseName}`;
    /* 3、创建一个可写流 */
    var writer = fs.createWriteStream(upFilePath);
    /* 4、可读流通过管道写入可写流 */
    reader.pipe(writer);

    ctx.body = "上传成功"
})
app.use(static(path.join(__dirname,"static")))
app.use(koaBody({
    multipart: true,
    formidable: {
        maxFileSize: 200 * 1024 * 1024,    //设置默认上传文件的大小
           // 保留文件扩展名
        keepExtensions: true
    }
}))
app.use(router.routes());

app.listen(5000);

完整版2例子:
index.js

const koa = require("koa")
const app = new koa()
const router = require("koa-router")()
const static = require("koa-static")
const koaBody = require("koa-body")
const path = require("path")
const fs = require("fs")
router.post("/file", async ctx => {
    console.log(ctx.request.body);  //获取填写的文字 { username: '111', userage: '111' }
    console.log(ctx.request.files.logo.path);  //获取上传的图片  C:\Users\ADMINI~1\AppData\Local\Temp\upload_12622ea329696d42e01a52d2921e92fc.jpg
    var logo = ctx.request.files.logo.path
    var reader = fs.createReadStream(logo)  
    console.log(path.basename(logo));  //upload_be79cde63b89f77423f7cce6541893fc.jpg
    var uploadFile = `./static/${path.basename(logo)}`
    var writer = fs.createWriteStream(uploadFile)
    reader.pipe(writer)
    console.log(ctx.origin+"/"+path.basename(logo));  //加上本地地址
    ctx.body = "文件上传成功"
})
app.use(koaBody({
    multipart: true,
    formidable: {
        maxFieldsSize: 200 * 1024 * 1024,
        keepExtensions: true
    }
}))
app.use(router.routes())
app.use(static(path.join(__dirname, "static")))
app.listen(7000)

html

 <form action="http://localhost:7000/file" method="post" enctype="multipart/form-data">
        <div>
            <label for="">姓名</label>
            <input type="text" name="username">
        </div>
        <div>
            <label for="年龄">年龄</label>
            <input type="text" name="userage">
        </div>
        <div>
            <label for="上传图片">上传图片</label>
            <input type="file" name="logo">
        </div>
        <input type="submit">
    </form>

image.png