阅读背景:

Django上传文件到AWS S3

来源:互联网 

上传文件到Amazon S3

S3的介绍不赘述了。
对于python,s3提供了一个sdk,可以直接在terminal中安装:

pip install boto3

旧版的boto也可以用,但是推荐使用新版。
然后简单粗暴的新建一个服务:

s3 =boto3.resource('s3', 
aws_access_key_id='',
aws_secret_access_key='',
region_name='')

这里有个还没弄清楚的问题,使用公司aws的key,我可以在console里面操作bucket传文件,但是不能新建bucket。理论上新建bucket是不收费的~~,暂时没时间研究,留着待解决,好在我的任务是把某文件夹里面的*.js文件上传到s3上面的某个文件夹。那就快刀斩乱麻,切入主题。

拿到文件的绝对路径:

path = os.getcwd()+ relative_path
# 读取文件
files = glob.glob(path)
for f in files:
tail = f.path.split(f)[0] # 拿到文件名
data = open(f, 'rb')
s3.Bucket('ur_bucket_name').put_object(Key='dir/%s'%tail, Body=data) #这个key是bucket中文件夹和你上传文件的名称,不是秘钥什么鬼的。

前辈给了很多建议,确实自己写的太low了,不是完全能吃透大神的逼格,只能部分进行refactor。
关于路径,之前是一盘浆糊,稍微借助这个脚本的使用有了点点清晰的概念。之前没有提到放在哪里应用,是作为django的一个脚本来上传文件。尝试了点新的方法,就是把脚本放在django command中,在terminal里就是这个效果:
python manage.py upload_js -d 'abs_route'
具体怎么做,就是在某个app里面按照层级建目录,然后写一个类Command继承BaseCommand,重写handle()和add_arguments()的方法,这些都是必须且定死的套路,参考这里
往bucket里面put_object就是那个方法,主要就是如何设置路径参数~和组长商量以后,降低难度,参数就是上传文件或者文件夹的绝对路径。

import os
os.path.split()
or
url.split('/')[0]

都可以得到想要的部分。
最后还学了点AWS CLI的操作,比如:

显示内容 aws s3 ls s3://'some url'
删除某PREFIX下的全部文件 aws s3 rm --recursive s3://'some url'

组长提出cross platform的问题,windows下问价的目录是backslash。于是就得放弃那种path + ‘/*’ 的拼接方法。查找下,python提供了这种,简单的os.path.join(path, '*'),搞定之……


分享到: