vue 百度云上传文件PostObject

百度云上传文件 API(PostObject)

PostObject接口  :

接口描述

此接口使用HTML表单上传文件到指定bucket,用于实现通过浏览器上传文件到bucket。在PutObject操作中通过HTTP请求头传递参数,在PostObject操作中使用消息实体中的表单域传递参数,其中消息实体使用多重表单格式(multipart/form-data)编码。

该接口调用需要用到 base64和sha256加密

1、安装 js-base64

  npm install js-base64 --save

  使用:

  const Base64 = require('js-base64').Base64
   var basePolicy = Base64.encode(str)

2、安装 crypto-js

   npm install crypto-js --save

  使用

  const CryptoJS = require('crypto-js')
  let signature = CryptoJS.HmacSHA256(basePolicy, config.sk).toString()

3、具体代码如下(接口使用axios访问,)

// tslint:disabled
<template>
  <div>
    <van-uploader :after-read="upload" :before-read="upload" />
  </div>
</template>

<script>
import Axios from 'axios'
const Base64 = require('js-base64').Base64
const CryptoJS = require('crypto-js')
const config = {
  bcebosBucket: 'xxxx',
  endpoint: 'xxxxxxxx', //Bucket所在区域域名
  ak: 'xxxxx', //您的AccessKey
  sk: 'xxxxx' //您的SecretAccessKey
}

export default {
  methods: {
    data() {
      return {}
    },
    beforeRead(file) {
      debugger
      if (file.type !== 'image/jpeg') {
        Toast('请上传 jpg 格式图片')
        return false
      }
      return true
    },
    upload(file, detail) {
      debugger
      /**
       * bos 上传文件接口网站
       * https://cloud.baidu.com/doc/BOS/s/qjwvyseos#postobject%E6%8E%A5%E5%8F%A3
       */
      let date = new Date()
      let year = date.getFullYear()
      let month = date.getMonth() + 1
      // bos参数组装 key-文件存储位置和名称
      let key =
        config.bcebosBucket + '/' + year + '/' + month + '/' + file.file.name
      // policy 格式见网站 String
      let expiration = {
        expiration: this.formate(date, 'yyyy-MM-ddThh:mm:ssZ'),
        conditions: [{ bucket: config.bcebosBucket }, { key: key }]
      }
      let str = JSON.stringify(expiration)
      var basePolicy = Base64.encode(str)
      let signature = CryptoJS.HmacSHA256(basePolicy, config.sk).toString()

      let formData = new FormData()
      formData.append('key', key)
      formData.append('accessKey', config.ak)
      formData.append('policy', basePolicy)
      formData.append('signature', signature)
      formData.append('file', file.file)
      Axios.post(config.endpoint, formData, {
        baseURL: '',
        headers: { 'content-type': 'multipart/form-data;' }
      }).then(res => {
        debugger
      })
    },
    formate(time, fmt) {
      var o = {
        'M+': time.getMonth() + 1, //月份
        'd+': time.getDate(), //
        'h+': time.getHours(), //小时
        'm+': time.getMinutes(), //
        's+': time.getSeconds(), //
        'q+': Math.floor((time.getMonth() + 3) / 3), //季度
        S: time.getMilliseconds() //毫秒
      }
      if (/(y+)/.test(fmt))
        fmt = fmt.replace(
          RegExp.$1,
          (time.getFullYear() + '').substr(4 - RegExp.$1.length)
        )
      for (var k in o)
        if (new RegExp('(' + k + ')').test(fmt))
          fmt = fmt.replace(
            RegExp.$1,
            RegExp.$1.length == 1
              ? o[k]
              : ('00' + o[k]).substr(('' + o[k]).length)
          )
      return fmt
    }
  }
}
</script>

<style lang="scss" scoped>
</style>
原文地址:https://www.cnblogs.com/tiandi0808/p/11887689.html