当前位置:   article > 正文

微信小程序-图片上传_小程序上传图片接口

小程序上传图片接口

微信小程序有原生的API接口,来进行图片的选取、上传

wx.chooseImage(Object object) | 微信开放文档 (qq.com)icon-default.png?t=L892https://developers.weixin.qq.com/miniprogram/dev/api/media/image/wx.chooseImage.htmlUploadTask | 微信开放文档 (qq.com)icon-default.png?t=L892https://developers.weixin.qq.com/miniprogram/dev/api/network/upload/wx.uploadFile.html想要通过微信小程序来上传图片,需要先去看一下微信官网文档里的这两个API

wxml文件中

  1. <!-- 添加图片按钮 -->
  2. <button bindtap="handleChooseImg">+</button>

 放一个按钮,用户点击时,就调用方法来使用 wx.chooseImage API来选取图片(当然可以不用按钮,或者设置样式弄的好看些)比如改成:这种样式

 js文件中

  1. handleChooseImg () {
  2. //!调用小程序内置的选择图片API,会返回选择图片的本地路径 http开头的一个url,可以配合wx.uploadFile 进行上传到自己的服务器
  3. wx.chooseImage({
  4. // 同时选中的图片的数量
  5. count: 9,
  6. // 图片的格式 原图 压缩
  7. sizeType: ['original', 'compressed'],
  8. // 图片的来源 相册 照相机
  9. sourceType: ['album', 'camera'],
  10. success: (result) => {
  11. console.log(result);
  12. this.setData({
  13. // 图片数组 在原有选择的图片数组中,进行拼接,不要直接进行覆盖
  14. // ...this.data.chooseImgs ==> 展开已经选择的图片的数据
  15. // ...result.tempFilePaths ==> 拼接返回的新数据
  16. chooseImgs: [...this.data.chooseImgs, ...result.tempFilePaths]
  17. })
  18. }
  19. });
  20. },

 既然有选择图片,那就要有显示图片的地方,所以,要将 wx.chooseImage方法返回的本地虚拟路径渲染到页面上做预览。

  1. <!-- 添加图片按钮 -->
  2. <button bindtap="handleChooseImg">+</button>
  3. <!-- 选择的图片预览区域 -->
  4. <!-- bindtap="handleRemoveImg" ==》 点击该图时删除它 -->
  5. <view class="up_img_item" wx:for="{{chooseImgs}}" wx:key="*this" bindtap="handleRemoveImg"
  6. data-index="{{index}}">
  7. <image src="{{item.src}}"></image>
  8. <!-- 右上角的叉叉图标,通过绝对定位实现 -->
  9. <icon type="clear" size="23" color="red"></icon>
  10. <!-- 上传图片组件 -->
  11. <UpImg src="{{item}}"></UpImg>
  12. </view>
  13. <button bindtap="handleFormSubmit" type="warn">
  14. 提交表单(包括图片、文本)
  15. </button>

