阿里云oss
程序员文章站
2022-07-10 18:06:28
...
一、主账户的access_key_id、access_key_secret拥有所有权限,为了安全生成只有oss操作权限的access_key_id、access_key_secret
1、先创建创建用户
- 进入用户主页点击访问控制
- 创建用户(记录好access_key_id、access_key_secret)
- 添加权限:点击用户名->点击权限管理
二、使用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、新建权限策略(让角色拥有这个权限)
- 访问控制界面点击权限管理->权限策略管理
- 点击新建策略
3、创建角色(获取第二步生成的自定义权限达到权限控制的目的)
- 访问控制点击RAM角色管理,并新建RAM角色
- 点击角色名称->添加权限
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')
五、文件下载使用自定义的名称
bucket.put_object(key=key, data=bytes_content, headers={"Content-Disposition": "attachment;filename=%s" % file_name})
URL?attname=file_name # 文件通过这个下载就会是自定义的文件名