小程序的 webview 上传附件并下载 及 微信服务号里上传附件并下载(vue项目) [流水账]

前言:

        小程序里的webview用不了小程序api,jssdk也没提供,只能使用 input 上传。

上传:

普通上传:

 <mt-button size="small" type="primary" style="position: relative;">
    上传
    <input
       type="file"
       accept="*"
       class="file_source"
       @change="chooseFile"
     />
  </mt-button>
  // 限制类型        accept="image/gif,image/jpeg,image/jpg,image/png,.rar,.zip,.xls,.xlsx,.doc,.docx,.txt,.pdf,.ppt"


methods: {
    async chooseFile (e) {
      let files = e.target.files

      let test = await this.checkUpload(files)
      if (test) {
        this.uploadFile(files[0])
      }
    },

    checkUpload (files) {
      // 校验格式
      let allowType = ['jpg', 
        'png', 'rar', 'txt', 'zip', 'doc', 'ppt', 'xls', 'xlsx', 'pdf', 'docx', 'gif']
      // 文件后缀
      let testMsg = files[0].name.substring(files[0].name.lastIndexOf('.') + 1)
      const isAllow = allowType.includes(testMsg)
      if (!isAllow) {
        Toast('不支持当前上传文件的格式!')
        return false
      }

      // 校验文件大小
      let defaultsSize = 5
      let isValid = true
      if (files[0].size > defaultsSize * 1024 * 1024) {
        isValid = false
        alert('附件大小不能超过 ${maxSize}MB!')
      }

      return isValid
    },

    uploadFile (file) {
      let that = this
      let reader = new FileReader()

      reader.readAsDataURL(file)

      reader.onloadstart = function () {
        // '正在上传...'
      }

      reader.onloadend = function () {
        try {
          let formData = new FormData()
          formData.append('file', file)

          apiUrl(formData).then((data) => {
            if (!data.isOk || !data.content) {
              alert(data.message || '上传失败')
              return
            }

            that.url = data.content.url
            that.id = data.content.id
          })
        } catch (e) { }
      } 
    }
}  


<style scoped>
     .file_source
      opacity 0
      position absolute
      width 100%
      height 100%
      left 0
      top 0
      z-index 99  
</style>  

vant上传:

<van-uploader
  v-model="statusFileList"
  upload-icon="plus"
  accept="*"
  :max-size="5* 1024 * 1024"
  :show-upload="isShowUpload"
  :before-read="beforeRead"
  :after-read="afterRead"
  @oversize="onOversize"
  @delete="handleDelete"
/>
// accept="image/gif,image/jpeg,image/jpg,image/png,.rar,.zip,.xls,.xlsx,.doc,.docx,.txt,.pdf,.ppt"

data () {
 return {
   statusFileList: [],
   isShowUpload: true    
 }
},

methods: {
   onOversize() {
      this.$toast('文件大小不能超过 5M!');
   },

   beforeRead (file) {
      let allowType = ['jpg', 'png', 'rar', 'txt', 'zip', 'doc', 'ppt', 'xls', 'xlsx', 'pdf', 'docx', 'gif']
      let testMsg = file.name.substring(file.name.lastIndexOf('.') + 1) // 文件后缀

      const isAllow = allowType.includes(testMsg)

      if (!isAllow) {
        this.$toast.fail('不支持当前上传文件的格式!')
        return false
      }
      return true
    },

    afterRead (files) {
      this.setStatusFileList('', 'uploading', '上传中...')

      try {
        this.isShowUpload = false
        let params = new FormData()
        params.append('file', files.file)

        apiUrl(params).then((data) => {
          if (!data.isOk || !data.content) {
            this.setStatusFileList('', 'failed', data.message || '上传失败')
            return
          }

          this.url = data.content.url
          this.id = data.content.id
          this.setStatusFileList(data.content.url, 'done', '')
        })
      } catch (e) {
        this.setStatusFileList('', 'failed', '上传失败')
      }
    },
    setStatusFileList (url='', status='', message='') {
      let fileItem = {
        url: url,
        status: status,
        message: message
      }
      this.statusFileList = [fileItem]
    },

    handleDelete () {
      this.isShowUpload = true
      this.statusFileList = []

      this.url = ''
      this.id = null
    }
}

