百度云上传文件 API(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="beforeRead" /> </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>