我的需求是在表单中,点击添加图片,只能选一张本地图片或拍照一张(数量的设置会在下面提到)。(项目写的很急,效果应该是没什么问题都是测过的,但是代码写不够优雅,我自己都能看出来有很多地方写的太繁琐,之后有空在慢慢改吧)

使用uni.chooseImage()选择图片并在成功的回调中给this.imgBg赋值(this.imgBg是image需要的src),使用plus.zip.compressImage()进行图片压缩给that.imgBgArr赋值(that.imgBgArr是上传给服务器的参数),在成功的回调中使用uni.uploadFile(OBJECT)将本地资源上传到服务器。

后端会解析拿到的图片资源并返回一个临时路径和绝对路径,在成功的回调中给this.imgBgUrl和imgBgArrUrl赋值,最后在提交表单时,将临时路径和绝对路径加到表单接口参数中一起调用接口上传。最后会加一些其他功能函数,比如图片删除(直接给图片赋空字符串),图片预览(调用uni.previewImage(OBJECT)方法)。

PS:关于最后一步,为什么非要先把文件资源上传给服务器,后端再返回一个临时路径和绝对路径,最后再把这两个路径原封不动的传给后端。我最开始也不是很理解为什么明明这两个路径是后端给我的,难道后端自己在往DB里存的时候就不能获取吗。之后和后端的哥们讨论了一下,他的解释是:完全可以做到,但是如果把接受解析上传的图片资源,生成路径,再把路径存到DB中,最后到前端接受到成功的信息,这一套下来用户需要等待大量(可能吧)的时间,所以为了提升用户体验,尽量不要把所有的处理都放在这一次事件里做。

template部分:因为只有一张图片,所以直接用的字符串,如果需要多张,可以用数组做v-for

<!-- 背景图片 -->
<view class="bg-default" v-if="imgBg === ''" @click="chooseImg()"><view class="" style="width: 70rpx; height: 70rpx;"><image class="my_img" :src="avatarUrl"></image></view><view class="text-default">添加背景图片</view>
</view><view class="add_img_view" v-else><view class="add_img_item" @click="bindImg()"><image :src="imgBg"></image><view class="add_close" @click.stop="deleteImg()"><uni-icons type="clear" size="15" color="#4977F9"></uni-icons></view></view>
</view>

data部分:

