微信H5页面图片上传避坑指南(vant+vue)

12 篇文章 0 订阅

公司H5项目涉及图片上传,需要在移动端和微信浏览器内部实现上传,浏览器没啥难度,然后微信踩坑。。。

图片上传的坑

首先,一如既往的获取上传文件的参数信息,这里采用formdata数据上传到自家服务器,浏览器没什么问题,能跑通,然后微信浏览器访问不到,报500

使用了vant组件和vue架构
在这里插入图片描述

//结构代码
<!-- 图片上传表单项 -->
          <div class="img-box">
            <div class="add-img-title">请上传照片</div>
            <van-uploader
              id="imgUpload"
              v-model="item.value"
              multiple
              preview-image
              preview-full-image
              :data-url="index"
              @delete="deleteImg"
              :after-read="afterRead"
            >
              <div class="img-upload-box">
                <van-icon name="photograph" />
              </div>
            </van-uploader>
            <div class="add-img-subtitle">
              请上传有关病情的照片,照片仅自己和医生可见
            </div>
          </div>
 
//js代码
	  let that = this;
	  // 此时可以自行将文件上传至服务器
      const forms = new FormData();
      //这里的file表示给后台传的属性名字,这里看接口文档需要传的的属性
      forms.append("file", file.file); // 将上传图片信息放进formdata数据中
      // forms.append("type", "TREAT_IMAGES");
      let type = "TREAT_IMAGES";
      axios
        .post(
          "上传目标服务器域名",
          forms,
          type,
          {
          	//设置请求头信息
            headers: {
              "content-type": "multipart/form-data",
              Authorization: $store.getters.userToken
            }
          }
        )
        .then(res => {
          //do some 上传成功
        })
        .catch(err => {
		  //上传失败
		});

这套逻辑在移动端浏览器莫得问题,结果微信拉闸,查阅一番之后才发现微信环境下要调用微信的接口上传到微信云端后,后台再根据前端传来的图片id去下载。。。真是大写无语。相关微信文档:传送门

解决方法

一、采用微信sdk接口

优点:微信环境下没有兼容问题,简单快速
缺点:只能在微信浏览器下使用,需要判断当前页面环境,微信中浏览器和移动端浏览器上传操作需要两套逻辑

//图片上传页面结构
<!-- 微信图片上传测试项 -->
        <!-- <div class="img-box">
          <div class="add-img-title">请上传照片</div>
		  <template v-for="(item,index) in arrUploadImgs">
			  <img class="img-upload-box" :src="item.url" ></img>
		  </template>
          <div class="img-upload-box" @click="changeImg">
            <van-icon name="photograph" />
          </div>
          <div class="add-img-subtitle">
            请上传有关病情的照片,照片仅自己和医生可见
          </div>
        </div> -->
//js代码
changeImg(e) {
      let that = this;
      // 微信接口
      wx.chooseImage({
        count: 9, // 默认9
        sizeType: ["original", "compressed"], // 可以指定是原图还是压缩图,默认二者都有
        sourceType: ["album", "camera"], // 可以指定来源是相册还是相机,默认二者都有
        success(res) {
          const localId = res.localIds[0];
		  // 获取本地图片接口
          // wx.getLocalImgData({
          //   localId, // 图片的localID
          //   success: function(res) {
          //     var localData = res.localData; // localData是图片的base64数据,可以用 img 标签显示
          //     that.arrUploadImgs.push(localData);
          //   }
          // });
          //选择图片成功,上传到微信图片服务器
          wx.uploadImage({
            localId, // 需要上传的图片的本地ID,由chooseImage接口获得
            isShowProgressTips: 1, // 默认为1,显示进度提示
            success(res) {
              let imgId = res.serverId;
			  //下载已上传图片接口
              /*wx.downloadImage({
                serverId: imgId, // 需要下载的图片的服务器端ID,由 uploadImage 接口获得
                isShowProgressTips: 1, // 默认为1,显示进度提示
                success: function(res) {
                  alert("下载成功");
                  var localId = res.localId; // 返回图片下载后的本地ID
                }
              });*/
            }
          });
        }
      });
    },
