小小小幸运 发表于 2024-6-9 15:07:42

微信小步伐直传腾讯云COS并对图片长期化笔墨水印案例

各人好,我是前端发现者https://blog.csdn.net/Smell_rookie,是一名页面仔工程师,我会不定时在CSDN更新我的博客,有兴趣的可以点个关注来逛逛我的主页。
写这个需求时网上搜索看到的文章不计其数,很多“缺斤少两”,今天做个总结吧。
一、前期准备


[*]到 (COS对象存储控制台)[登录 - 腾讯云] 创建存储桶,得到 Bucket(存储桶名称) 和 Region(地域名称)
[*]到 (控制台密钥管理)[登录 - 腾讯云] 获取您的项目 SecretId 和 SecretKey
二、盘算署名

由于署名盘算放在前端会暴露 SecretId 和 SecretKey,我们把署名盘算过程放在后端实现,前段通过 ajax 向后端获取署名结果,正式部署时请再后端加一层本身网站本身的权限查验。
三、下载需要的文件

去到这里下面地点下载文件到项目的utils文件夹下。https://github.com/tencentyun/cos-wx-sdk-v5https://csdnimg.cn/release/blog_editor_html/release2.2.0/ckeditor/plugins/CsdnLink/icons/icon-default.png?t=M85Bhttps://github.com/tencentyun/cos-wx-sdk-v5
四、实当代码

https://img-blog.csdnimg.cn/d3160da34f164c589870c0eb9bfef035.png
在需要实行上传操作的js文件复制如下代码:
const COS = require('./cos-wx-sdk-v5.js')

// 初始化腾讯云存储
const commonCos = new COS({
    // ForcePathStyle: true,
    // 如果使用了很多存储桶,可以通过打开后缀式,减少配置白名单域名数量,请求时会用地域域名
    FileParallelLimit: 40, //同一个实例下上传的文件并发数,默认值3
    ChunkParallelLimit: 40, //同一个上传文件的分块并发数,默认值3
    //获取签名的回调方法
    getAuthorization: (options, callback) => {
      // 异步获取临时密钥
      http.getRequest('/small/small/getTempScert', {
            bucket: options.Bucket,
            region: options.Region,
      }, res => {
            let credentials = res.data.credentials
            if (!credentials) return console.error('credentials invalid')
            callback({
                TmpSecretId: credentials.tmpSecretId,
                TmpSecretKey: credentials.tmpSecretKey,
                XCosSecurityToken: credentials.sessionToken,
                // 建议返回服务器时间作为签名的开始时间,避免用户浏览器本地时间偏差过大导致签名错误
                StartTime: res.data.startTime, // 时间戳,单位秒,如:1580000000
                ExpiredTime: res.data.expiredTime, // 时间戳,单位秒,如:1580000900
            })
      })
    }
})


// 上传图片 flag:1 需要校验是否需要水印 -1 不校验、不使用水印
const commonUploadImg = async (name, flag = -1, classId = null) => {
return new Promise((resolve) => {
    wx.chooseImage({
      count: 9,
      sizeType: ['compressed'], // 可以指定是原图还是压缩图,默认二者都有
      sourceType: ['album', 'camera'], // 可以指定来源是相册还是相机,默认二者都有
      success: async (res) => {
      wx.showLoading({
          title: '上传中...',
          icon: 'loading',
      })
      let filenameList = []
      let filePathList = []
      if (res.tempFiles.length) {
          let tempFile = res.tempFiles
          let countNum = 0
          let waterResult = null
          if (flag == 1) {
            /**获取水印信息*/
            waterResult = await getClassInfoIfWaterMark({
            classId: classId,
            homeWorkId: name
            })
          }
          for (let temp of tempFile) {
            // 这里对图片校验-传入压缩后的图片
            const result = true
            if (result) {
            if (temp.size > 10485760) {
                wx.hideLoading()
                wx.showToast({
                  title: `图片最大可以上传${10485760/1024/1024}M`,
                  icon: 'none',
                  duration: 1500
                })
            } else {
                const filePath = temp.path
                const tempDate = new Date()
                const createPath = tempDate.getFullYear() + "" + utils.formatNumber((tempDate.getMonth() + 1)) + "" + utils.formatNumber(tempDate.getDate()) + "/"
                const filename = createPath + name + '/' + filePath.substr(filePath.lastIndexOf('/') + 1)
                let fileId = filePath.substr(filePath.lastIndexOf('/') + 1)
                const wxfs = wx.getFileSystemManager()
                let ruleValue = `imageMogr2/format/jpg/interlace/1/rquality/60`
                let rule = {
                  "is_pic_info": 0,
                  "rules": [{
                  "fileid": `${fileId}`,
                  "rule": ruleValue
                  }]
                }
                if (flag == 1) {
                  if (waterResult && waterResult.ifWaterMark) {
                  let info = `${waterResult.waterFormat}`
                  let waterInfo = utils.Base64.encode(info)
                  let fontColor = utils.Base64.encode(waterResult.waterColor || '#09ff00')
                  let waterPosition = waterResult.waterPosition || 'center'
                  let waterRangle = waterResult.waterRangle || 0
                  let water = `watermark/2/text/${waterInfo}/font/c2ltaGVp6buR5L2TLnR0Zg/fill/${fontColor}/fontsize/50/gravity/${waterPosition}/degree/${waterRangle}/dissolve/100`
                  rule.rules.rule = `${ruleValue}|${water}`
                  }
                }
                wxfs.readFile({
                  filePath: filePath,
                  success(res) {
                  commonCos.putObject({
                      Bucket: 'img-work-1304215329',
                      Region: 'ap-beijing',
                      Key: filename,
                      Body: res.data,
                      Headers: {
                        // 通过 数据万象的压缩自定义规则 style/uploadStyle
                        // 'Pic-Operations': `{"is_pic_info": 0, "rules": [{"fileid": "${fileId}","rule": "style/uploadStyle"}]}`,
                        'Pic-Operations': `${JSON.stringify(rule)}`
                      },
                  }, function (err, data) {
                      if (data && data.statusCode == 200) {
                        countNum++
                        filenameList.push(filename)
                        filePathList.push(filePath)
                        if (countNum == tempFile.length) {
                        wx.hideLoading()
                        let obj = {
                            filenameList,
                            filePathList
                        }
                        resolve(obj)
                        }
                      }
                  })
                  }
                })
            }
            }
          }
      }
      },
      fail() {
      wx.hideLoading()
      }
    })
})
}


长期化处置惩罚图片的规则可参考如下:
数据万象 图片长期化处置惩罚-API 文档-文档中心-腾讯云

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
页: [1]
查看完整版本: 微信小步伐直传腾讯云COS并对图片长期化笔墨水印案例