位置: IT常识 - 正文

前端如何用form-data方式上传图片js(前端如何用canvas绘制座位图)

编辑:rootadmin
前端如何用form-data方式上传图片js 1.场景

推荐整理分享前端如何用form-data方式上传图片js(前端如何用canvas绘制座位图),希望有所帮助,仅作参考,欢迎阅读内容。

文章相关热门搜索词:前端如何用组件化的思想开发表单,前端如何用js控制class类名的切换,前端如何用组件化的思想开发表单,前端如何用pagehelper分页,前端如何用js控制class类名的切换,前端如何用scss做切换主题,前端如何用scss做切换主题,前端如何用for还有数组如何控制输出图片的个数,内容如对您有帮助,希望把文章链接给更多的朋友!

工作场景中,需要一个上传图片的功能 效果如下

PC端

 mob端

2.业务逻辑

PC端和Mob端最多可以上传3张照片 每张大小不超过3M 格式支持bmp,gif,jpg,png,jpeg PC端上传的图片会展示在添加图片按钮和上传图片文案描述中间 mob端默认是一个添加图片的图 如果上传了图片 会出现在添加图片这张图之前 上传到第三张的时候 添加图片这张图就隐藏掉了 当前行显示3张正方形的上传图。 PC和Mob端每一个上传好的图上面都有一个x按钮 点击x可以删除掉上传的图片 并且这个块是封装成了组件 组件复用在了查看详情页 如果是查看详情 进入这个组件 我这里会传递进来一个resonDisabled 让input框隐藏掉 只能查看当前内容 不能点击上传 代码里的:class="{ 'component-order-return-detail__apply-about-hidden': resonDisabled }"就是控制input隐藏的

3.前后端约定前端如何用form-data方式上传图片js(前端如何用canvas绘制座位图)

form-data方式上传 key value格式 上传 这里的baseUrl就是接口的请求地址公共url 做了全局配置而已 可以忽略 这个截图主要看传参格式

4.css部分代码

css实现中 先写了个父元素 包含input和上面的上传图片按钮 父元素 position:relative;子元素 position:absolute;input大小和上面的添加图片按钮大小一致  然后设置了opacity: 0;并且input的z-index层级设置的高一点 透明的浮在按钮之上

layout-mobile-only 是手机端的样式适配 

layout-desktop 是PC端的样式适配

layout-responsive 是手机端和PC端分别是什么样式

如果需要写单端 可以手动把这些代码分离出来

这里写的有点多哈 大家可以不看这块 只看js业务逻辑部分 这里思路上面已经写出来了 业务逻辑也不一定一致 大家按照思路自己写就好

