Loading

Loading

腾讯云cos对象存储使用方法

相关文档

零时密钥生成指引:https://cloud.tencent.com/document/product/436/14048

node.js SDK文档:https://cloud.tencent.com/document/product/436/8629

javascript SDK文档:https://cloud.tencent.com/document/product/436/7751

cos对象存储API文档:https://cloud.tencent.com/document/product/436/7751

前端web上传官方demo: https://github.com/tencentyun/cos-snippets/tree/master/JavaScript

web端上传(操作)文件

官方介绍的方式有4种,这里以第1种和第4种做简单说明。

第一种方法

这种方法需要通过web端请求服务端接口获取临时密钥,通过调用服务端接口获取临时密钥,用临时密钥new一个cos实例。用cos实例上的方法来上传或操作文件。

首先需要安装官方提供的SDK包 npm i cos-js-sdk-v5 --save

demo如下:

// 前端代码

import React from 'react'
import COS from 'cos-js-sdk-v5'
import config from '../../../../config/index.json'

// 用于发送请求
function ajax(method, url, data = null) {
  return new Promise(resolve => {
    const xhr = new XMLHttpRequest()
    xhr.open(method, url, false)
    xhr.onload = () => {
      const result = JSON.parse(xhr.responseText)
      resolve(result)
    }
    xhr.send(data)
  })
}

// 生成cos实例
const cos = new COS({
  // 必选参数
  getAuthorization: async function (options, callback) {
    // 请求的URL替换为服务端提供的接口
    const data = await ajax('GET', 'http://127.0.0.1:8000/sts')
    console.log('临时密钥:', data)
    var credentials = data && data.credentials;
    if (!data || !credentials) return console.error('credentials invalid');
    callback({
      TmpSecretId: credentials.tmpSecretId,
      TmpSecretKey: credentials.tmpSecretKey,
      XCosSecurityToken: credentials.sessionToken,
      // 建议返回服务器时间作为签名的开始时间,避免用户浏览器本地时间偏差过大导致签名错误
      StartTime: data.startTime, // 时间戳,单位秒,如:1580000000
      ExpiredTime: data.expiredTime, // 时间戳,单位秒,如:1580000900
    })
  }
})

function App() {
  const uploadCos = (file, filename) => {
    cos.putObject({
      Bucket: config.Bucket,     /* 必须 */
      Region: config.Region,     /* 存储桶所在地域,必须字段 */
      Key: filename,              /* 必须 */
      StorageClass: 'STANDARD',
      Body: file, // 上传文件对象
      onProgress: function (progressData) {
        console.log('progress', JSON.stringify(progressData));
      }
    }, function (err, data) {
      console.log('msg:', err || data);
    });
  }

  const uploadHandle = () => (
    new Promise(resolve => {
      const int = document.createElement('input')
      int.type = 'file'
      int.click()
      int.onchange = () => {
        const file = int.files[0]
        console.log('file:', file)
        resolve(file)
      }
    })
  )

  const onUpload = async () => {
    const file = await uploadHandle()
    uploadCos(file, file.name)
  }
  return <button onClick={onUpload}>点击上传</button>
}

export default App

nodejs服务端代码(生成临时密钥)

安装依赖包: npm i express cors qcloud-cos-sts --save

const app = require('express')()
const cors = require('cors')
const STS = require('qcloud-cos-sts') // 用于生成零时密钥

// 配置参数
const config = {
  secretId: configs.SecretId,   // 替换你的固定密钥
  secretKey: configs.SecretKey,  //替换你的固定密钥
  proxy: '',
  durationSeconds: 1800,  // 密钥有效期
  // 放行判断相关参数
  bucket: configs.Bucket, // 换成你的 bucket
  region: configs.Region, // 换成 bucket 所在地区
  allowPrefix: '*', // 这里改成允许的路径前缀,可以根据自己网站的用户登录态判断允许上传的具体路径,例子: a.jpg 或者 a/* 或者 * (使用通配符*存在重大安全风险, 请谨慎评估使用)
  allowActions: [
    // 所有 action 请看文档 https://cloud.tencent.com/document/product/436/31923
    // 简单上传
    'name/cos:PutObject',
    'name/cos:PostObject',
    // 分片上传
    'name/cos:InitiateMultipartUpload',
    'name/cos:ListMultipartUploads',
    'name/cos:ListParts',
    'name/cos:UploadPart',
    'name/cos:CompleteMultipartUpload'
  ],
};

// 处理跨域
app.use(cors())

// 生成临时密钥接口
app.get('/sts', (req, res) => {
  // 获取临时密钥
  var shortBucketName = config.bucket.substr(0, config.bucket.lastIndexOf('-'));
  var appId = config.bucket.substr(1 + config.bucket.lastIndexOf('-'));
  var policy = {
    'version': '2.0',
    'statement': [{
      'action': config.allowActions,
      'effect': 'allow',
      'principal': { 'qcs': ['*'] },
      'resource': [
        'qcs::cos:' + config.region + ':uid/' + appId + ':prefix//' + appId + '/' + shortBucketName + '/' + config.allowPrefix,
      ],
    }],
  };
  STS.getCredential({
    secretId: config.secretId,
    secretKey: config.secretKey,
    proxy: config.proxy,
    durationSeconds: config.durationSeconds,
    policy: policy,
  }, function (err, tempKeys) {
    var result = JSON.stringify(err || tempKeys) || '';
    res.send(result);
  });
})

app.listen(8000)
console.log(`server running at: http://localhost:8000`)

第二种方法

第二种方法使用比较简单,不需要依赖服务端生成临时密钥。由于密钥保存在前端不安全,仅用于测试时使用。

demo:

import COS from 'cos-js-sdk-v5'

 const cos = new COS({
  SecretId: config.SecretId, // 替换你的SecretId
  SecretKey: config.SecretKey, // 替换你的SecretKey
})

cos.putObject({
  Bucket: config.Bucket,     /* 必须  替换你的Bucket */
  Region: config.Region,     /* 存储桶所在地域,必须字段 替换你的Region */
  Key: filename,              /* 必须 */
  StorageClass: 'STANDARD',
  Body: file, // 上传文件对象
  onProgress: function (progressData) {
    console.log('progress', JSON.stringify(progressData));
  }
}, function (err, data) {
  console.log('msg:', err || data);
});

posted @ 2020-11-25 00:17  灰色的修饰  阅读(1363)  评论(0编辑  收藏  举报