当前位置: 首页 > news >正文

go-gin-vue3-elementPlus带参手动上传文件

文章目录

    • 一. 总体代码流程
      • 1.1 全局Axios部分样例
      • 1.2 上传业务
    • 二. 后端部分
    • 三. 测试样例


go的mvc层使用gin框架. 总的来说gin的formFile封装的不如springboot的好.获取值有很多的坑. 当然使用axios的formData也有不少坑.现给出较好的解决办法

以下部分仅贴出关键代码

一. 总体代码流程

1.1 全局Axios部分样例

axios前后端网络交互

axios.defaults.headers['Content-Type'] = 'application/json;charset=utf-8'
// 创建axios实例
const service = axios.create({// axios中请求配置有baseURL选项,表示请求URL公共部分baseURL: 'http://127.0.0.1:20139',// 超时timeout: 5000
})export default service;// 不使用service实例.重新创建axios封装上传
export function uploadFiles(url,data={}){return axios({method: "POST",url: 'http://127.0.0.1:20139'+url,transformRequest: [function(data, headers) {// 去除post请求默认的Content-Typedelete headers['Content-Type']return data}],data: data,})
}

1.2 上传业务

关键代码一览.需要留意的是,我使用手动上传,element中before-upload,before-remove失效. 为避免更多问题使用了on-change监听.其中uploadFile参数是element封装的普通对象. file对象被封装在其中的raw属性. 这一点要尤为注意 gin框架不同于springboot. formfile只能读取file类型
在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

    <el-form :inline="true":model="resumeForm"class="demo-form-inline"label-position="right"label-width="100px"><el-row :gutter="20"><el-col :span="6"><el-form-item label="姓名"><el-input v-model="resumeForm.name" placeholder="请输入姓名" clearable/></el-form-item></el-col><el-col :span="6"><el-form-item label="电话"><el-input v-model="resumeForm.phone" placeholder="请输入电话" clearable/></el-form-item></el-col><el-col :span="6"><el-form-item label="邮箱"><el-input v-model="resumeForm.email" placeholder="请输入邮箱" clearable/></el-form-item></el-col></el-row><el-row :gutter="20"><el-col :span="6"><el-form-item label="工作经验"><el-input v-model="resumeForm.experience" placeholder="请输入工作经验" clearable/></el-form-item></el-col><el-col :span="6"><el-form-item label="学历"><el-selectv-model="resumeForm.education"placeholder="请选择学历水平"clearable><el-option label="专科" value="0"/><el-option label="本科" value="1"/><el-option label="研究生" value="2"/><el-option label="博士" value="3"/></el-select></el-form-item></el-col></el-row><el-row><el-col :span="24"><el-form-item label="上传简历"><el-uploadref="recruitRef"class="upload-demo"dragaction="#":auto-upload="false":on-change="handleChange"limit="1"><el-icon class="el-icon--upload"><upload-filled/></el-icon><div class="el-upload__text">拖拽 或 <em>点击上传</em></div><template #tip><div class="el-upload__tip">.pdf 文件大小 ≤ 500kb</div></template></el-upload></el-form-item></el-col></el-row><el-form-item><el-button type="primary" @click="postResumeForm()">投递</el-button></el-form-item></el-form>
const router = useRouter()
const resumeForm = reactive({name: '',phone: '',email: '',experience: '',education: '',position: router.currentRoute.value.params.position
})const recruitRef = ref()
let formData = new FormData()
// 文件改变触发
function handleChange(uploadFile, uploadFiles) {// 文件校验if (!verifyBeforeUpload(uploadFile)) {removeFile()return}console.log(uploadFile)formData.append("file", uploadFile.raw)
}function removeFile() {if (recruitRef.value) {formData = new FormData()recruitRef.value.clearFiles()}
}
// 提交表单
function postResumeForm() {ElMessageBox.confirm('确认提交?提交后仅能修改一次', '提示', {confirmButtonText: "确定",cancelButtonText: "取消",type: "warning"}).then(async () => {if (formData === null || formData === undefined) {ElMessage.info("必须递交简历信息!")return}for (let key in resumeForm) {formData.append(key,resumeForm[key])}let res = await reqPostResumeForm(formData)if (res.code !== 200) {ElMessage.error("简历投递失败")return}await ElMessageBox.alert("简历投递成功! 3-7个工作日内,您将收到回复", '提示', {confirmButtonText: "确认"})removeFile()}).catch((err) => {removeFile()console.log(err)ElMessage.info("简历投递已取消!")})
}

文件校验部分

// 单文件大小校验
function verifyFileSize(file) {if (file) {let fileSize = file.size;let fileMaxSize = 1024 * 500;//500kbif (fileSize > fileMaxSize) {ElMessage.error("文件不能大于500kb!");file.value = "";return false;} else if (fileSize <= 0) {ElMessage.error("文件不能为0kb!");file.value = "";return false;}return true}ElMessage.error("必须传递文件!")return false;}// 校验文件格式和大小
export function verifyBeforeUpload(file) {// 格式const extension = file.name.split('.').pop().toLowerCase();console.log(extension)if (!ACCEPTED_EXTENSIONS.includes(extension)) {ElMessage.error('仅支持 pdf 格式的文件');return false;}// 大小return verifyFileSize(file);
}

请求发送部分

export function reqPostResumeForm(formData){return uploadFiles(jobs.postResumeUrl,formData)
}

二. 后端部分

func PostResume(c *gin.Context) {file, err := c.FormFile("file")if err != nil {panic(fmt.Sprintf("file参数不能为空"))}var resume model.Resumeerr = c.ShouldBind(&resume)if err != nil {panic(fmt.Sprintf("resume获取错误,原因是: %v", err))}log.Printf("%v", file)
}

三. 测试样例

在这里插入图片描述
在这里插入图片描述

相关文章:

  • 谷歌浏览器默认https 怎么关闭
  • VB.NET—窗体引起的乌龙事件
  • CoT: 思路链提示促进大语言模型的多步推理
  • Anemone库
  • JavaEE-部署项目到服务器
  • 11.6FIFO错误,报错与规范复盘(always)
  • java 数据结构 ArrayList源码底层 LinkedList 底层源码 迭代器底层
  • npx 和 npm 区别
  • Redis之Java操作Redis的使用
  • 二十、泛型(1)
  • 高性能计算HPC存储解决方案的特点
  • 专访HuggingFace CTO:开源崛起、创业故事和AI民主化丨智源独家
  • 手撕 实现iou,nms等
  • 听听ChatGPT对IT行业的发展和就业前景的看法
  • Android Studio(列表视图ListView)
  • 4. 路由到控制器 - Laravel从零开始教程
  • Flex布局到底解决了什么问题
  • gops —— Go 程序诊断分析工具
  • JavaScript标准库系列——Math对象和Date对象(二)
  • JavaScript工作原理(五):深入了解WebSockets,HTTP/2和SSE,以及如何选择
  • java多线程
  • Java深入 - 深入理解Java集合
  • js算法-归并排序(merge_sort)
  • js作用域和this的理解
  • LeetCode541. Reverse String II -- 按步长反转字符串
  • Mac转Windows的拯救指南
  • Markdown 语法简单说明
  • PermissionScope Swift4 兼容问题
  • php面试题 汇集2
  • Python进阶细节
  • Redis中的lru算法实现
  • spring cloud gateway 源码解析(4)跨域问题处理
  • uni-app项目数字滚动
  • vue数据传递--我有特殊的实现技巧
  • Webpack入门之遇到的那些坑,系列示例Demo
  • 从地狱到天堂,Node 回调向 async/await 转变
  • 批量截取pdf文件
  • 使用putty远程连接linux
  • 一些css基础学习笔记
  • 智能网联汽车信息安全
  • 阿里云IoT边缘计算助力企业零改造实现远程运维 ...
  • 移动端高清、多屏适配方案
  • # MySQL server 层和存储引擎层是怎么交互数据的?
  • # 执行时间 统计mysql_一文说尽 MySQL 优化原理
  • #在线报价接单​再坚持一下 明天是真的周六.出现货 实单来谈
  • (2)STM32单片机上位机
  • (3)nginx 配置(nginx.conf)
  • (Demo分享)利用原生JavaScript-随机数-实现做一个烟花案例
  • (转)四层和七层负载均衡的区别
  • .dwp和.webpart的区别
  • .equal()和==的区别 怎样判断字符串为空问题: Illegal invoke-super to void nio.file.AccessDeniedException
  • .mkp勒索病毒解密方法|勒索病毒解决|勒索病毒恢复|数据库修复
  • .NET Core使用NPOI导出复杂,美观的Excel详解
  • .NET 常见的偏门问题
  • .net打印*三角形