data() {return {// 上传默认图片avatarUrl: '../../static/myCheck/default.png',// 背景图展示imgBg: '',// 背景图预览imgBgArray: [],// 背景图路径imgBgArr: '',// 上传的背景临时路径imgBgUrl: '',// 上传的背景图绝对路径imgBgArrUrl: '',}
},

methods部分:

// 选择背景图片chooseImg() {const isIosTrue = uni.getStorageSync('IOS_FIRST_CAMERA')if (this.phoneType === 'ios' && isIosTrue !== 'false') {// 设为false就代表不是第一次开启相机uni.setStorageSync('IOS_FIRST_CAMERA', 'false')}uni.chooseImage({sizeType: "compressed",// 选择图片的数量count: 1,success: res => {// console.log(res.tempFilePaths[0])this.imgBg = res.tempFilePaths[0]this.imgBgArray = res.tempFilePathsthis.app_img(0, res)},})},// 图片压缩//(这里实际上一开始是要求选择多张图片的,所以将res作为一个数组进行的处理,// 后期需求变更,写的比较急,就没改,直接给num传了一个0,默认从数组第一个开始,// 然后通过判断数组的length来直接return掉。)app_img(num, res) {let that = thisif (Number(num) === Number(res.tempFiles.length)) {return}let index = res.tempFiles[num].path.lastIndexOf(".")let img_type = res.tempFiles[num].path.substring(index, res.tempFiles[num].path.length)let img_yuanshi = res.tempFiles[num].path.substring(0, index)let d2 = new Date().getTime()plus.zip.compressImage({src: res.tempFiles[num].path,dst: img_yuanshi + d2 + img_type,quality: 10}, function(e) {that.imgBgArr = e.targetthat.postImg(that.imgBgArr)that.app_img(num + 1, res)})},// 删除图片deleteImg() {this.imgBg = ''this.imgBgAr = ''this.imgBgArrUrl = ''},// 点击图片bindImg() {if(this.imgBgArray.length !== 0){console.log(index)uni.previewImage({urls: this.imgBgArray,current: 0})}},
// 上传图片postImg(imgFilePaths) {uni.uploadFile({url: baseUrl.apiUrl + '/xxx/xxx',filePath: imgFilePaths,name: 'file',success: (uploadFileRes) => {let imgValue = JSON.parse(uploadFileRes.data)this.imgBgArrUrl = imgValue.data.absoluteUrlthis.imgBgUrl = imgValue.data.url}});},

uniapp实现图片上传相关推荐

  1. 关于uniapp多图片上传和单图片上传

    记录小知识 uniapp的多图片上传方法和单图片上传方法本质是一样的,无非就是你循环或者祂帮你循环 单图片上传:传递一个需要上传的图片链接 多图片上传:传递一个需要上传的图片组成的数组 单图片方式实现 ...

  2. uniapp uview 图片上传

    <template><view><view class="li-price" @click="toggle('center')"& ...

  3. uniapp实现图片上传和回响配合uview组件

    <template><view class="pageContainer"><!-- 注意,如果需要兼容微信小程序,最好通过setRules方法设置r ...

  4. uniapp 微信小程序开发 图片上传压缩

    uniapp 微信小程序开发 图片上传压缩 安卓上传图片并压缩 思路 全部代码 安卓上传图片并压缩 由于后端接口对图片的大小有限制,所以在上传图片是需要压缩处理: uni.chooseImage({c ...

  5. uniapp 图片上传与展示

    项目场景: uniapp 图片 上传 阿里 OSS 对象存储 需求描述: H5移动端开发中需要用户上传图片头像.身份证件等需求时.需要将图片上传至阿里oss中存储,并且下载到当前页面进行展示. 解决方 ...

  6. uniapp 图片上传 删除

    uniapp我的示例:如下 点击加号图片:选择上传类型:图片或者文件 上传的图片可以删除 这是界面上的一系列操作,接下来我们来看如何代码实现吧 一.界面代码:展示图片 <view class=& ...

  7. uniApp 生成微信小程序图片上传提示 fail url not in domain list 的解决方法

    问题表现: uniApp 生成微信小程序,获取内容程序不报错,但是图片上传提示 fail url not in domain list 错误. 问题分析: 微信小程序:服务器域名配置 每个微信小程序需 ...

  8. uniapp 调用手机相机拍照实现图片上传

    uniapp 调用手机相机拍照实现图片上传 参考资料:https://blog.csdn.net/weixin_46391646/article/details/108450898 调用相机相册 un ...

  9. uni-app知识点整理(5)- 网络请求、数据缓存、图片上传和预览

    目录 一.网络请求 1.1 发送get请求 二.数据缓存 2.1 uni.setStorage(OBJECT) 2.2 uni.setStorageSync(KEY,DATA) 2.3 uni.get ...

最新文章

  1. MurmurHash算法:高运算性能,低碰撞率的hash算法
  2. 倒序查询_mysql大表分页查询翻页优化方案
  3. 一些有趣的三方开源库
  4. 高并发大流量专题---6、独立图片服务器的部署
  5. Android之网络调试adb tcpip
  6. 蓝桥杯51单片机之数码管从点亮到动态时钟的实现【单片机开发初学者必掌握】
  7. 牵手高通的百度是要拿科大讯飞开刀了?
  8. Java集合(List Map)
  9. notepad++查看aspx
  10. 【语音去噪】基于matlab GUI软阈值+硬阈值+软硬折中阈值语音去噪【含Matlab源码 1810期】
  11. 开源字体下载——思源黑体
  12. 魏德米勒端子eplan宏_魏德米勒端子选型图册(完全版).pdf
  13. 贪心 学员 高阶机器学习 魔鬼·训练营
  14. 每周全球科技十大新闻(2021.2.1-2.7)
  15. LapSRN 超分辨率
  16. CodeForces - 140C-New Year Snowmen
  17. Outlook中Skype会议按钮丢失
  18. 关于RF射频 PCB布线心得
  19. 简历解析步骤(第二步)技术与实现(9)博客/主页地址
  20. 网易云课堂数据分析师教程(云盘下载)

热门文章

  1. 数学计算-C语言实现
  2. 上古世纪服务器维护,9月22日临时维护修改会员排队问题服务器扩容公告
  3. 所有服务器显示不兼容,魔兽世界6.0服务器显示不兼容怎么办 服务器显示不兼容解决方法介绍...
  4. oracle11g的生产环境,Oracle11grac生产环境部署详录
  5. Matlab:实现启用混响(附完整源码)
  6. win7电脑关机后鼠标灯还在亮怎么解决
  7. 芯片破壁者(六.上):摩尔定律的一次次“惊险”续命
  8. DirectX学习错误1
  9. 序列化和反序列化刷题记录
  10. 初一年级英语口语测试软件,七年级英语口语测试模拟试题.doc