Django上傳檔案到AWS S3
阿新 • • 發佈:2019-02-03
上傳檔案到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, '*')
,搞定之……