1. 程式人生 > >Django上傳檔案到AWS S3

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, '*'),搞定之……