uniapp app h5 小程序腾讯直传cos

143 阅读1分钟
/**
 * 获取视频
 * @param {number} count 最多可以选择的文件个数
 * @param {Array<String>} sourceType album 从相册选视频,camera 使用相机拍摄
 * @param {Array<String>} sizeType 可以指定是原图还是压缩图,默认二者都有
 * @returns {Promise<unknown>}
 */
export const chooseVideoByPromise = ({
  count = 9,
  sourceType = ['camera', 'album'],
  sizeType = ['original', 'compressed'],
  progressList = [],
} = {}) => {
  return new Promise((resolve, reject) => {
    uni.chooseVideo({
      count,
      sizeType,
      success(res) {
        console.log(res, 'rrrr')

        // #ifdef APP-PLUS
        resolve(
          uploadFile({
            imgs: [res.tempFile || res.tempFilePath],
            progressList,
            isPath: true,
            pathType: 'video.mp4',
          }),
        )
        // #endif

        // #ifndef APP-PLUS
        resolve(uploadFile({ imgs: [res.tempFile || res.tempFilePath], progressList }))
        // #endif

        // resolve(res)
      },
      fail(err) {
        reject(err)
      },
      complete() {},
    })
  })
}

/**
 * 获取图片
 * @param count
 * @param sizeType
 * @sourceType
 * @returns {Promise<unknown>}
 */
export const chooseImageByPromise = ({
  count = 9,
  sourceType = ['camera', 'album'],
  sizeType = ['original', 'compressed'],
  progressList = [],
} = {}) => {
  return new Promise((resolve, reject) => {
    uni.chooseImage({
      count,
      sizeType, // 可以指定是原图还是压缩图,默认二者都有
      success(res) {
        console.log(res, 'sss')

        resolve(uploadFile({ imgs: res.tempFiles, progressList }))
      },
      fail(err) {
        reject(err)
      },
      complete() {},
    })
  })
}

/**
 * 批量上传照片
 * @param imgs string:[]
 * @param name 标识
 * @param data 业务参数:{}
 * @returns {Promise<unknown>}
 */
export const uploadFile = ({
  imgs,
  data,
  progressList = [],
  isPath = false,
  pathType = 'video',
}) => {
  const taskList = []
  console.log(imgs, 'sss')
  for (let i = 0; i < imgs.length; i++) {
    const taskItem = upload({
      url: imgs[i],
      name: isPath ? pathType : imgs[i].name,
      idx: i,
      progressList,
      formData: data,
      isPath,
    })
    taskList.push(taskItem)
  }

  return new Promise((resolve, reject) => {
    Promise.all(taskList)
      .then((urls) => {
        console.log(urls, 'urls')
        resolve(urls)
      })
      .catch((err) => {
        const errMsg = Object.hasOwnProperty.call(err, 'errMsg') ? err.errMsg : err
        reject(errMsg)
      })
  })
}

/**
 * @description 上传图片
 * @param url
 * @returns {Promise<unknown>}
 */
export const upload = ({ url, name, data, isPath = false }) => {
  console.log(url, 'upload-----urlrurl')
  let _this = this
  let fileName =
    Date.now() +
    Math.floor(Math.random() * (100 - 0)) * Math.floor(Math.random() * (100 - 0)) +
    name

  return new Promise((resolve, reject) => {
    // 此处替换为你自己的网络请求方法
    VoHttp.apiCreatedCosGet({
      businessType: 1,
      fileUrl: 1,
    }).then((res) => {
      var formData = {
        key: fileName,
        policy: res.data.policy, // 这个传 policy 的 base64 字符串
        success_action_status: 200,
        'q-sign-algorithm': 'sha1',
        'q-ak': res.data.secretId,
        'q-key-time': res.data.KeyTime,
        'q-signature': res.data.qSignature,
        'x-cos-security-token': res.data.secretToken,
      }
      formData = { ...data, ...formData }
      // 如果服务端用了临时密钥计算,需要传 x-cos-security-token
      // formData['x-cos-security-token'] = formData.securityToken

      let options = {
        url: devConf.tencentCosUrl, //仅为示例,非真实的接口地址
        name: 'file',
        formData: formData,
        success: (res) => {
          resolve({ fileName: fileName, fileNameUrl: devConf.tencentCosUrl + '/' + fileName })
        },
        fail(err) {
          reject(err)
        },
      }
      //是否上传路径
      if (isPath) {
        options.filePath = url
      } else {
        options.file = url
      }

      uni.uploadFile(options)
    })
  })
}