<!-- 上传图片按钮相关代码 --><div class="component-order-return-detail__apply-about-outer"> <div class="component-order-return-detail__apply-about-reason">图片信息</div> <div class="component-order-return-detail__apply-about-position layout-desktop-only"> <div class="component-order-return-detail__apply-about-upload">+ 添加图片</div> <input class="component-order-return-detail__apply-about-file component-order-return-detail__apply-about-upload" :class="{ 'component-order-return-detail__apply-about-hidden': resonDisabled }" type="file" multiple accept="image/png,image/jpeg,image/jpg,image/gif,image/bmp" @change="uploadApplyImage" /> </div></div><!-- PC端展示上传的图相关代码 以及mob端展示默认上传按钮以及上传图片以后 不够3张 默认图片往后推移相关逻辑 --><div v-if="showUploadImage" class="component-order-return-detail__apply-about-static"> <div v-for="(item, index) of returnImageInfo" :key="index" class="component-order-return-detail__apply-about-static-outer"> <img class="component-order-return-detail__apply-about-img" :src="item.url" alt="" /> <svg-icon name="icon-delete-img" class="component-order-return-detail__delete-svg" @click="deleteImage"></svg-icon> </div> <img v-if="returnImageInfo.length < 3" class="component-order-return-detail__apply-about-img" :src="addMobileImage" alt="" /></div><style lang="scss"> $MQMobile: 1024px !default; @mixin layout-mobile-only { @media (max-width: calc(#{$MQMobile - 1px})) { @content; } } @mixin layout-desktop { @media (min-width: $MQMobile) { @content; } } // RESPONSIVE @mixin layout-responsive($property, $mobile: null, $desktop: null, $lage-desktop: null) { @if ($mobile) { @include layout-mobile { #{$property}: $mobile; } } @if ($desktop) { @include layout-desktop { #{$property}: $desktop; } } } .component-order-return-detail__apply-about-outer { width: 100%; @include layout-desktop { display: flex; align-items: center; } .block-input { @include layout-mobile-only { background-color: transparent !important; } } @include layout-responsive(margin-top, vw(24), 26px); .component-order-return-detail__apply-about-reason { @include layout-responsive(width, 100%, 100px); @include layout-mobile-only { margin-bottom: vw(6); } @include layout-desktop { margin-right: 49px; } } .component-order-return-detail__reason-red { color: red; } .component-order-return-detail__apply-about-input { color: #888; @include layout-responsive(font-size, vw(13), 13px); @include layout-responsive(width, 100%, 335px); @include layout-responsive(height, vw(36), 36px); .block-input { color: #888; } .is-black { border-color: #c0c0c0 !important; } } .component-order-return-detail__apply-about-textarea { box-sizing: border-box; color: #888; @include layout-responsive(width, 100%, 642px); @include layout-responsive(height, vw(100), 117px); @include layout-responsive(line-height, vw(20), 20px); @include layout-responsive(padding, vw(9) vw(5), 8px 11px); } .component-order-return-detail__apply-about-position { position: relative; width: 335px; height: 36px; .component-order-return-detail__apply-about-hidden { display: none !important; } .component-order-return-detail__apply-about-file { position: absolute; z-index: 9; opacity: 0; } .component-order-return-detail__apply-about-upload { @include layout-desktop { position: absolute; width: 335px; height: 36px; display: flex; align-items: center; justify-content: center; color: #888; font-size: 13px; border: 1px solid #c0c0c0; } } } }</style>

样式基本上就写好了

5.js部分代码

下面是js部分逻辑 看起来内容有点多 但是注释的很详细 可以耐心看一下 按需贴到自己代码中直接使用 这里的axios是我单独自己写进去的 原项目中 是有封装的 避免看起来麻烦 改写了 如果不小心有问题 大家改一下哈

// 上传图片 点击input的时候 获取到图片信息 uploadApplyImage(e) {const files = e.target.files// 如果获取到了上传的内容 才进行以下业务逻辑操作if (files && files.length > 0) {// 如果上传多个图片或者文件 对其进行循环 对每个文件的格式都进行校验for (let i = 0; i < files.length; i++) {const file = files[i]// 对支持上传的图片格式 进行判断if (!/\.(jpg|jpeg|png|bmp|gif|JPG|PNG|BMP|GIF)$/.test(file.name)) {this.$toast.show('请上传.png /.jpg /.jpeg格式的图片')} else if (file.size > 1024 * 1024 * 3) {// 弹出不满足上传格式的弹窗this.$toast.show('单张图片不可以超过3M,请重新上传')return} else {// 图片超过三张 弹出提示if (this.returnImageInfo.length === 3) { this.setToast('最多可上传3张图片') return}console.log('满足上传条件', file)// 转base64格式 这里约定的格式是key value 直接传file就好 就没用到转base64// const reader = new FileReader()// // 因为这两个组件的fils文件不一样所有一个判断// if (file?.originFileObj) {// reader.readAsDataURL(file.originFileObj)// } else {// reader.readAsDataURL(file)// }// reader.addEventListener('load', () => {// console.log('reader.result', reader.result)// })// 转base64格式结束// 上传图片 form-data方式进行参数序列化 和后端约定的参数是uploadFileconst formData = new FormData()formData.append('uploadFile', file)axios.post('/upload', formData,{headers: { 'Content-Type': 'application/form-data' }}).then(function (response) {// 上传成功 执行对应操作console.log(response);}).catch(function (error) {// 上传失败 执行对应操作console.log(error);});}}}}

好了 就写到这里吧 希望可以对你有帮助~ 如果大家有什么问题 可以私信我 或者我们评论区见 

本文链接地址:https://www.jiuchutong.com/zhishi/283209.html 转载请保留说明!

上一篇:2017年8月21日的一组日食镜头 (© Lindsay Daniels/Tandem Stills + Motion)(2017年8月21日是什么日子)

下一篇:rteng7.exe - rteng7是什么进程 有什么用

  • 论坛发帖之如何寻找论坛资源  (论坛发帖步骤)

    论坛发帖之如何寻找论坛资源  (论坛发帖步骤)

  • opporeno4pro是曲面屏还是直面屏(opporeno4是曲面屏)

    opporeno4pro是曲面屏还是直面屏(opporeno4是曲面屏)

  • 怎样在微信群里踢人(怎样在微信群里转账给某一个人)

    怎样在微信群里踢人(怎样在微信群里转账给某一个人)

  • 苹果耳机突然发出尖锐的声音(苹果耳机突然发出声音)

    苹果耳机突然发出尖锐的声音(苹果耳机突然发出声音)

  • 淘宝退货没吊牌了咋办(淘宝退货没有吊牌)

    淘宝退货没吊牌了咋办(淘宝退货没有吊牌)

  • ppt兼容模式有影响吗

    ppt兼容模式有影响吗

  • beats solo3支持安卓吗(beat solo3可以连安卓手机吗)

    beats solo3支持安卓吗(beat solo3可以连安卓手机吗)

  • 呼叫失败对方设置了什么(呼叫对方显示呼叫失败)

    呼叫失败对方设置了什么(呼叫对方显示呼叫失败)

  • 淘宝直播间买家皇冠怎么来的(淘宝直播间买家被禁言7天)

    淘宝直播间买家皇冠怎么来的(淘宝直播间买家被禁言7天)

  • 苹果换软件的时候音乐就停了(苹果换软件回去就重开)

    苹果换软件的时候音乐就停了(苹果换软件回去就重开)

  • 输入输出控制的功能包括(输入输出控制的功能包括什么)

    输入输出控制的功能包括(输入输出控制的功能包括什么)

  • 微信投票过于频繁 请稍后重试(微信投票过于频繁会怎样)

    微信投票过于频繁 请稍后重试(微信投票过于频繁会怎样)

  • 呼吸灯原理(定时器实现呼吸灯原理)

    呼吸灯原理(定时器实现呼吸灯原理)

  • 拼多多自动扣费是什么意思(拼多多自动扣费如果微信没钱怎么办)

    拼多多自动扣费是什么意思(拼多多自动扣费如果微信没钱怎么办)

  • qq上怎样设置免费字体(qq上怎样设置免密支付)

    qq上怎样设置免费字体(qq上怎样设置免密支付)

  • 苹果xs微信视频怎么美颜(苹果xs微信视频聊天怎么开美颜)

    苹果xs微信视频怎么美颜(苹果xs微信视频聊天怎么开美颜)

  • 荣耀v30pro怎么装卡(华为荣耀v30pro怎么装卡视频)

    荣耀v30pro怎么装卡(华为荣耀v30pro怎么装卡视频)

  • r11充电功率(r11s充电器多少瓦)

    r11充电功率(r11s充电器多少瓦)

  • 微信黑脸表情在哪(微信黑脸表情在哪苹果)

    微信黑脸表情在哪(微信黑脸表情在哪苹果)

  • wpsword怎么查找关键字(wpsword怎么查找替换)

    wpsword怎么查找关键字(wpsword怎么查找替换)

  • qq关注频繁怎么解决(qq关注频繁怎么取消)

    qq关注频繁怎么解决(qq关注频繁怎么取消)

  • ideo充电宝是什么品牌(in充电宝)

    ideo充电宝是什么品牌(in充电宝)

  • 怎么取消笔笔攒(怎么取消笔笔攒自动转入)

    怎么取消笔笔攒(怎么取消笔笔攒自动转入)

  • 驱动人生网卡版怎么用(驱动人生网卡版安装包)

    驱动人生网卡版怎么用(驱动人生网卡版安装包)

  • 【人工智能与深度学习】监督方法的成功故事: 前置训练(人工智能 深度)

    【人工智能与深度学习】监督方法的成功故事: 前置训练(人工智能 深度)

  • 如何用ps填补头发(ps填头发)

    如何用ps填补头发(ps填头发)

  • 房产税的计税依据包含增值税吗
  • 内账采购含税怎么转不含税
  • 小规模转一般纳税人生效时间
  • 取得增值税专用发票要算税吗
  • 承兑汇票丢了如何追回
  • 季节性停工损失属于期间费用吗
  • 增值税专用发票的税率是多少啊
  • 预缴税款附加税怎么弄
  • 小微企业销售额含税吗
  • 买卖投资证券基金怎么进行财税处理?
  • 公司收到保险公司的理赔款怎么做分录
  • 房产税先征后免会计处理
  • 收不到租金怎么解除合同
  • 分公司开票信息
  • 小规模纳税人申报表怎么填
  • 无法收回的账务处理
  • Mac SIP系统完整性保护开启及关闭的方法介绍
  • 高新企业政府补贴怎么入账
  • php教程全集
  • php模拟表单提交
  • 固定资产明细账登记
  • vue3响应式丢失
  • php动态变量
  • win10系统安装配置
  • php 文件系统
  • vue watcher
  • ci框架视频教程
  • rm 删除某个文件
  • 保理属于什么行业分类
  • java开发从入门到精通
  • 外贸企业申报出口退税资料
  • mysql自连接查询各个部门经理的工资
  • python中如何创建文件
  • mysql导出结果
  • python里int函数
  • 织梦建站详细教程
  • 矿产资源补偿费属于管理费用吗
  • 冲销以前年度费用会计分录
  • 股东向公司借款超过一年不还
  • 勾选了不抵扣还能抵扣
  • 应付职工薪酬借方表示什么
  • 印花税征收范围口诀
  • 动迁补偿金
  • 旅客运输进项抵扣加计扣除怎么算
  • 收据可以做收入吗?
  • 固定资产报废会计科目处理
  • 股东以货币出资的 应当将货币足额存入
  • 车辆报废如何进行
  • 离线发票累计金额是多少
  • 从事股权投资业务的企业业务招待费
  • 票据利率定价调整方案
  • 外经证核销反馈表写错了怎么办
  • 支付厂房租赁费现金流
  • 注册公司的流程及费用标准
  • 母子公司往来款是否涉及交税
  • 本年利润有余额么
  • sql拆分函数
  • win8.1怎么样
  • Window7+CentOS 6.5双系统安装图文方法
  • 文件夹隐藏属性怎么弄
  • 打开优酷视频播放
  • ubuntu16安装vnc
  • win10系统怎么找到我的电脑
  • myminer.exe是什么
  • win8怎么设置开始
  • win 7关闭睡眠
  • android item属性
  • Interlnk、Intersvr、Qbasic命令的使用方法
  • python多核并行处理
  • perl运行环境
  • 哈希表rehash
  • unity3d技术介绍
  • 怎么用bootstrap搭建网站
  • ubuntu如何下载
  • canvas的原理
  • jquer选择器
  • 广西地税局局长
  • 专票增额怎么办手续
  • 电子发票怎么看有没有重复报销
  • 沥青进口需要配额吗
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

    网站地图: 企业信息 工商信息 财税知识 网络常识 编程技术

    友情链接: 武汉网站建设