uniapp实现表单提交带图片上传 在做表单提交的时候,我们可能面临有图片上传,放在原生的html就好解决,form标签加上

enctype=“multipart/form-data”
uniapp微信小程序
1.原图
在这里插入图片描述
在这里插入图片描述
页面部分

<form :model="data" @submit="submit" @reset=""><view class="top bgbai u-m-t-30" :class="{disabled: !isaction && data.renz.id}"><view class="u-flex item"><view class="left required">公司全称</view><input type="text" placeholder-class="line" v-model="data.renz.name" placeholder="请填写公司全称" /></view><view class="u-flex item"><view class="left required">纳税人识别号</view><input type="number" maxlength="20" placeholder-class="line" v-model="data.renz.ident" placeholder="请填写纳税人识别号" /></view><view class="u-flex item"><view class="left required">公司地址</view><input type="text" class="u-flex-1" v-model="data.renz.code1" placeholder-class="line" placeholder="请填写公司地址" /></view><view class="u-flex item"><view class="left required">公司电话</view><input type="text" placeholder-class="line" v-model="data.renz.phone" placeholder="请填写公司电话" /></view><view class="u-flex item"><view class="left required">开户行</view><input type="text" placeholder-class="line" v-model="data.renz.khyh" placeholder="请填写开户行" /></view><view class="u-flex item"><view class="left required">开户行账户</view><input type="text" placeholder-class="line" v-model="data.renz.khhuser" placeholder="请填写开户行账户" /></view> <view class="item permit u-flex-col"><view class="left u-m-b-15 required">营业执照:</view><view><view class="yingyezhizhao" @click="zhizhaoFile"><image :src="tempAvatar ? tempAvatar : Img" mode="aspectFit"></image><view class="mycolse" v-show="isdel" @click.stop="removeTemp"><u-icon name="close-circle-fill" size="46" color="#000000"></u-icon></view></view></view></view><view class="filetip xsize">只支持中国大陆工商局或市场监督管理局颁发的工商营业执照,且必须在有效期内, 请格式要求:原件照片,扫描件或者加盖公章的复印件,支持.jpg.jpeg.gif.png 格式照片大小不超过2M上传最新的营业执照。</view><view class="u-flex-col item permit"><view class="left u-m-b-15">经营范围:</view><textarea class="fwtextarea"v-model="data.renz.fanwei"placeholder="一般经营范围"placeholder-class="line" maxlength="200"/></view><view class="checkAddress between u-font-28 u-m-t-30" @click="setmrAddress"><text class="checkTxt">是否与默认收货地址一致</text><text class="goTo">点击前往>></text></view><view class="bgbai drawer" :class="{disabled: !isaction && data.renz.id}"><view class="u-flex item"><view class="left required">收票人姓名</view><input type="text" placeholder-class="line" v-model="data.userc.shname" placeholder="请填写收票人姓名" /></view><view class="u-flex item"><view class="left required">收票人手机</view><input type="text" placeholder-class="line" v-model="data.userc.tel" placeholder="请填写收票人手机" /></view><view class="u-flex item" @tap="showgcsPicker"><view class="left required">收票人省份</view><input type="text" placeholder-class="line" v-model="data.userc.provice" disabled class="u-flex-1" placeholder="选择省/市/区" /><text class="mix-icon icon-you"></text></view><view class="u-flex item"><view class="left required">详细地址</view><input type="text" placeholder-class="line" v-model="data.userc.address" placeholder="街道、楼牌号等" /></view><view class="btn-wrap center u-flex-col u-m-t-50" v-show="!data.renz.id || isaction"><u-button class="btn center" :custom-style="btnSytle" hover-class="none" shape="circle" @click="submit">提交</u-button></view></view></form>

js部分

<script>
import {checkStr, checkAddressCode, orgcodevalidate} from '@/common/js/util'
export default {data(){return {data: {renz: {name: '',ident: '',code1: '',phone: '',khyh: '',khhuser: '',fanwei: ''},userc: {shname: '',tel: '',provice: '',address: ''}},show: false,imgaction: 'index.php?m=Wxapi&c=User&a=engineer',CDN: this.CDN,stateArr:['审核中','审核完成','工程商认证审核未通过'],colorArr:['#ff0000','#08bb71','#999999'],isaction: false,isdel: false,btnSytle: {width: '100%',height: '80rpx',fontSize: '32rpx',borderRadius: '40rpx',color: '#fff',backgroundColor: 'transparent',backgroundImage: 'linear-gradient(to left, rgb(250, 176, 34) ,#f83600)'},tempAvatar: '',Img: '/static/icon/cream.png',filesize: 0,isModel: false  //是否显示模态框}},methods: {// 上传营业执照zhizhaoFile(){let that = this;uni.chooseImage({count: 1,sizeType: 'original',  //指定原图success: res=> {that.filesize = res.tempFiles[0].size/1024/1024;  //转换MBif(that.filesize > 1){that.$util.msg('上传文件大小不能超过1MB');return;}that.tempAvatar = res.tempFilePaths[0];},error: err=>{console.log(err)}})},// 提交认证submit(){const userid = uni.getStorageSync('uniIdToken') || 0;if(userid <= 0){this.$util.msg('请先登录!');return;}const datas = this.data.renz;const userdata = this.data.userc;if(!datas.name){this.$util.msg('请输入公司全称');return;}if(datas.ident){if(!checkStr(datas.ident, 'zzsnsno')){this.$util.msg('纳税人识别号位数限制为15、18、20位,请检查');return;}else{let addressCode = datas.ident.substring(0,6);let ischeck = checkAddressCode(addressCode);if(!ischeck){this.$util.msg('请输入正确的纳税人识别号 (地址码)');return;}else{// 校验组织机构代码let orgCode = datas.ident.substring(6, 9);let istrue = orgcodevalidate(orgCode);if(!istrue){this.$util.msg('请输入正确的纳税人识别号 (组织机构代码)');return;}}}}else{this.$util.msg('请输入纳税人识别号');return;}if(!datas.code1){this.$util.msg('请输入公司地址');return;}if(!datas.phone){this.$util.msg('请输入公司电话');return;}if(datas.khyh){if(!checkStr(datas.khyh, 'chinese')){this.$util.msg('开户行须为中文');return;}}else{this.$util.msg('请输入开户行');return;}if(datas.khhuser){if(!checkStr(datas.khhuser, 'number')){this.$util.msg('开户行账户格式错误');return;}}else{this.$util.msg('请输入开户行账户');return;}if(this.tempAvatar){if(this.filesize > 1){this.$util.msg('上传文件大小不能超过1MB');return;}}else{this.$util.msg('请上传营业执照');return;}if(!userdata.shname){this.$util.msg('请输入收票人姓名');return;}if(userdata.tel){if(!checkStr(userdata.tel, 'mobile')){this.$util.msg('手机号码格式错误');return;}}else{this.$util.msg('请输入收票人手机号码');return;}if(!userdata.provice){this.$util.msg('请选择地区');return;}if(!userdata.address){this.$util.msg('请输入详细地址');return;}var obj = Object.assign(datas,userdata);obj = JSON.parse(JSON.stringify(obj));obj.uid = userid;// obj.shname = userdata.name;uni.showLoading({title: '提交中...',mask: true})if(this.tempAvatar === this.CDN + this.data.renz.pic1){// 旧图片未修改this.oldUpload(obj);}else{// 重新上传图片this.yesUpload(obj);}},// 旧图片未改调用async oldUpload(data){const res = await this.$request.post(this.imgaction,data);if(res.status === 200){uni.hideLoading();this.$util.msg(res.msg);this.isaction = this.isdel = false;if(res.data.renz){this.data.renz = res.data.renz;this.data.renz.khyh = res.hang;this.data.renz.khhuser = res.hangzh;}if(res.data.userc){this.data.userc = res.data.userc;this.data.userc.shname = res.data.userc.name;delete res.data.userc.name;}}else{uni.hideLoading();this.$util.msg(res.msg);return;}},//重新上传图片调此方法yesUpload(data){uni.uploadFile({url: this.CDN + this.imgaction,filePath: this.tempAvatar,name: 'pic1',formData: data,  //顺带整个表单对象传给服务端success: (res) => {const resultData = JSON.parse(res.data)if(resultData.status === 200){uni.hideLoading();this.$util.msg(resultData.msg);this.isaction = this.isdel = false;if(resultData.data.renz){this.data.renz = resultData.data.renz;this.data.renz.khyh = resultData.hang;this.data.renz.khhuser = resultData.hangzh;}if(resultData.data.userc){this.data.userc = resultData.data.userc;this.data.userc.shname = resultData.data.userc.name;delete resultData.data.userc.name;}}else{uni.hideLoading();this.$util.msg(resultData.msg);return;}}})}}
}

后端
在这里插入图片描述

    /*** 单文件上传(微信小程序只支持单文件上传)** @param file* @return* @throws Exception*/@PostMapping("/filesUpload")public R uploadFile(FormDataReq f, @RequestParam("file") MultipartFile file, @RequestParam(name = "businessType", required = true) String businessType) {return R.ok("文件上传成功!", fileService.uploadPic(file, businessType));}

子组件

<!-- 上传图片 -->
<template><view class='m-upload'><view class="label"><text>{{label}}</text></view><view class="image"><view class="image-list" v-for="item in imageList" :key="item.id"><image v-if="!previewFlag" class="delete" src="/static/upload/delete.png" @click="tapDelete(item.id)"></image><image class="image-data" :src="item.path" mode="aspectFill" @click="tapPreview(item.path)"></image></view><image v-if="!previewFlag" class="upload-btn-icon" src="/static/upload/upload.png"@click="tapUpload(businessType)"></image><!-- 确定上传到服务器 --><button type="primary" @click="submitImg(businessType)">{{businessType}}</button></view></view>
</template><script>export default {props: {label: {type: String,default: '上传图片'},businessType: {type: String,default: '01' //业务类型 01-考勤打卡 02-审批 03-到点留痕},previewFlag: {type: Boolean,default: false //预览模式不显示删除图标和上传图标},//初始显示数据initlist: {type: Array,default: function() {return [];}}},data() {return {imgNum: 0, //一共选中了多少张照片,用来限制本次最大上传数量imageList: [],serverUrl: "http://127.0.0.1:8080/file/filesUpload?businessType=", //要上传的图片的服务器地址}},created() {},//页面渲染完成mounted() {for (let item of this.initlist) {let obj = {...item,}this.imageList.push(obj);}},watch: {initlist(nVal, oVal) {for (let item of nVal) {let obj = {...item,}this.imageList.push(obj);}},},/*** 计算属性*/computed: {},methods: {tapDelete(id) {let that = this;//console.log(`删除${id}`);//先移除显示的图片,在删除服务器端的图片let images = that.imageList;let indexImage = images.findIndex(n => n.id == id);if (indexImage != -1) {that.imageList.splice(indexImage, 1); //删除当前数组对象//调用接口,删除图片console.log('删除图片', id);that.$emit('myEvent', that.imageList)}},tapPreview(path) {console.log(`当前图片${path}`);let images = [];for (let item of this.imageList) {images.push(item.path);}// 预览图片uni.previewImage({current: path,urls: images,indicator: 'default',loop: true,});},tapUpload() {let that = this;uni.chooseMessageFile({count: 9, //默认9sizeType: ['compressed'], //可以指定是原图还是压缩图,默认二者都有success: function(res) {// 遍历要上传的图片临时地址,进行上传for (let item of res.tempFiles) {that.imageList.push({path: item.path,})// 判断本次最多上传多少照片that.imgNum++;if (that.imgNum > 9) {that.imgNum = 9;uni.showToast({icon: "none",title: "上传的图片最多不能超过9张",});return;}console.log("that.imageList", that.imageList)that.$emit('myEvent', that.imageList)}}});},// 确定上传图片,传到服务器submitImg(businessType) {console.log("businessType->", businessType)let that = this;// let token = uni.getStorageSync(TOKEN_KEY) || ''let token ="eyJhbGciOiJIUzI1NiJ9.eyJtYW5nZUNvbSI6Ijg2MjEiLCJyb2xlS2V5IjoibnFyb2xlIiwiY29tQ29kZSI6Ijg2MjEwMDAwMDAwMDAwMDAxIiwidXNlcklkIjoiemhhbmdzYW4iLCJpYXQiOjE2NTI1MzAyMjIsImV4cCI6MTY1MzczOTgyMn0.F-L-r2f4PkmgBaKkRp1GSo6Jerp-oHDpCr2HI4bdJ-M";// 遍历要上传的图片临时地址,进行上传that.imageList.map((val) => {console.log("val-》", val)uni.uploadFile({url: that.serverUrl + businessType, //服务器地址filePath: val.path, //存在本地要上传的临时图片地址name: "file", //名字可以随便写header: {Authorization: "Bearer " + token,"Content-Type": "multipart/form-data",},formData: {execId: "execId",record: "record2",num: "num3",},success(res) {//上传成功的回调函数console.log(res, "上传成功");uni.showToast({icon: "none",title: "上传成功",});},fail(res) {console.log(res, "上传失败");// that.imageList.splice(indexImage, 1); //删除当前数组对象uni.showToast({icon: "none",title: "上传失败",});},});});},}}
</script><style lang="scss" scoped>.m-upload {.label {padding: 20rpx;background-color: #eeeeee;font-size: 28rpx;font-weight: bold;color: #303133;}.image {display: flex;flex-wrap: wrap;background-color: #FFFFFF;padding: 20rpx;.image-list {position: relative;.delete {position: absolute;z-index: 10;width: 40rpx;height: 40rpx;top: 0;right: 0;}.image-data {width: 216rpx;height: 216rpx;padding: 10rpx 10rpx 0 10rpx;}// .upload-progress {// 	width: 176rpx;// 	padding: 0 10rpx;// 	position: absolute;// 	z-index: 20;// 	height: 20rpx;// 	left: 20rpx;// 	bottom: 140rpx;// }// .upload-mask {// 	position: absolute;// 	z-index: 19;// 	width: 216rpx;// 	height: 216rpx;// 	top: 10rpx;// 	left: 10rpx;// 	background-color: #000000;// 	opacity: 0.6;// }}.upload-btn-icon {width: 216rpx;height: 216rpx;padding: 10rpx 10rpx 0 10rpx;}}}
</style>

父组件

<template><view class="page"><m-file-upload @myEvent="getMsg" :label="label" :previewFlag="previewFlag" :initlist="list":businessType="businessType"></m-file-upload></view>
</template><script>export default {data() {return {previewFlag: false, //是否属于预览模式 true-预览模式 false-上传模式label: '上传图片',businessType: '02', //业务类型 01-考勤打卡 02-审批 03-到点留痕list: [{id: 1,path: 'http://localhost:8080/f/20220514154136.png',businessType: '01' //业务类型 01-考勤打卡 02-审批 03-到点留痕},{id: 2,path: 'http://localhost:8080/f/20220514154235.png',businessType: '02' //业务类型 01-考勤打卡 02-审批 03-到点留痕},{id: 3,path: 'http://localhost:8080/f/20220514154638.png',businessType: '03' //业务类型 01-考勤打卡 02-审批 03-到点留痕}],}},onLoad() {},methods: {getMsg(res) {console.log("res",res)}}}
</script><style scoped></style>

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/515651.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

灵魂拷问:a = 1 + 2 究竟是怎么被 CPU 执行的

来源 | 小林coding作者 | 小林coding头图 | 下载于视觉中国代码写了那么多&#xff0c;你知道 a 1 2 这条代码是怎么被 CPU 执行的吗&#xff1f;软件用了那么多&#xff0c;你知道软件的 32 位和 64 位之间的区别吗&#xff1f;再来 32 位的操作系统可以运行在 64 位的电脑上…

如何利用全站加速,提升网站性能和用户体验?

随着网络技术的发展&#xff0c;越来越多的应用基于互联网发布&#xff0c;再好的应用&#xff0c;如果打开速度慢&#xff0c;10个用户会有9个用户选择离开&#xff0c;相关统计数据显示&#xff0c;每增加0.1秒的加载延迟&#xff0c;将会导致客户活跃度下降1%。在目前获客成…

最近,老王又Get了CDN的新技能

原文链接 本文为云栖社区原创内容&#xff0c;未经允许不得转载。

线程池 总结

文章目录线程池优点线程池创建参数队列种类同步移交队列有界队列无界队列拒绝策略DiscardPolicyAbortPolicyDiscardOldestPolicyCallerRunsPolicy线程池执行流程线程池类型定长 FixedThreadPool轮询 ScheduledThreadPool缓存 CachedThreadPool单线程 SingleThreadPool线程池优点…

阿里的 RocketMQ 如何让双十一峰值之下0故障

作者 | 愈安来源 | 阿里巴巴中间件头图 | 下载于视觉中国2020 年的双十一交易峰值达到 58.3 W笔/秒&#xff0c;消息中间件 RocketMQ 继续数年 0 故障丝般顺滑地完美支持了整个集团大促的各类业务平稳。相比往年&#xff0c;消息中间件 RocketMQ 发生了以下几个方面的变化&…

OAM深入解读:使用OAM定义与管理Kubernetes内置Workload

作者 | 周正喜 阿里云技术专家 爱好云原生&#xff0c;深度参与 OAM 社区 大家都知道&#xff0c;应用开放模型 Open Application Model&#xff08;OAM&#xff09; 将应用的工作负载&#xff08;Workload&#xff09;分为三种 —— 核心型、标准型和扩展型&#xff0c;这三…

oracle 指定类型和指定位数创建序列号

文章目录一、脚本部分1. 表结构2. 函数二、代码部分2.1. xml2.2. 接口2.3. api接口2.4. api实例2.5. 控制层三、测试3.1. 效果图一、脚本部分 1. 表结构 有注释 -- Create table create table LDMAXNO (NOTYPE VARCHAR2(17) not null,NOLIMIT VARCHAR2(12) not null,MAXNO …

深入解读Flink资源管理机制

作者&#xff1a;宋辛童&#xff08;五藏&#xff09;整理&#xff1a;王文杰&#xff08;Flink 社区志愿者&#xff09; 摘要&#xff1a;本文根据 Apache Flink 系列直播整理而成&#xff0c;由阿里巴巴高级开发工程师宋辛童分享。文章主要从基本概念、当前机制与策略、未来发…

EasyExcel 实现模板导出、模板导入分析功能

文章目录0.POM依赖1.导出模板实现2.导入模板并分析实现3.git源码0.POM依赖 <dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter</artifactId></dependency><dependency>…

金蝶云拿下客户满意度第一,中国SaaS企业觅得“后发先至”良机

本月&#xff0c;全球SaaS行业迎来了开年第一份重磅奖项的揭晓&#xff1a;由国际知名研究机构IDC颁发的SaaS行业全球客户满意度奖&#xff08;CSAT大奖&#xff09;。 该奖项基于IDC SaaSPath针对全球约2000家组织机构中高层的调研&#xff0c;综合30多项客户满意度指标&…

一名创业者浴火涅磐的自白——对话阿里云MVP孙琦

云栖号资讯&#xff1a;【点击查看更多行业资讯】 在这里您可以找到不同行业的第一手的上云资讯&#xff0c;还在等什么&#xff0c;快来&#xff01; 简介&#xff1a; 孙琦喜欢调侃自己为“一个失败的创业者”。跟他聊过之后&#xff0c;我却发现他跟以往的创业者不同&#x…

mysql 指定类型和指定位数创建序列号

文章目录一、脚本部分1. 表结构2. 函数二、代码部分2.1. xml2.2. 接口2.3. api接口2.4. api实例2.5. 控制层三、测试3.1. 效果图一、脚本部分 1. 表结构 有注释 CREATE TABLE ldmaxno (notype varchar(60) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT 号码…

系统架构设计师 - ESB 企业服务总线

文章目录定义功能定义 传统中间件技术和WEB、XML相结合的产物&#xff0c;主要用以异构系统的集成。具备复杂数据的传输能力&#xff0c;支持基于内容的消息路由、过滤&#xff0c;并提供一系列标准的接口。 功能 服务位置透明、 消息路由、 消息增强、 消息格式转换、 传输…

阿里云助力完美日记半年内系统吞吐量提升50倍

阿里云 Redis 直播地址 近年来&#xff0c;完美日记的“小黑钻口红”“动物眼影盘”等爆款彩妆出现在了越来越多女孩子的化妆台上&#xff0c;完美日记&#xff08;Perfect Diary&#xff09;是由逸仙电商在2017年推出的彩妆品牌&#xff0c;凭借着高颜值和性价比&#xff0c;完…

唏嘘!程序员,你的年底KPI完不成的原因找到了!

加班是每个互联网人不愿面对而却又绕不过去的话题&#xff0c;就连面试时“你怎么看待加班”的问题都成了必答题。现在临近年底&#xff0c;大家都在努力冲业绩&#xff0c;期待拿更多的年终奖&#xff0c;回家过个“富足年”。年底冲业绩&#xff0c;势必会增加我们的工作量&a…

阿里云SAG2.0发布,助力企业全球互联

2016年以来&#xff0c;阿里云洛神云网络陆续发布了高速通道、VPN网关、云企业网CEN&#xff08;cloud enterprise network&#xff09;、SAG&#xff08;smart access gateway&#xff09;等混合云网络产品&#xff0c;基于阿里云全球核心网络不断扩展云网络的应用场景&#x…

云原生存储详解:容器存储与K8s存储卷

作者 | 阚俊宝 阿里云技术专家 导读&#xff1a;云原生存储详解系列文章将从云原生存储服务的概念、特点、需求、原理、使用及案例等方面&#xff0c;和大家一起探讨云原生存储技术新的机遇与挑战。本文为该系列文章的第二篇&#xff0c;会对容器存储的相关概念进行讲述&#x…

阿里彻底拆中台了!

作者| Mr.K来源| 技术领导力(ID&#xff1a;jishulingdaoli)头图 | 付费下载于视觉中国老K独家了解到&#xff0c;张勇近期在阿里内网发布文章表示&#xff0c;他对目前阿里的中台并不满意&#xff0c;他直言道&#xff0c;现在阿里的业务发展太慢&#xff0c;要把中台变薄&…

漫画通信:有了它,终于可以放心买买买了

原文链接 本文为云栖社区原创内容&#xff0c;未经允许不得转载。

企业微信小程序~开启线上真机调试模式

文章目录一、概念理解1. 概念简述2. 线上真机调试前提二、线上真机调试流程2.1.开发小程序2.2.上传小程序2.3.补充小程序发布信息2.4.程序提交审核2.5.发布小程序2.6. 企微后台应用关联小程序2.7. 小程序发布流程三、开启调试模式3.1. 扫描二维码3.2. 打开多场景调试3.3. 进入调…