zoukankan      html  css  js  c++  java
  • 利用STS临时授权实现百度云对象存储前端大文件上传

    利用STS临时授权实现百度云对象存储前端大文件上传

    工具

    百度云 JavaScript SDK

    百度云 Python SDK

    服务端

    环境准备

    1. 安装pycrypto依赖

      安装SDK之前,需要先执行命令pip install pycrypto安装pycrypto依赖。
      如果安装失败,请执行pip install pycryptodome

    2. 安装SDK

      pip install bce-python-sdk
      

    获取STS临时授权DEMO

    授权规则详见官方文档:https://cloud.baidu.com/doc/BOS/s/Tjwvysda9#临时授权访问

    # coding: utf-8
    import uuid
    
    from baidubce.bce_client_configuration import BceClientConfiguration
    from baidubce.auth.bce_credentials import BceCredentials
    from baidubce import protocol
    from baidubce.services.sts.sts_client import StsClient
    
    access_key = '******'
    secret_key = '******'
    endpoint = 'sts.bj.baidubce.com'
    
    
    def get_session_token(bucket_name, mode=None, expire=300):
        """
        :param bucket_name: 桶名
        :param mode: [READ/WRITE/LIST/GetObject]
        :param expire: 过期时间
        :return:
        """
        import ssl
        ssl._create_default_https_context = ssl._create_unverified_context
        sts_config = BceClientConfiguration(
            credentials=BceCredentials(
                access_key_id=access_key,
                secret_access_key=secret_key
            ),
            endpoint=endpoint,
            protocol=getattr(protocol, 'HTTPS')
        )
        body = {
            "accessControlList": [
                {
                    "service": "bce:bos",
                    "region": "bj",
                    "effect": "Allow",
                    "resource": [f"{bucket_name}/*"],
                    "permission": mode or ['READ']
                }
            ]
        }
    
        sts = StsClient(sts_config)
        resp = sts.get_session_token(body, expire)
        data = {
            'ak': resp.access_key_id,
            'sk': resp.secret_access_key,
            'expire': resp.expiration,
            'session_token': resp.session_token,
          	'bucket_name': bucket_name,
          	'endpoint': endpoint,
          	'key': uuid.uuid4.hex
        }
        return data
    
    
    if __name__ == '__main__':
        res = get_session_token('bucket-name',mode=['WRITE'], expire=86400)
        print(res['ak'])
        print(res['sk'])
        print(res['session_token'])
        
        # res各项 为前端往百度云bos上传时需要的参数
    

    浏览器

    环境准备

    Node.js环境:

    npm install @baiducloud/sdk
    

    Node.js实现详见官方文档:https://cloud.baidu.com/doc/BOS/s/Djwvyrhiw

    这里示例CDN引入的demo

    CDN引入方式DEMO

    bce-bos-uploader详细使用规则:https://github.com/baidubce/bce-bos-uploader/

    <!doctype html>
    <html>
      <head>
        <meta charset="utf-8" />
        <title>bce-bos-uploader simple demo</title>
        <!--[if lt IE 8]><script src="http://websdk.cdn.bcebos.com/bos/json3/lib/json3.min.js"></script><![endif]-->
        <!--[if lt IE 9]><script src="http://websdk.cdn.bcebos.com/bos/js-polyfills/es5.js"></script><![endif]-->
        <!--[if lt IE 10]><script src="http://websdk.cdn.bcebos.com/bos/moxie/bin/js/moxie.js"></script><![endif]-->
    
        <script src="https://cdn.bdstatic.com/bce-bos-uploader-lite/1.0.9/bce-bos-uploader-lite.min.js"></script>
        <script src="https://cdn.bootcss.com/jquery/3.2.1/jquery.min.js"></script>
    
      </head>
      <body>
    
        <input type="file" id="file" >
        <button onclick="submit">上传</button>
        <script>
    
        function getSTSToken(filename){
          		# html通过js调用后端接口拿到STS临时授权所需的ak、sk、uptoken、bucket_name、endpoint、key等数据
              var resp = null;
              $.ajax(
                  {
                    type: "GET",
                    url: 'http://127.0.0.1:8080/sts/Token',
                    dataType: 'json',
                    data: {
                      filename: filename
                    },
                    async: false
                  }
              ).done(function (data) {
                  resp = data
              });
              return resp
        }
        var uploader = new baidubce.bos.Uploader({
          browse_button: '#file',
          max_file_size: '3000M',
          bos_multipart_min_size: '0',
          auto_start: true,
          init: {
            Key: function (_, file) {  // 供使用者自定义key(上传到桶里的名字),可以在这里调用服务端拿到所需参数
    
              data = getSTSToken(file.name)
              console.log(data.data)
              uploader.setOptions({
                bos_ak: data.data.ak,
                bos_sk: data.data.sk,
                uptoken: data.data.uptoken,
                bos_endpoint: data.data.endpoint,
                bos_bucket: data.data.bucket_name,
    
              })
              return data.data.key
          },
          FileUploaded: function (_, file, info) {
            // 文件上传成功之后,调用这个函数
            console.log(info.body);
            // 处理成功的业务逻辑
          },
          Error: function (_, error, file) {
            // 如果上传的过程中出错了,调用这个函数
          },
      }
        })
        function submit(){
          uploader.start()
        }
    
        </script>
      </body>
    </html>
    
    程序猿,要对自己狠一点!
  • 相关阅读:
    Hdu 1094 A+B for Input-Output Practice (VI)
    Hdu 1091 A+B for Input-Output Practice (III)
    Hdu 1092 A+B for Input-Output Practice (IV)
    Hdu 1087 Super Jumping! Jumping! Jumping!
    scala学习笔记2(类,继承,抽象类)
    scala学习笔记1(表达式)
    把以前写的几个Linux Framebuffer小工具放到github上了,直接去下吧,别找我要了
    一位台湾朋友刚建的一个FTK的论坛,欢迎加入讨论
    Linux高端内存的由来
    read系统调用深度剖析
  • 原文地址:https://www.cnblogs.com/dongxixi/p/15674300.html
Copyright © 2011-2022 走看看