Python使用阿里云对象存储OSS--服务器端上传文件

一直在使用阿里云对象存储Oss,今天来总结一下基本用法,主要写个逻辑,具体操作都有详细的文档,会附链接

1  开通服务

        首先需要开通oss服务以及创建存储空间,需要注意的是开通完oss服务之后默认的是按流量计费的,如需包年包月可以购买oss服务

2  python服务器端上传文件到阿里云oss

        1)需要登录阿里云,然后创建Access Key,如果有子用户可以不用再创建了,没有的可以创建一个子用户,AccessKeyID和AccessKeySecret,下面是新建流程图。

注意:阿里云的产品(云服务器ECS,存储对象OSS)都可以使用一个子用户的Access Key,新建或者使用已有子用户需要设置权限,下图会有标识。

输入需要新建的用户名:


选择权限,标红的是阿里云OSS对象存储的权限:


获取手机验证码:

创建成功之后获取 AccessKeyID和 AccessKeySecret,
如果是已有用户,设置权限:
2)服务器端上传文件和下载文件
# coding=utf-8
import datetime,string,random
import time
import oss2
now = datetime.datetime.now()
random_name = now.strftime("%Y%m%d%H%M%S") + ''.join([random.choice(string.digits) for _ in range(4)]) # 自定义随机名称

auth = oss2.Auth('your-Accesskey', 'your-AccessKeySecret')
bucket = oss2.Bucket(auth, 'oss-cn-beijing.aliyuncs.com', 'your-username', connect_timeout=30)

# 1) 直接上传文件put_object_from_file
result = bucket.put_object_from_file(filename, 'file')
if result.status == 200:
    url = '%s' % (filename)
    print(url)

# 2)指定方式上传put_object,支持上传
#       1)字符串,2)bytes:直接上传,3)unicode:会自动转换为UTF-8编码的bytes进行上传,
#       4)上传本地文件以文件对象方式:必须以二进制的方式打开文件,因为内部实现需要知道文件包含的字节数
bucket.put_object('remote.txt', 'content of object')
bucket.put_object('remote.txt', b'content of object')
bucket.put_object('remote.txt', u'content of object')
with open('local_file', 'rb') as fileobj:
    result = bucket.put_object(filename, fileobj)
    if result.status == 200:
        print('http url: {0}'.format(filename))  # 上传文件生成的url,可以用它进行下载或查看
        print('http status: {0}'.format(result.status)) # HTTP返回码,成功返回200
        print('request_id: {0}'.format(result.request_id))  # 请求ID,强烈建议把它作为程序日志的一部分
        print('ETag: {0}'.format(result.etag))  #  etag则是put_object返回值特有的属性
        print('date: {0}'.format(result.headers['date']))  # HTTP响应头部

# 1) get_object下载,然后通过shutil将文件内容拷贝到另一个文件, 它的返回值是一个类文件对象(file-like object),同时也是一个可迭代对象(iterable)
remote_stream = bucket.get_object(filenam)
with open('jianji01.jpg', 'wb') as local_fileobj:
    import shutil
    shutil.copyfileobj(remote_stream, local_fileobj)

# 2)Bucket.get_object_to_file 直接下载到本地文件
result = bucket.get_object_to_file(filenam, 'local_file')
if result.status == 200:
    print('success')

# 列出两个文件
from itertools import islice
for b in islice(oss2.ObjectIterator(bucket), 2):
    print(b.key)


3)前端JS获取服务端签名后直传

1)背景

使用OSS上传会有种场景,网页上传,其中包括一些APP里面的h5页面,对上传的需求很强烈,很多人采用的做法是用户在浏览器/APP上传到应用服务器,然后应用服务器再把文件上传到OSS,如下图:


这种方法有三个缺点:

  • 第一:上传慢。先上传到应用服务器,再上传到OSS,网络传送多了一倍。如果数据直传到OSS,不走应用服务器,速度将大大提升,而且OSS是采用BGP带宽,能保证各地各运营商的速度。
  • 第二:扩展性不好。如果后续用户多了,应用服务器会成为瓶颈。
  • 第三:费用高。由于OSS上传流量是免费的。如果数据直传到OSS,不走应用服务器,那么将能省下几台应用服务器。

所以前端JS获取服务端签名后直传就应运而生:
  1. 客户端要上传图片时,到应用服务器取上传的policy及签名。

  2. 客户端拿到签名直接上传到OSS。如下图:


  阿里云有Python获取签名的,但是前后端一起的栗子是PHP的,而且前端的代码没有封装好,看着不方便,我自己封装了一套 前后端的栗子,下篇见...

    阿里云有栗子:点击跳转栗子链接


            

猜你喜欢

转载自blog.csdn.net/weixin_40475396/article/details/80584461