uniapp开发H5和微信小程序上传文件或者图片(使用uni-file-picker扩展组件)和chooseMessageFile报错修复

使用uniapp开发H5和微信小程序时需要考虑兼容性问题

问题===》在开发时由于H5端是由别的同事开发,使用了vant组件,并没有考虑到微信小程序的兼容开发,导致微信小程序出现许多兼容性问题。(Vue3+uniapp+多端开发建议不要使用vant组件,兼容性很差,适用于微信小程序的Vant Weapp版本太低)

解决===》所以我就使用了uniappd的扩展组件uni-file-picker,多端开发兼容性更好。

uni-file-picker 的组件使用说明地址===》链接: uni-file-picker

上传多种图片的情形(最常用)

图片有点糊
在这里插入图片描述
在这里插入图片描述
html代码

<view class="value uploader">
      <uni-file-picker
        limit="9"
        title="最多选择9张图片"
        @select="wxHandleUpload($event, index)"
        @delete="wxDeleteImage($event, index)"
      ></uni-file-picker>
    </view>

script代码

const wxHandleUpload = async (e, index) => {
  e.tempFiles.forEach((item) => {
    wx.uploadFile({
      url: `上传文件至服务器的完整接口`,
      filePath: item.path,
      name: 'file',
      //请求头中添加一些东西
      header: {
        credentials: 'include',
      },
      //上传成功后的逻辑处理
      success(response) {
        const { data } = response
        let res = undefined
        if (data) {
          res = JSON.parse(data)
        }
        if (!detail.value) return
        let pictureRes = detail.value?.indicatorsResVOS[index]?.pictureRes || []
        pictureRes.push(res?.data)
        detail.value.indicatorsResVOS[index].pictureRes = pictureRes
      },
      fail(err) {
        console.log('上传失败', err)
      },
    })
  })
}

上传单个文件的情形,点击上传的文件可以再次选择文件(使用插槽自定义上传文件按钮样式+单选图片或者文件且点击再次选择)

在这里插入图片描述
在这里插入图片描述
再次点击文件就可以重新上传文件(这里有个重点,再次上传时要清除上一次上传的文件,否则就会报错
在这里插入图片描述
html代码

 <uni-file-picker
    ref="upload"
    @select="handleUpload"
    :limit="1"
    file-mediatype="all"
    return-type="object"
  >
    <view class="uploader">
      <text v-if="fileName">{{ fileName }}</text>
      <text v-else>点击上传</text>
      <uni-icons
        class="backIcon"
        type="right"
        size="16"
        color="#1989fa"
      ></uni-icons>
    </view>
  </uni-file-picker>

script代码(**一定要清除上一次上传的文件,否则会报错)

const handleUpload = async (e, index) => {
  const { tempFiles } = e
  uni.uploadFile({
    url: `上传文件至服务器的完整接口`,
    filePath: tempFiles[0].url,
    name: 'file',
    //添加请求头
    header: {
      credentials: 'include',
    },
    success: (response) => {
      fileName.value = tempFiles[0].name
      const { data } = response
      let res = undefined
      if (data) {
        res = JSON.parse(data)
      }
      attachment.value = {
        fileName: res?.data?.name,
        path: res?.data?.path,
      }
      //清除上一次上传的文件
      proxy.$refs.upload.clearFiles()
    },
    fail: (err) => {
      console.log('上传失败', err)
    },
    complete: () => {},
  })
}

注意

这里我使用了$refs来获取uni-file-picker的组件中的方法clearFiles()来清除上一次的文件缓存,如果不清除的话就会报这个错误,并且文件资源管理器都打不开。

errMsg: “chooseMessageFile:fail param count should be larger than 0.”
在这里插入图片描述

<think>嗯,用户的问题是关于在企业微信中使用uni-file-picker组件时点击出现“暂不支持当前功能”的解决方法。首先,我需要回忆一下uni-file-picker的文档相关问题。根据提供的引用,引用[1]提到微信开发者工具的基础库版本问题,引用[2]讨论了不同环境下的参数配置,引用[3]展示了uni-file-picker的基本用法,引用[4]提到存储空间的问题,引用[5]是关于添加水印的。不过用户的问题集中在企业微信环境下的兼容性。 首先,企业微信普通微信小程序的环境可能有差异,特别是企业微信可能使用了不同的API或权限设置。uni-file-picker在某些环境下可能依赖微信的原生API,比如选择文件上传的功能。如果企业微信不支持这些API,或者权限配置不正确,就会导致问题。 接下来,我需要考虑可能的解决方案。根据引用[1]中的例子,调整基础库版本可以解决兼容性问题,但企业微信可能没有这样的设置。可能需要检查企业微信的JS-SDK支持情况,或者是否有特殊的白名单需要配置。另外,引用[2]提到H5微信环境的参数不同,可能需要条件编译来区分环境,比如使用uni-app的条件编译语法,针对企业微信使用不同的上传方式。 另外,权限配置也是一个关键点。企业微信可能需要额外的权限申请,比如访问相册或摄像头的权限,或者在manifest.json中配置相关权限。同时,可能需要使用企业微信的JS-SDK,并通过config接口注入权限验证,确保相关API可用。 还有可能是uni-file-picker组件本身在企业微信中的兼容性问题,这时候可能需要降级uni-app的版本,或者使用其他上传组件,如uni.chooseImage结合自定义上传逻辑,绕过uni-file-picker的限制。 最后,检查运行环境,判断是否在企业微信中,从而动态调整代码逻辑,比如使用uni.getSystemInfo获取环境信息,然后执行不同的上传策略。如果问题依旧,可能需要联系uni-app官方或企业微信技术支持,确认是否存在已知的兼容性问题。</think>根据企业微信环境下使用$uni-file-picker$出现"暂不支持当前功能"的问题,以下是分步解决方案: ### 一、环境适配检查 1. **确认运行环境** 通过`uni.getSystemInfoSync()`获取环境参数,判断是否处于企业微信容器: ```javascript const systemInfo = uni.getSystemInfoSync(); if (systemInfo.environment === 'wxwork') { console.log('当前运行在企业微信环境'); } ``` 2. **基础库版本验证** 虽然企业微信不直接使用微信开发者工具,但需确保: - 企业微信客户端版本 ≥ 3.1.6(2022年后版本支持更多API) - uni-app SDK版本 ≥ 3.4.18[^2] ### 二、权限配置调整 1. **manifest.json配置** 在`uni-app`项目配置中添加企业微信白名单: ```json "mp-weixin" : { "appid" : "your_appid", "requiredBackgroundModes": ["album", "camera"], "permission": { "scope.writePhotosAlbum": { "desc": "需要访问相册保存图片" } } } ``` 2. **企业微信管理端配置** 登录企业微信后台: - 进入「应用管理」→「自建应用」→「API权限」 - 开启`文件上传``相册访问`权限 ### 三、代码层解决方案 1. **条件编译处理** 针对企业微信环境使用特殊处理: ```html <!-- 通用组件 --> <uni-file-picker v-if="!isWxWork" @select="handleSelect"></uni-file-picker> <!-- 企业微信专用 --> <button v-else @click="wxWorkUpload">上传文件</button> ``` 2. **企业微信专用上传** 通过JS-SDK实现文件选择: ```javascript wxWorkUpload() { wx.chooseMessageFile({ count: 1, type: 'file', success: (res) => { const file = res.tempFiles[0]; uni.uploadFile({ url: 'https://your-domain.com/upload', filePath: file.path, name: 'file', formData: { user: 'test' } }); } }); } ``` ### 四、调试技巧 1. **真机调试模式** 在手机端开启企业微信调试: ```shell # 安卓设备 adb shell am start -n com.tencent.wework/com.tencent.wework.debug.DebugActivity # iOS需通过Safari远程调试 ``` 2. **错误捕获增强** 在`uni.onerror`全局捕获异常: ```javascript uni.onerror = function(error) { if (error.message.includes('暂不支持')) { uni.showModal({ content: '检测到环境限制,已启动备用方案', showCancel: false }); this.wxWorkUpload(); } } ``` ### 五、替代方案(兼容性保障) 若上述方案仍不生效,可采用混合方案: ```javascript function universalUpload() { const isH5 = process.env.VUE_APP_PLATFORM === 'h5'; const isWxWork = uni.getSystemInfoSync().environment === 'wxwork'; if (isWxWork) { // 调用企业微信JS-SDK上传 } else if (isH5) { // 使用<input type="file"> } else { // 继续使用uni-file-picker } } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值