欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

阿里云oss

程序员文章站 2022-07-10 18:06:28
...

一、主账户的access_key_id、access_key_secret拥有所有权限,为了安全生成只有oss操作权限的access_key_id、access_key_secret

1、先创建创建用户

  • 进入用户主页点击访问控制

阿里云oss

  • 创建用户(记录好access_key_id、access_key_secret)

阿里云oss

  • 添加权限:点击用户名->点击权限管理

阿里云oss二、使用URL签名:对访问文件的URL进行过期设置(容器可为私有,但是endpoint必须为外网的,文件想要通过URL访问endpoint就必须是外网的)

bucket = oss2.Bucket(oss2.Auth(access_key_id, access_key_secret), outer_endpoint, bucket_name)
url = bucket.sign_url(method, key, expires)

三、使用内网流量访问oss(省钱)

  • 容器可以私有,但地域最好和服务器的一致(不一致要做反向代理);
  • endpoint必须为内网的
  • 代码实现
def file_iterator_file_object(file_object, chunk_size=8888):   # 生成可迭代文件流
    while True:
        c = file_object.read(chunk_size)
        if c:
            yield c
        else:
            break
class FileDownView(View):

    def get(self, request):
        file_id = request.GET.get('file_id', -1)
        if log_id == -1:
            return JsonResponse({'msg': 'file_id'})
        file_obj = File.objects.get(id=file_id)
        file_path = file_obj.file_path
        file_name = file_obj.file_name

        # 下载文件
        bucket = oss2.Bucket(oss2.Auth(access_key_id, access_key_secret), inter_endpoint, bucket_name)
        res = bucket.download_stream(key)
        data = file_iterator_file_object(res)

        response = StreamingHttpResponse(data)
        response['FILE_NAME'] = file_name
        response['Content-Type'] = 'application/octet-stream'
        response['Content-Disposition'] = 'attachment;filename=%s' % file_name
        return response

四、通过第三方上传(减轻自身服务器的压力)

1、安装

pip install aliyun-python-sdk-sts

2、新建权限策略(让角色拥有这个权限)

  • 访问控制界面点击权限管理->权限策略管理

阿里云oss

  • 点击新建策略

阿里云oss

3、创建角色(获取第二步生成的自定义权限达到权限控制的目的)

  • 访问控制点击RAM角色管理,并新建RAM角色

阿里云oss

  • 点击角色名称->添加权限

阿里云oss

4、代码实现

  • 后端
class LogOSSView(View):
    def get(self, request):
        # 获取配置参数
        access_key_id = settings.LOG_STS_TOKEN["access_key_id"]
        access_key_secret = settings.LOG_STS_TOKEN["access_key_secret"]
        region_id = settings.LOG_STS_TOKEN["region_id"]  # 深圳为:"cn-shenzhen"
        sts_role_arn = settings.LOG_STS_TOKEN["sts_role_arn"] # 第三步生成的角色ARN
        # 发送请求获得令牌并设置过期时间为30分钟
        clt = client.AcsClient(access_key_id, access_key_secret, region_id)
        req = AssumeRoleRequest.AssumeRoleRequest()
        req.set_accept_format('json')
        req.set_RoleArn(sts_role_arn)
        req.set_RoleSessionName('oss-python-sdk')  # 自定义会话
        req.set_DurationSeconds(30 * 60)  # 过期时间
        # 返回加密数据
        body = clt.do_action_with_exception(req)
        j = json.loads(oss2.to_unicode(body))
        token_access_key_id = j['Credentials']['AccessKeyId']
        token_access_key_secret = j['Credentials']['AccessKeySecret']
        token_security_token = j['Credentials']['SecurityToken']
        data = {
            "access_key_id": token_access_key_id,
            "access_key_secret": token_access_key_secret,
            "security_token": token_security_token,
            "endpoint": settings.LOG_STS_TOKEN["endpoint"],  # 外网的endpoint
            "bucket_name": settings.LOG_STS_TOKEN["bucket_name"],
        }

        return return_succ(result=data)
  • 第三方(Python为例)
import oss2
auth = oss2.StsAuth(access_key_id, access_key_secret, security_token)
bucket = oss2.Bucket(auth=auth, endpoint=endpoint, bucket_name=bucket_name)
bucket.put_object('motto.txt', 'Never give up. - Jack Ma')

帮助文档https://help.aliyun.com/document_detail/32033.html?spm=a2c4g.11186623.2.11.19524e29o92Fpv#section-zx1-55k-kfb

五、文件下载使用自定义的名称

bucket.put_object(key=key, data=bytes_content, headers={"Content-Disposition": "attachment;filename=%s" % file_name})
URL?attname=file_name # 文件通过这个下载就会是自定义的文件名

 

相关标签: oss