阿里云oss

一、主账户的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阿里云oss 一只努力的程序猿@ 发布了61 篇原创文章 · 获赞 11 · 访问量 6455 私信 关注
上一篇:Java中常用集合操作


下一篇:AWS S3文件/文件夹删除