当前位置:   article > 正文

uniapp实现图片上传_uniapp上传图片

uniapp上传图片

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

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

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

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

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

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

data部分:

  1. data() {
  2. return {
  3. // 上传默认图片
  4. avatarUrl: '../../static/myCheck/default.png',
  5. // 背景图展示
  6. imgBg: '',
  7. // 背景图预览
  8. imgBgArray: [],
  9. // 背景图路径
  10. imgBgArr: '',
  11. // 上传的背景临时路径
  12. imgBgUrl: '',
  13. // 上传的背景图绝对路径
  14. imgBgArrUrl: '',
  15. }
  16. },

methods部分:

  1. // 选择背景图片
  2. chooseImg() {
  3. const isIosTrue = uni.getStorageSync('IOS_FIRST_CAMERA')
  4. if (this.phoneType === 'ios' && isIosTrue !== 'false') {
  5. // 设为false就代表不是第一次开启相机
  6. uni.setStorageSync('IOS_FIRST_CAMERA', 'false')
  7. }
  8. uni.chooseImage({
  9. sizeType: "compressed",
  10. // 选择图片的数量
  11. count: 1,
  12. success: res => {
  13. // console.log(res.tempFilePaths[0])
  14. this.imgBg = res.tempFilePaths[0]
  15. this.imgBgArray = res.tempFilePaths
  16. this.app_img(0, res)
  17. },
  18. })
  19. },
  20. // 图片压缩
  21. //(这里实际上一开始是要求选择多张图片的,所以将res作为一个数组进行的处理,
  22. // 后期需求变更,写的比较急,就没改,直接给num传了一个0,默认从数组第一个开始,
  23. // 然后通过判断数组的length来直接return掉。)
  24. app_img(num, res) {
  25. let that = this
  26. if (Number(num) === Number(res.tempFiles.length)) {
  27. return
  28. }
  29. let index = res.tempFiles[num].path.lastIndexOf(".")
  30. let img_type = res.tempFiles[num].path.substring(index, res.tempFiles[num].path.length)
  31. let img_yuanshi = res.tempFiles[num].path.substring(0, index)
  32. let d2 = new Date().getTime()
  33. plus.zip.compressImage({
  34. src: res.tempFiles[num].path,
  35. dst: img_yuanshi + d2 + img_type,
  36. quality: 10
  37. }, function(e) {
  38. that.imgBgArr = e.target
  39. that.postImg(that.imgBgArr)
  40. that.app_img(num + 1, res)
  41. })
  42. },
  43. // 删除图片
  44. deleteImg() {
  45. this.imgBg = ''
  46. this.imgBgAr = ''
  47. this.imgBgArrUrl = ''
  48. },
  49. // 点击图片
  50. bindImg() {
  51. if(this.imgBgArray.length !== 0){
  52. console.log(index)
  53. uni.previewImage({
  54. urls: this.imgBgArray,
  55. current: 0
  56. })
  57. }
  58. },
  59. // 上传图片
  60. postImg(imgFilePaths) {
  61. uni.uploadFile({
  62. url: baseUrl.apiUrl + '/xxx/xxx',
  63. filePath: imgFilePaths,
  64. name: 'file',
  65. success: (uploadFileRes) => {
  66. let imgValue = JSON.parse(uploadFileRes.data)
  67. this.imgBgArrUrl = imgValue.data.absoluteUrl
  68. this.imgBgUrl = imgValue.data.url
  69. }
  70. });
  71. },

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/知新_RL/article/detail/190292
推荐阅读
相关标签
  

闽ICP备14008679号