koa踩坑路之–koa的POST请求无法接收数据,upload时候无法接收formdata数据,使用koa-body,完成图片上传

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档


前言

提示:这里可以添加本文要记录的大概内容:

学习图片上传和保存的过程中,发现post过来的FormData数据无法获取,经过漫长的踩坑过程,实现FormData上传图片,学习文档,仅限于共同进步,大神请绕行。


提示:以下是本篇文章正文内容,下面案例可供参考

一、koa-body

使用koa-body解析post数据,实现FormData上传图片

二、使用步骤

1.vue中HelloWorld.vue

vue代码如下(示例):

<template>
  <div class="hello">
    <h1>{{msg}}</h1>
    <el-upload class="avatar-uploader" action="''" :http-request="uploadHeadImg" :show-file-list="false" :before-upload="beforeAvatarUpload">
      <img v-if="imgUrl" :src="imgUrl" class="avatar">
      <i v-else class="el-icon-plus avatar-uploader-icon"></i>
    </el-upload>
  </div>
</template>

<script>
import {  uploadHeadImg } from "@/axios/index";
export default {
  name: "HelloWorld",
  data() {
    return {
      imgUrl: null,
      msg: "活在当下!",
    };
  },
  methods: {
    beforeAvatarUpload(file) {
      const isImage = file.type === "image/jpeg" || "image/png";
      const limitSize = file.size / 1024 / 1024 < 2;

      if (!isImage) {
        this.$message.error("上传头像图片只能是 JPG或png 格式!");
      }
      if (!limitSize) {
        this.$message.error("上传头像图片大小不能超过 2MB!");
      }
      return isImage && limitSize;
    },
    uploadHeadImg(item) {
      let formData = new FormData();
      formData.append("file", item.file);
      uploadHeadImg(formData).then(res=>{
        this.imgUrl = res.data.headImg;
      });
    },
  },
};
</script>
<style scoped>
</style>

2.vue中axios.js

代码如下(示例):

import axios from 'axios';
import { Loading, Message } from 'element-ui';

let urlData = { basicUrl: "http://127.0.0.1:3002" }

let loading;

const instance = axios.create({
  baseURL: urlData.basicUrl,
  timeout: 1000,
  headers: { "X-Requested-With": "XMLHttpRequest" },
  withCredentials: false,
});

// 添加请求拦截器
instance.interceptors.request.use(function (config) {
  // 在发送请求之前做些什么
  loading = Loading.service({
    lock: true, // 是否锁屏
    text: '正在加载...', // 加载动画的文字
    spinner: 'el-icon-loading', // 引入的loading图标
    background: 'rgba(0, 0, 0, 0.3)', // 背景颜色
  })
  return config;
}, function (error) {
  // 对请求错误做些什么
  return Promise.reject(error);
});

// 添加响应拦截器
instance.interceptors.response.use(function (response) {
  loading.close();
  // 对响应数据做点什么
  return response.data;
}, function (error) {
  // 对响应错误做点什么
  return Promise.reject(error);
});

//GET
export function getUserInfoById(id) {
    let params={ id }
  return instance.get('/getUserInfo', { params });
}

//POST
export async function uploadHeadImg(data) {
  return instance.post('/uploadImg', data);
}
export function setUserName(data) {
  return instance.post('/setUserName', data);
}
export default instance;

3.koa中routes.js

代码如下(示例):

import Router from 'koa-router';
const router = new Router();
const uploadImg = async (ctx)=>{
    let headImg = 'http://'+ctx.request.header.host+'/uploads/'+ctx.request.files.file.path.split("\\uploads\\")[1];
    ctx.body = {
        code:200,
        data:{headImg},
        msg:'上传成功'
    };
}
router.post('/uploadImg',uploadImg);

export default router;

3.koa中app.js

代码如下(示例):

import koa from 'koa';
import cors  from 'koa-cors';
import router from './routes/routes.js';
import staticFiles from 'koa-static';
import koaBody from 'koa-body';

import path from 'path';

const __dirname = path.resolve();
const app = new koa();

app.use(cors({ // 指定一个或多个可以跨域的域名
    origin: function (ctx) { return '*'; },
    maxAge: 5, // 指定本次预检请求的有效期,单位为秒。
    credentials: true,  // 是否允许发送Cookie
    allowMethods: ['GET', 'POST', 'PUT', 'DELETE', 'OPTIONS'],  // 设置所允许的HTTP请求方法
    allowHeaders: ['Content-Type', 'Authorization', 'Accept'],  // 设置服务器支持的所有头信息字段
    exposeHeaders: ['WWW-Authenticate', 'Server-Authorization'] // 设置获取其他自定义字段
}))

app.use(koaBody({ 
    multipart: true,
    formidable: {
		uploadDir:  path.join(__dirname, `/public/uploads/`),  //上传文件存储目录
		keepExtensions: true,  //允许保留后缀名
		multipart: true,
	}
})); //解析formdata过来的数据
app.use(router.routes());
app.use(router.allowedMethods());
app.use(staticFiles(__dirname + '/public'));

app.listen('3002');
```。

---

# 总结
踩坑路漫漫长@~@
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Node.js的Web开发中,上传文件一般使用FormData对象来进行处理。当客户端使用FormData对象提交表单数据时,服务器端需要使用中间件解析请求体中的数据koa-body是一个常用的中间件,用于解析请求体的数据。 当使用koa-body中间件解析上传文件的FormData数据时,koa-body会将上传的文件数据解析为一个对象,该对象的结构如下: ``` { files: { fieldname: [ { name: 'filename', path: 'filepath', type: 'filetype', size: filesize, hash: filehash } ] }, fields: { fieldname: fieldvalue } } ``` 其中,files属性代表上传的文件,fields属性代表上传的其他字段数据。fieldname代表上传文件或字段的名称,name代表上传文件的文件名,path代表上传文件的保存路径,type代表上传文件的MIME类型,size代表上传文件的大小,hash代表上传文件的哈希值。 例如,以下是一个上传文件的示例代码: ``` const koaBody = require('koa-body'); const Koa = require('koa'); const app = new Koa(); app.use(koaBody({ multipart: true })); app.use((ctx, next) => { if (ctx.request.method === 'POST' && ctx.request.path === '/upload') { const files = ctx.request.body.files; const fields = ctx.request.body.fields; console.log(files); console.log(fields); ctx.body = 'Upload Success'; } else { ctx.body = 'Hello World'; } }); app.listen(3000); ``` 该示例中,使用koa-body中间件解析上传文件的FormData数据,并在控制台输出解析后的文件和字段数据。当客户端向服务器发送POST请求,上传文件时,服务器会将上传文件的数据解析为files对象。如果上传的数据中包含其他字段数据,那么服务器也会将其解析为fields对象。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值