下载:

解决方案:复制链接让用户自行去浏览器下载

步骤:

1. 安装

npm install vue-clipboard2 --save

2. 引入 以main.js 引入为例

import VueClipboard from 'vue-clipboard2'


Vue.use(VueClipboard)

3. 使用

<div @click="handleFileDownload">
    复制下载链接
</div>


handleFileDownload () {
   if (this.url) {
     this.$copyText(this.url).then(function (e) {
       alert('复制成功')
     }, function (e) {
       alert('复制失败')
     })
   }
}

方式二:

1. 安装  

npm install clipboard --save

2. 引入

import Clipboard from 'clipboard'

3. 使用

// 复制静态数据
<span
    class="urlContentCopyBtn"
    :data-clipboard-text="url"
    @click="handleCopyDownUrl">
    <el-button  type="primary" size="mini">
      复制下载链接
    </el-button>
</span>

methods: {
    handleCopyDownUrl () {
      if (this.url) {
        let clipboard = new Clipboard('.urlContentCopyBtn')
        clipboard.on('success', e => {
          this.$message.success('复制成功')
          // 释放内存
          clipboard.destroy()
        })
        clipboard.on('error', e => {
          // 不支持复制
          this.$message.error('该浏览器不支持复制')
          // 释放内存
          clipboard.destroy()
        })
      }
    },
}

// 复制动态数据

<div v-html="answer" class="modelContentDetailAnswer"></div> // 答案内容

<div class="copy_wrap">
  <i
    class="el-icon-document-copy copy_icon modelContentDetailCopyBtn"
    data-clipboard-action="copy"
    @click="handleModelContentDetailCopy"
  />
  复制  
</div>


methods: {
     handleModelContentDetailCopy () {
      let textValue = document.querySelector('.modelContentDetailAnswer')

      let clipboard = new Clipboard('.modelContentDetailCopyBtn', {
        target: function () {
          return textValue
        }
      })
      clipboard.on('success', e => {
        this.$message.success('复制成功')
        // 释放内存
        clipboard.destroy()
      })
      clipboard.on('error', e => {
        // 不支持复制
        this.$message.error('该浏览器不支持复制')
        // 释放内存
        clipboard.destroy()
      })
    }
}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
除了使用 `weixin-js-sdk`,在 Taro 微信小程序 webview 嵌套 Vue 3 + Vite 项目之间实现通信还有其他的方法,以下是一些常用的方法: 1. `window.postMessage()` 方法:可以通过 `window.postMessage()` 方法将消息发送到 Taro 微信小程序 webview 所在的 iframe 窗口。在 Taro 微信小程序中,可以通过监听 `message` 事件来接收从 Vue 3 + Vite 项目发送的消息。 2. WebSocket:可以使用 WebSocket 在 Taro 微信小程序 webviewVue 3 + Vite 项目之间建立一个双向通信的连接。在 Taro 微信小程序中,可以使用 `wx.connectSocket()` 方法来建立 WebSocket 连接,并通过监听 `wx.onSocketMessage()` 方法来接收从 Vue 3 + Vite 项目发送的消息。 3. Storage API:可以使用 Storage API 在 Taro 微信小程序 webviewVue 3 + Vite 项目之间共享数据。在 Taro 微信小程序 webviewVue 3 + Vite 项目中都可以使用 `localStorage` 或 `sessionStorage` 对象来存储和读取数据。 4. 通过 URL 参数传递数据:可以通过在 URL 中添加参数的方式传递数据。在 Taro 微信小程序 webviewVue 3 + Vite 项目中都可以通过 `window.location.href` 或 `wx.navigateTo()` 方法来跳转页面,并在 URL 中添加参数。 以上是一些常用的在 Taro 微信小程序 webview 嵌套 Vue 3 + Vite 项目之间实现通信的方法,根据实际需求可以选择不同的方法来实现。需要注意的是,在使用这些方法时要确保数据的安全性和正确性。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值