OSS Python SDK提供了豐富的檔案下載方式:
下載過程中,您還可以通過進度條功能查看下載進度。
流式下載
以下代碼用於流式下載檔案:
# -*- coding: utf-8 -*-
import oss2
# 阿里雲主帳號AccessKey擁有所有API的存取權限,風險很高。強烈建議您建立並使用RAM帳號進行API訪問或日常運維,請登入 https://ram.console.aliyun.com 建立RAM帳號。
auth = oss2.Auth('<yourAccessKeyId>', '<yourAccessKeySecret>')
# Endpoint以杭州為例,其它Region請按實際情況填寫。
bucket = oss2.Bucket(auth, 'http://oss-cn-hangzhou.aliyuncs.com', '<yourBucketName>')
# bucket.get_object的傳回值是一個類檔案對象(File-Like Object),同時也是一個可迭代對象(Iterable)。
object_stream = bucket.get_object('<yourObjectName>')
print(object_stream.read())
以下代碼用於將資料下載到本地檔案中:
import shutil
# object_stream是類檔案對象,您可以使用shutil.copyfileobj方法,將資料下載到本地檔案中。
object_stream = bucket.get_object('<yourObjectName>')
with open('<yourLocalFile>', 'wb') as local_fileobj:
shutil.copyfileobj(object_stream, local_fileobj)
以下代碼用於流式拷貝到另一個檔案中:
# object_stream是一個可迭代對象,您可以將它流式拷貝到另一個檔案中。
object_stream = bucket.get_object('<yourObjectName>')
bucket.put_object('<yourBackupObjectName>', object_stream)
下載到本地檔案
以下代碼用於將指定OSS檔案下載到本地檔案中:
# -*- coding: utf-8 -*-
import oss2
# 阿里雲主帳號AccessKey擁有所有API的存取權限,風險很高。強烈建議您建立並使用RAM帳號進行API訪問或日常運維,請登入 https://ram.console.aliyun.com 建立RAM帳號。
auth = oss2.Auth('<yourAccessKeyId>', '<yourAccessKeySecret>')
# Endpoint以杭州為例,其它Region請按實際情況填寫。
bucket = oss2.Bucket(auth, 'http://oss-cn-hangzhou.aliyuncs.com', '<yourBucketName>')
# 下載OSS檔案到本地檔案。如果指定的本地檔案存在會覆蓋,不存在則新建。
bucket.get_object_to_file('<yourObjectName>', '<yourLocalFile>')
範圍下載
如果僅需要檔案中的部分資料,您可以使用範圍下載,下載指定範圍內的資料,代碼如下:
# -*- coding: utf-8 -*-
import oss2
# 阿里雲主帳號AccessKey擁有所有API的存取權限,風險很高。強烈建議您建立並使用RAM帳號進行API訪問或日常運維,請登入 https://ram.console.aliyun.com 建立RAM帳號。
auth = oss2.Auth('<yourAccessKeyId>', '<yourAccessKeySecret>')
# Endpoint以杭州為例,其它Region請按實際情況填寫。
bucket = oss2.Bucket(auth, 'http://oss-cn-hangzhou.aliyuncs.com', '<yourBucketName>')
# 獲取0~99位元組範圍內的資料,包括0和99,共100個位元組的資料。如果指定的範圍無效(比如開始或結束位置的指定值為負數,或指定值大於檔案大小),則下載整個檔案。
object_stream = bucket.get_object('<yourObjectName>', byte_range=(0, 99))
斷點續傳下載
當下載大檔案時,如果網路不穩定或者程式異常退出,會導致下載失敗,甚至重試多次仍無法完成下載。為此OSS提供了斷點續傳下載功能。
斷點續傳下載的流程如下:
- 在本地建立一個臨時檔案,檔案名由原檔案名加上一個隨機的尾碼組成。
- 通過指定HTTP請求的Range頭,按照範圍讀取OSS檔案,並寫入到臨時檔案裡相應的位置。
- 下載完成之後,把臨時檔案重新命名為目標檔案。如目標檔案已存在會覆蓋,不存在則新建。
您可以通過oss2.resumable_download方法斷點續傳下載,該方法中包含以下參數:
參數 | 描述 | 是否必需 | 預設值 |
---|---|---|---|
bucket | 儲存空間名稱。 | 是 | 無 |
key | OSS檔案名稱。 | 是 | 無 |
filename | 本地檔案。OSS檔案將下載到該檔案中。 | 是 | 無 |
store | 記錄本地分區下載結果的檔案。下載過程中,斷點資訊會保存在此檔案中,如果下載中斷了,再次下載時會根據檔案中記錄的點繼續下載。 | 否 | HOME目錄下建立的.py-oss-download目錄。 |
multipart_threshold | 檔案長度大於該值時,則使用斷點續傳下載。 | 否 | 10MB |
part_size | 分區大小。 | 否 | 自動計算 |
progress_callback | 下載進度回呼函數。 | 否 | 無 |
num_threads | 並發下載的線程數。 | 否 | 1 |
以下代碼用於斷點續傳下載:
# -*- coding: utf-8 -*-
import oss2
# 阿里雲主帳號AccessKey擁有所有API的存取權限,風險很高。強烈建議您建立並使用RAM帳號進行API訪問或日常運維,請登入 https://ram.console.aliyun.com 建立RAM帳號。
auth = oss2.Auth('<yourAccessKeyId>', '<yourAccessKeySecret>')
# Endpoint以杭州為例,其它Region請按實際情況填寫。
bucket = oss2.Bucket(auth, 'http://oss-cn-hangzhou.aliyuncs.com', '<yourBucketName>')
oss2.resumable_download(bucket, '<yourObjectName>', '<yourLocalFile>')
Python SDK 2.1.0以上版本支援設定選擇性參數進行斷點續傳下載,代碼如下:
# -*- coding: utf-8 -*-
import oss2
# 阿里雲主帳號AccessKey擁有所有API的存取權限,風險很高。強烈建議您建立並使用RAM帳號進行API訪問或日常運維,請登入 https://ram.console.aliyun.com 建立RAM帳號。
auth = oss2.Auth('<yourAccessKeyId>', '<yourAccessKeySecret>')
# Endpoint以杭州為例,其它Region請按實際情況填寫。
bucket = oss2.Bucket(auth, 'http://oss-cn-hangzhou.aliyuncs.com', '<yourBucketName>')
# 請將oss2.defaults.connection_pool_size設成大於或等於線程數,並將part_size參數設成大於或等於oss2.defaults.multiget_part_size。
oss2.resumable_download(bucket, '<yourObjectName>', '<yourLocalFile>',
store=oss2.ResumableDownloadStore(root='/tmp'),
multiget_threshold=20*1024*1024,
part_size=10*1024*1024,
num_threads=3)
說明:避免多個程式(線程)同時調用該方法下載同一個源檔案到同一個目標檔案中。因為斷點資訊會在本地磁碟上互相覆蓋,且臨時檔案名可能會衝突。
進度條
進度條用於指示上傳或下載的進度。下面的代碼以bucket.get_object_to_file方法為例,介紹如何使用進度條。
# -*- coding: utf-8 -*-
from __future__ import print_function
import os, sys
import oss2
# 阿里雲主帳號AccessKey擁有所有API的存取權限,風險很高。強烈建議您建立並使用RAM帳號進行API訪問或日常運維,請登入 https://ram.console.aliyun.com 建立RAM帳號。
auth = oss2.Auth('<yourAccessKeyId>', '<yourAccessKeySecret>')
# Endpoint以杭州為例,其它Region請按實際情況填寫。
bucket = oss2.Bucket(auth, 'http://oss-cn-hangzhou.aliyuncs.com', '<yourBucketName>')
# 當HTTP回應標頭部沒有Content-Length時,total_bytes的值為None。
def percentage(consumed_bytes, total_bytes):
if total_bytes:
rate = int(100 * (float(consumed_bytes) / float(total_bytes)))
print('\r{0}% '.format(rate), end='')
sys.stdout.flush()
# progress_callback是選擇性參數,用於實現進度條功能。
bucket.get_object_to_file('<yourObjectName>', '<yourLocalFile>', progress_callback=percentage)
進度條的完整範例程式碼請參見GitHub。