//实际上在wx.uploadImage之后我们只需要把图片的serverId传送给后端让后端去获取就可以
二、采用base64格式上传

最终自己采用了base64格式上传解决,可以兼容微信和浏览器的环境

<!-- 图片上传表单项 -->
          <div class="img-box">
            <div class="add-img-title">请上传照片</div>
            <van-uploader
              id="imgUpload"
              v-model="item.value"
              multiple
              preview-image
              preview-full-image
              :data-url="index"
              @delete="deleteImg"
              :after-read="afterRead"
            >
              <div class="img-upload-box">
                <van-icon name="photograph" />
              </div>
            </van-uploader>
            <div class="add-img-subtitle">
              请上传有关病情的照片,照片仅自己和医生可见
            </div>
          </div>
//js代码
afterRead(file) {
      let that = this;
      // 获取上传文件type类型
      let index = file.file.type.indexOf("/");
      let type = file.file.type.substr(index + 1, file.file.type.length);
      //入参
      let param = {
        base64Str: file.content,
        fileType: type,
        saveType: "TREAT_IMAGES"
      };
      //接口上传
      postUploadFileBase64(param)
        .then(res => {
          //do some
        })
        .catch(err => {
          //do some
        });
    },

目前看来是问题解决了,不知道还有没有更优雅的方法,如果有大佬知道欢迎评论区交流,非常感谢!
在这里插入图片描述

样式格式

.img-box {
  padding: 12px 15px;
  background-color: #fff;
}
.add-img-title {
  font-size: 14px;
  color: #646566;
  margin-bottom: 15px;
}
.add-img-subtitle {
  margin-top: 7px;
  color: #323233;
  font-size: 12px;
}
.img-upload-box {
  position: relative;
  height: 80px !important;
  width: 80px !important;
  line-height: 80px !important;
  text-align: center !important;
  background-color: #f9f9f9 !important;
}
  • 2
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
对于在微信浏览器中实现图片上传功能,你可以按照以下步骤进行操作: 1. 首先,你需要在Vue项目中安装相关的依赖。可以使用`npm`或`yarn`命令安装`axios`和`vant`(一个基于Vue的移动端组件库): ```bash npm install axios vant ``` 2. 在你的Vue组件中,引入所需的依赖并创建一个上传图片的方法: ```typescript import axios from 'axios'; import { Toast } from 'vant'; export default { methods: { async uploadImage(event) { try { const imageFile = event.target.files[0]; const formData = new FormData(); formData.append('image', imageFile); // 使用axios发送POST请求上传图片 const response = await axios.post('/api/upload', formData, { headers: { 'Content-Type': 'multipart/form-data' } }); // 处理上传成功的逻辑 Toast.success('图片上传成功'); // 其他处理逻辑... } catch (error) { // 处理上传失败的逻辑 Toast.fail('图片上传失败'); } } } } ``` 3. 在模板中添加一个文件选择器和一个调用上传方法的按钮: ```html <template> <div> <input type="file" accept="image/*" @change="uploadImage"> <button @click="uploadImage">上传图片</button> </div> </template> ``` 4. 根据微信浏览器的限制,我们需要在微信开发者平台中配置域名白名单,确保上传请求能够正常发送和接收。在微信公众号后台,找到“开发-开发设置-服务器域名”,将你的上传接口域名添加到安全域名列表中。 5. 最后,根据你的后端实现,编写一个接收图片并进行处理的API。在示例中,我们使用`/api/upload`作为上传接口的路径。 注意:你需要根据自己的实际情况进行相应的后端处理和配置。 以上是一个简单的示例,可以让你在Vue 3 + TypeScript + Vite技术栈下,在微信浏览器中实现图片上传功能。根据你的具体需求,可能还需要对代码进行相应的修改和优化。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值