效果如下:(一些wxss样式没有放上来,参考黑马的微信小程序教程,b站有视频) 

 

 js部分完成代码:

  1. // 引入封装的请求方法request
  2. import { cjRequest } from "../../utils/service";
  3. Page({
  4. /**
  5. * 页面的初始数据
  6. */
  7. data: {
  8. // 被选中的图片路径 数组
  9. chooseImgs: [],
  10. // 文本域的内容
  11. textVal: ""
  12. },
  13. // 外网的图片的路径数组(图片上传成功后,后台返回的外网地址,再和文本一起提交给后台存储)
  14. UpLoadImgs: [],
  15. // 点击 “+” 选择图片
  16. handleChooseImg () {
  17. //!调用小程序内置的选择图片API,会返回选择图片的本地路径 http开头的一个url,可以配合wx.uploadFile 进行上传到自己的服务器
  18. wx.chooseImage({
  19. // 同时选中的图片的数量
  20. count: 9,
  21. // 图片的格式 原图 压缩
  22. sizeType: ['original', 'compressed'],
  23. // 图片的来源 相册 照相机
  24. sourceType: ['album', 'camera'],
  25. success: (result) => {
  26. console.log(result);
  27. this.setData({
  28. // 图片数组 在原有选择的图片数组中,进行拼接,不要直接进行覆盖
  29. // ...this.data.chooseImgs ==> 展开已经选择的图片的数据
  30. // ...result.tempFilePaths ==> 拼接返回的新数据
  31. chooseImgs: [...this.data.chooseImgs, ...result.tempFilePaths]
  32. })
  33. }
  34. });
  35. },
  36. // 删除指定图片
  37. handleRemoveImg (e) {
  38. // 2 获取被点击的组件的索引
  39. const { index } = e.currentTarget.dataset;
  40. // 3 获取data中的图片数组
  41. let { chooseImgs } = this.data;
  42. // 4 删除数组中指定位置的元素
  43. chooseImgs.splice(index, 1);
  44. // 重新设置会data中去
  45. this.setData({
  46. chooseImgs
  47. })
  48. },
  49. // 提交按钮的点击,提交图片外网地址和文本内容
  50. handleFormSubmit () {
  51. // 1 获取文本域的内容、本地的图片数组url
  52. const { textVal, chooseImgs } = this.data;
  53. // 2 合法性的验证,如果文本框中没有文本内容,提示不合法,不上传
  54. if (!textVal.trim()) {
  55. // 不合法
  56. wx.showToast({
  57. title: '输入不合法',
  58. icon: 'none',
  59. mask: true
  60. });
  61. return;
  62. }
  63. // 显示loading效果,上传完成后关闭此效果
  64. wx.showLoading({
  65. title: "正在上传中",
  66. mask: true
  67. });
  68. // 判断有没有需要上传的图片数组,图片数组有值,就开始上传图片,没有就是直接发送文本给后端接口
  69. if (chooseImgs.length != 0) {
  70. /**
  71. *! wx.uploadFile这个上传图片的方法,每次只能够上传一张图片【filePath 这个字段的值没法是数组,只能是字符串】
  72. *! 所以:想要上传多张图片,就得循环遍历wx.chooseImage方法返回的本地图片url数组,一个个调用wx.uploadFile去上传图片
  73. *? 然后拿到每一张图片后台返回的 【外网地址】,整理后再和其他文本内容一起上传给后端
  74. */
  75. chooseImgs.forEach((v, i) => {
  76. wx.uploadFile({
  77. //! 图片要上传到的后端接口url,会返回图片的外网url
  78. url: 'xxxx',
  79. // 被上传的文件的路径url
  80. filePath: v,
  81. // 上传的文件的名称 后台来获取文件
  82. name: "file",
  83. // 顺带的文本信息
  84. formData: {},
  85. success: (result) => {
  86. console.log(result);
  87. // 拿到这张图片上传成功后返回的外网地址url
  88. let url = JSON.parse(result.data).url;
  89. // 把外网图片地址存入一个数组中,准备给后面上传整个表单使用
  90. this.UpLoadImgs.push(url);
  91. // 循环要上传的图片数组完成后,再去发送提交整个表单的请求
  92. if (i === chooseImgs.length - 1) {
  93. // 所有的图片都上传完毕了才触发 ,隐藏loading效果
  94. wx.hideLoading();
  95. // 把文本的内容和外网的图片数组 提交到后台中
  96. cjReques({ url: 'xxx', data: '包含外网图片地址数组、表单数据' }).then(() => {
  97. // 提交都成功了,重置页面内容,全部清空
  98. this.setData({
  99. textVal: "",
  100. chooseImgs: []
  101. })
  102. // 返回上一个页面
  103. wx.navigateBack({
  104. delta: 1
  105. });
  106. })
  107. }
  108. }
  109. });
  110. })
  111. }
  112. // 如果没有要上传的图片,直接上传文本
  113. else {
  114. console.log("只是提交了文本");
  115. wx.hideLoading();
  116. cjReques({ url: 'xxx', data: '表单数据' }).then(() => {
  117. wx.navigateBack({
  118. delta: 1
  119. });
  120. })
  121. }
  122. }
  123. })

 其中通过wx.chooseImage选择图片后,再通过forEach循环遍历返回的本地图片地址数组,依次触发wx.uploadFile,将图片上传给后端,返回外网地址url,最后,再将外网图片地址数组、文本数据,一起提交给后台。

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

闽ICP备14008679号