koa2文件上传之koa-Multer实现

11 篇文章 1 订阅

场景一:单图上传:

前端代码:

axios 封装:


import axios from "axios";
const instance=axios.create({
    baseURL:"",
    timeout:5000,
})
instance.interceptors.request.use(
    (config)=>{
        return config
    },
    (err)=>{
        Promise.reject(err)
    }
)
instance.interceptors.response.use(
    (res)=>{
        return res.data
    },
    (err)=>{
        Promise.reject(error);
    }
)

const request=(url,params={},method="GET",config={})=>{
    let med=method.toUpperCase()
    switch(med){
        case "GET":
           return instance.get(url,{params})
        case "DELETE":
            return instance.get(url,{params})
        case "POST":
            return instance.post(url,params,{
                headers:{
                    ...config
                }
            })            
        case "PUT":
            return instance.put(url,params,{
                headers:{
                    ...config
                }
            })
    }

export default request

  页面调用:

<template>
  <div> 
    <p><input  ref="iptRef" multiple type="file" @change="getImgeData"></p>
    <p><button @click="trigger">上传</button></p>
  </div>
 </template>

<script setup>

import { ref } from 'vue'
import http from "../utils/utils"

const iptRef=ref(null)
const imgData=ref(null)

function upload(data){
  let fm=new FormData()
  http("/api/upload",fm,"post",{
    "Content-Type":"multipart/form-data"
  }).then(res=>{
    console.log("上传res:",res)
  }).catch(err=>{
    console.log("err:",err)
  })
}

const trigger=()=>{

  upload(imgData)

}
const getImgeData=(e)=>{

  let files=e.target.files[0];
  imgData.value=files
}
http("/api/userInfo").then(res=>{
  console.log("res:",res)
}).catch(err=>{
  console.log("err:",err)

})

</script>


<style scoped>

</style>

服务端代码:(需要注意的是我们需要实现在根目录下新建一个static/upload文件夹)

const Koa=require("koa")
const Router=require("koa-router")

const Multer=require("koa-multer")
const fs=require("fs")
const path=require("path")

const app=new Koa()
const router=new Router()

let storage=Multer.diskStorage({
    destination:function(req,file,cb){
        cb(null,"static/upload")
    },
    filename:function(req,file,cb){
        var fileFormat = (file.originalname).split(".");
        cb(null,Date.now() + "." + fileFormat[fileFormat.length - 1]);
    }
})
let upload=Multer({storage:storage})

app.use(router.routes())
app.use(router.allowedMethods())

router.get("/api/userInfo",async ctx=>{
    ctx.body={
        name:"sean",
        age:20
    }
})

router.post("/api/upload",upload.single("file"),async ctx=>{
    console.log("ctx.req:",ctx.req)
    ctx.body={
       msg:"上传成功"
    }
})

app.listen(3000,()=>{
    console.log("监听成功")
})

场景二:多图上传

前端代码:(axios封装一致)

<template>
  <div>
    <p><input  ref="iptRef" multiple type="file" @change="getImgeData"></p>
    <p><button @click="trigger">上传</button></p>
  </div>
 </template>

<script setup>
import { ref } from 'vue'
import http from "../utils/utils"

const iptRef=ref(null)
const imgData=ref(null)

function upload(data){

  let fm=new FormData()
  for(let i=0;i<data.value.length;i++){
    fm.append(`file`,data.value[i])
  }
  http("/api/upload",fm,"post",{
    "Content-Type":"multipart/form-data"
  }).then(res=>{
    console.log("上传res:",res)
  }).catch(err=>{
    console.log("err:",err)
  })
}

const trigger=()=>{
  console.log("  iptRef.value",  iptRef.value)
  upload(imgData)

}
const getImgeData=(e)=>{

  let files=e.target.files;
  imgData.value=files
}
http("/api/userInfo").then(res=>{
  console.log("res:",res)
}).catch(err=>{
  console.log("err:",err)

})


</script>


<style scoped>
.read-the-docs {
  color: #888;
}
</style>

服务端代码:

const Koa=require("koa")
const Router=require("koa-router")

const Multer=require("koa-multer")
const fs=require("fs")
const path=require("path")

const app=new Koa()
const router=new Router()

let storage=Multer.diskStorage({
    destination:function(req,file,cb){
        cb(null,"static/upload")
    },
    filename:function(req,file,cb){
        var fileFormat = (file.originalname).split(".");
        cb(null,Date.now() + "." + fileFormat[fileFormat.length - 1]);
    }
})
let upload=Multer({storage:storage})

app.use(router.routes())
app.use(router.allowedMethods())

router.get("/api/userInfo",async ctx=>{
    ctx.body={
        name:"sean",
        age:20
    }
})

router.post("/api/upload",upload.fields([{name:"file"}]),async ctx=>{
    console.log("ctx.req:",ctx.req)
    ctx.body={
       msg:"上传成功"
    }
})

app.listen(3000,()=>{
    console.log("监听成功")
})

特别注意:upload.fields的写法此处应该为一个数组。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值