评论

小程序 大文件 多图 直接上传七牛云

多图直接上传功能

思想:通过从后端获取的七牛云SDK,完成大文件在小程序直接上传七牛云

本文章实现多图直接上传功能,且能实现预览功能,效果图如下(有需要的朋友们可以看一下):

使用七牛云官方的SDK

下载:qiniu-wxapp-sdk

composer安装七牛云sdk

composer require itbdw/laravel-storage-qiniu


从后端取upToken的方法

public function uploadToken()
    {
        $auth = new Auth('AK', 'SK');  
        $bucket = 'bucket';   
        $token = $auth->uploadToken($bucket);
        return json_encode(['uptoken'=>$token]);
    }


小程序拿到token,用来上传图片

const qiniuUploader = require('../../qiniuUploader.js')

       data: {
	    imageURL:'',
	    uptoken:''
        },

        //大文件上传
    big(){
      wx.request({    
        url: 'http://www.xxxxx.com/index.php/api/uploadToken',//拿到token
        header: {
          'Content-Type''application/json;charset=UTF-8'
        },
        method: 'get',
        success: (response) => {
          this.setData({
            uptoken: response.data.uptoken
          })
          console.log(response)
          console.log(this.data.uptoken)
        }
      })
      wx.chooseImage({    
                //可上传多图
        count: 3,
        sizeType: ['original''compressed'],
        sourceType: ['album''camera'],
        success:(res) => {
                    //微信小程序的API,获取临时图片地址
          console.log(res)
          // tempFilePath可以作为img标签的src属性显示图片
          const img = res.tempFilePaths
          let arr=[]
          img.map(url=>{
              // 交给七牛上传
              qiniuUploader.upload(url, (res) => {
                                //数组追加
                arr.push('http://'+res.imageURL)
                this.setData({
                  'imageURL': arr,
                });
                console.log(this.data.imageURL)
              }, (error) => {
                console.log('error: ' + error);
              }, {
                region: 'NCN',  //华北
                domain: 'xxx.xxxxx.xxx'// 自己的域名
                key: Math.floor(Math.random()*50 + 50)+'.jpg'// 上传到七牛云图片就是这名字了
                // 以下方法三选一即可,优先级为:uptoken > uptokenURL > uptokenFunc
                uptoken: this.data.uptoken, // 由其他程序生成七牛 uptoken
                uptokenURL: 'http://www.xxxxx.com/index.php/api/uploadToken', 
                // uptokenFunc: function() {
                //  return '[yourTokenString]';
                // }
              }, (res) => {
                console.log('上传进度', res.progress)
                console.log('已经上传的数据长度', res.totalBytesSent)
                console.log('预期需要上传的数据总长度', res.totalBytesExpectedToSend)
              }, () => {
                // 取消上传
              }, () => {
                // `before` 上传前执行的操作
              }, (err) => {
                // `complete` 上传接受后执行的操作(无论成功还是失败都执行)
              });
          })
        }
      })
    },
最后一次编辑于  2022-03-16  
点赞 0
收藏
评论

5 个评论

  • veyen
    veyen
    03-01
    uptokenURL'http://www.xxxxx.com/index.php/api/uploadToken', 这是什么呀
    
    
    03-01
    赞同
    回复
  • Sun
    Sun
    2023-12-07

    这并不是七牛云直传啥的,小程序环境中没有XMLHttpRequest,所以七牛的那套大文件切片上传首先就没有。还是把官方的wx.uploadFile又封装了一下,其实对于大文件来说效率也并没有怎么优化。

    2023-12-07
    赞同
    回复
  • Lst
    Lst
    2022-03-16

    请问图片上传后七牛云是会生成图片访问链接吗?最近会用到图片存储的功能,目前还在了解中

    2022-03-16
    赞同
    回复 1
    • _amateur_
      _amateur_
      2022-03-17
      是的,上面数据同步的imageURL将会被同步为图片地址
      2022-03-17
      回复
  • _amateur_
    _amateur_
    2022-03-16

    这样可以验证文件格式是否为图片

    2022-03-16
    赞同
    回复
  • _amateur_
    _amateur_
    2022-03-16
                                    let icon=x.tempFilePath.split('.')
                    let picArr=['jpg','png','jpeg','gif']
                    //判断是否为图片
                    if(!picArr.includes(icon[1])){
                        wx.showToast({
                          title'必须上传图片',
                          icon:'error'
                        })
                        return;
                    }
    
    2022-03-16
    赞同
    回复
登录 后发表内容