最近公司項目須要使用阿里雲的oss存儲來線上實時存儲圖片文件。所以調研開發了python版本的阿里雲oss SDK。這裏咱們介紹一下oss以及python oss的經常使用方法。python
阿里雲對象存儲OSS(Object Storage Service)是阿里雲提供的海量、安全、低成本、高持久的雲存儲服務。其數據設計持久性不低於99.9999999999%(12個9),服務可用性(或業務連續性)不低於99.995%。
OSS具備與平臺無關的RESTful API接口,您能夠在任何應用、任什麼時候間、任何地點存儲和訪問任意類型的數據。
您可使用阿里雲提供的API、SDK接口或者OSS遷移工具輕鬆地將海量數據移入或移出阿里雲OSS。數據存儲到阿里雲OSS之後,您能夠選擇標準存儲(Standard)做爲移動應用、大型網站、圖片分享或熱點音視頻的主要存儲方式,也能夠選擇成本更低、存儲期限更長的低頻訪問存儲(Infrequent Access)、歸檔存儲(Archive)、冷歸檔存儲(Cold Archive)做爲不常常訪問數據的存儲方式。
以上是阿里雲官方對於oss的介紹,總結來看,就是其能夠提供高可用,高持久、低成本、支持多種文件及數據格式、支持RESTful API接口的雲存儲服務。就咱們實際使用來講確實還不錯,成本的話咱們申請的海外節點,30多T數據每個月差很少5000,也算比較低了。json
在代碼示例前,咱們先認識一些概念:安全
OSS提供標準、低頻訪問、歸檔、冷歸檔四種存儲類型,全面覆蓋從熱到冷的各類數據存儲場景。其中標準存儲類型提供高持久、高可用、高性能的對象存儲服務,可以支持頻繁的數據訪問;低頻訪問存儲類型適合長期保存不常常訪問的數據(平均每個月訪問頻率1到2次),存儲單價低於標準類型;歸檔存儲類型適合須要長期保存(建議半年以上)的歸檔數據;冷歸檔存儲適合須要超長時間存放的極冷數據。工具
存儲空間是您用於存儲對象(Object)的容器,全部的對象都必須隸屬於某個存儲空間。存儲空間具備各類配置屬性,包括地域、訪問權限、存儲類型等。您能夠根據實際需求,建立不一樣類型的存儲空間來存儲不一樣的數據。性能
對象是OSS存儲數據的基本單元,也被稱爲OSS的文件。對象由元信息(Object Meta)、用戶數據(Data)和文件名(Key)組成。對象由存儲空間內部惟一的Key來標識。對象元信息是一組鍵值對,表示了對象的一些屬性,例如最後修改時間、大小等信息,同時您也能夠在元信息中存儲一些自定義的信息。網站
地域表示OSS的數據中心所在物理位置。您能夠根據費用、請求來源等選擇合適的地域建立Bucket。阿里雲
Endpoint表示OSS對外服務的訪問域名。OSS以HTTP RESTful API的形式對外提供服務,當訪問不一樣地域的時候,須要不一樣的域名。經過內網和外網訪問同一個地域所須要的域名也是不一樣的。加密
AccessKey簡稱AK,指的是訪問身份驗證中用到的AccessKey Id和AccessKey Secret。OSS經過使用AccessKey Id和AccessKey Secret對稱加密的方法來驗證某個請求的發送者身份。AccessKey Id用於標識用戶;AccessKey Secret是用戶用於加密簽名字符串和OSS用來驗證簽名字符串的密鑰,必須保密。url
OssClient支持的方法:
一、上傳文件對象到oss存儲空間
二、上傳本地指定路徑文件到oss存儲空間
三、下載文件到文件流對象
四、下載文件到本地指定路徑
五、生成加簽的臨時URL以供授信用戶下載設計
以上功能基本能夠知足平常業務需求,固然oss也提供了不少個性化的操做,好比斷點下載、範圍下載、斷點上傳、追加上傳、上傳回調、圖片調整等等,這裏再也不贅述,都有專門的接口方法。
如下列舉了接口實現方法,並無在其中加入各類判斷邏輯,好比文件是否存在、權限控制、是否覆蓋、是否加密等等。有須要的能夠本身添加邏輯
import oss2 AccessKeyId = 'LTA************hpmoN9' AccessKeySecret = '0ise*************bkIyF' BucketName = '*******' Endpoint = 'http://oss-ap-south-1.aliyuncs.com' class OssClient(object): __instance = None __first_init = False # 單例模式 def __new__(cls, *args, **kwargs): if not cls.__instance: cls.__instance = super().__new__(cls) return cls.__instance def __init__(self): cls = self.__class__ if not cls.__first_init: self.auth = oss2.Auth(AccessKeyId, AccessKeySecret) self.bucket = oss2.Bucket(self.auth, Endpoint, BucketName) cls.__first_init = True def upload_file_from_fileobj(self): """ upload_file_from_fileobj方法:上傳文件對象到oss存儲空間, 該方法可用於咱們從上游服務接收了圖片參數,而後以二進制形式讀文件,上傳到oss存儲空間指定位置(abc/efg/00), 固然也能夠將本地文件上傳到oss咱們的bucket. 其中fileobj不止能夠是文件對象,也能夠是本地文件路徑。 put_object方法底層還是RESTful API的調用,能夠指定headers,規定Content-Type等內容 """ # 判斷bucket中文件是否存在,也能夠不判斷,會上傳更新 exist = self.bucket.object_exists('abc/efg/00') #<yourObjectName> if exist: return True with open('/home/rong/www/0', 'rb') as fileobj: result = self.bucket.put_object('abc/efg/00', fileobj, headers=None) #<yourObjectName> if result.status == 200: return True else: return False def upload_file_from_loaclfilepath(self): """ upload_file_from_loaclfilepath:上傳本地指定路徑文件(/home/rong/www/0)到oss存儲空間指定位置(abc/efg/0)。與put_object方法不一樣,put_object_from_file的第二個參數只能是本地文件路徑 """ # 判斷bucket中文件是否存在,也能夠不判斷,會上傳更新 exist = self.bucket.object_exists('abc/efg/0') #<yourObjectName> if exist: return True result = self.bucket.put_object_from_file('abc/efg/0', '/home/rong/www/0', headers=None) #(<yourObjectName>, <yourLocalFile>) if result.status == 200: return True else: return False def download_file_to_fileobj(self): """ download_file_to_fileobj:下載文件到文件流對象。因爲get_object接口返回的是一個stream流,須要執行read()後才能計算出返回Object數據的CRC checksum,所以須要在調用該接口後作CRC校驗。 """ object_stream = self.bucket.get_object('abc/efg/0') #<yourObjectName> result = object_stream.read() if object_stream.client_crc != object_stream.server_crc: print("The CRC checksum between client and server is inconsistent!") result = None return result def download_file_to_loaclfilepath(self): """ download_file_to_loaclfilepath:下載文件到本地路徑。get_object和get_object_to_file的區別是前者是獲取文件流實例,可用於代碼處理和遠程調用參賽。後者是存儲到本地路徑,返回的是一個http狀態的json結果 """ result = self.bucket.get_object_to_file('abc/efg/0', '/home/rong/www/download/0') # ('<yourObjectName>', '<yourLocalFile>') if result.status == 200: return True else: return False def generate_temporary_download_url(self): """ generate_temporary_download_url: 生成加簽的臨時URL以供授信用戶下載。通常在實際業務中,咱們是提供給調用方一個臨時下載連接,來讓其獲取文件數據,而不是直接使用以上暴露AccessKeyId和AccessKeySecret的方法。 所以通常咱們會存儲某條數據oss的路徑(<yourObjectName>)與調用方某個惟一標識的對應關係(如手機號身份證號),在調用方請求時,經過該標識獲取其數據的oss文件路徑(<yourObjectName>), 而後制定過時時間,爲其生成臨時下載連接 http://bucketname.oss-ap-south-1.aliyuncs.com/abc/efg/0?OSSAccessKeyId=LTA************oN9&Expires=1604638842&Signature=tPgvWz*************Uk%3D """ res_temporary_url = self.bucket.sign_url('GET', 'abc/efg/0', 60, slash_safe=True) return res_temporary_url if __name__ == '__main__': oss_client = OssClient() print(oss_client.bucket.bucket_name) print(oss_client.bucket.ACL) from itertools import islice for b in islice(oss2.ObjectIterator(oss_client.bucket), 10): print(b.key) ...