阿里雲團隊努力不懈,力求將最新的技術內容更快地以您最熟悉的語言呈現。本文由簡體中文內容自動轉碼而成,過程無人工干預。阿里雲不保證此自動轉碼的準確性、完整性及時效性。因轉碼造成的任何內容錯誤及因此可能帶來的損失,阿里雲概不負責,敬請見諒。本文内容請以簡體中文版本為準。
全部產品
Search
文件中心

下載檔案

更新時間: Oct 19, 2018

OSS Python SDK提供了豐富的檔案下載方式:

下載過程中,您還可以通過進度條功能查看下載進度。

流式下載

以下代碼用於流式下載檔案:

  1. # -*- coding: utf-8 -*-
  2. import oss2
  3. # 阿里雲主帳號AccessKey擁有所有API的存取權限,風險很高。強烈建議您建立並使用RAM帳號進行API訪問或日常運維,請登入 https://ram.console.aliyun.com 建立RAM帳號。
  4. auth = oss2.Auth('<yourAccessKeyId>', '<yourAccessKeySecret>')
  5. # Endpoint以杭州為例,其它Region請按實際情況填寫。
  6. bucket = oss2.Bucket(auth, 'http://oss-cn-hangzhou.aliyuncs.com', '<yourBucketName>')
  7. # bucket.get_object的傳回值是一個類檔案對象(File-Like Object),同時也是一個可迭代對象(Iterable)。
  8. object_stream = bucket.get_object('<yourObjectName>')
  9. print(object_stream.read())

以下代碼用於將資料下載到本地檔案中:

  1. import shutil
  2. # object_stream是類檔案對象,您可以使用shutil.copyfileobj方法,將資料下載到本地檔案中。
  3. object_stream = bucket.get_object('<yourObjectName>')
  4. with open('<yourLocalFile>', 'wb') as local_fileobj:
  5. shutil.copyfileobj(object_stream, local_fileobj)

以下代碼用於流式拷貝到另一個檔案中:

  1. # object_stream是一個可迭代對象,您可以將它流式拷貝到另一個檔案中。
  2. object_stream = bucket.get_object('<yourObjectName>')
  3. bucket.put_object('<yourBackupObjectName>', object_stream)

下載到本地檔案

以下代碼用於將指定OSS檔案下載到本地檔案中:

  1. # -*- coding: utf-8 -*-
  2. import oss2
  3. # 阿里雲主帳號AccessKey擁有所有API的存取權限,風險很高。強烈建議您建立並使用RAM帳號進行API訪問或日常運維,請登入 https://ram.console.aliyun.com 建立RAM帳號。
  4. auth = oss2.Auth('<yourAccessKeyId>', '<yourAccessKeySecret>')
  5. # Endpoint以杭州為例,其它Region請按實際情況填寫。
  6. bucket = oss2.Bucket(auth, 'http://oss-cn-hangzhou.aliyuncs.com', '<yourBucketName>')
  7. # 下載OSS檔案到本地檔案。如果指定的本地檔案存在會覆蓋,不存在則新建。
  8. bucket.get_object_to_file('<yourObjectName>', '<yourLocalFile>')

範圍下載

如果僅需要檔案中的部分資料,您可以使用範圍下載,下載指定範圍內的資料,代碼如下:

  1. # -*- coding: utf-8 -*-
  2. import oss2
  3. # 阿里雲主帳號AccessKey擁有所有API的存取權限,風險很高。強烈建議您建立並使用RAM帳號進行API訪問或日常運維,請登入 https://ram.console.aliyun.com 建立RAM帳號。
  4. auth = oss2.Auth('<yourAccessKeyId>', '<yourAccessKeySecret>')
  5. # Endpoint以杭州為例,其它Region請按實際情況填寫。
  6. bucket = oss2.Bucket(auth, 'http://oss-cn-hangzhou.aliyuncs.com', '<yourBucketName>')
  7. # 獲取0~99位元組範圍內的資料,包括0和99,共100個位元組的資料。如果指定的範圍無效(比如開始或結束位置的指定值為負數,或指定值大於檔案大小),則下載整個檔案。
  8. object_stream = bucket.get_object('<yourObjectName>', byte_range=(0, 99))

斷點續傳下載

當下載大檔案時,如果網路不穩定或者程式異常退出,會導致下載失敗,甚至重試多次仍無法完成下載。為此OSS提供了斷點續傳下載功能。

斷點續傳下載的流程如下:

  1. 在本地建立一個臨時檔案,檔案名由原檔案名加上一個隨機的尾碼組成。
  2. 通過指定HTTP請求的Range頭,按照範圍讀取OSS檔案,並寫入到臨時檔案裡相應的位置。
  3. 下載完成之後,把臨時檔案重新命名為目標檔案。如目標檔案已存在會覆蓋,不存在則新建。

您可以通過oss2.resumable_download方法斷點續傳下載,該方法中包含以下參數:

參數 描述 是否必需 預設值
bucket 儲存空間名稱。
key OSS檔案名稱。
filename 本地檔案。OSS檔案將下載到該檔案中。
store 記錄本地分區下載結果的檔案。下載過程中,斷點資訊會保存在此檔案中,如果下載中斷了,再次下載時會根據檔案中記錄的點繼續下載。 HOME目錄下建立的.py-oss-download目錄。
multipart_threshold 檔案長度大於該值時,則使用斷點續傳下載。 10MB
part_size 分區大小。 自動計算
progress_callback 下載進度回呼函數。
num_threads 並發下載的線程數。 1

以下代碼用於斷點續傳下載:

  1. # -*- coding: utf-8 -*-
  2. import oss2
  3. # 阿里雲主帳號AccessKey擁有所有API的存取權限,風險很高。強烈建議您建立並使用RAM帳號進行API訪問或日常運維,請登入 https://ram.console.aliyun.com 建立RAM帳號。
  4. auth = oss2.Auth('<yourAccessKeyId>', '<yourAccessKeySecret>')
  5. # Endpoint以杭州為例,其它Region請按實際情況填寫。
  6. bucket = oss2.Bucket(auth, 'http://oss-cn-hangzhou.aliyuncs.com', '<yourBucketName>')
  7. oss2.resumable_download(bucket, '<yourObjectName>', '<yourLocalFile>')

Python SDK 2.1.0以上版本支援設定選擇性參數進行斷點續傳下載,代碼如下:

  1. # -*- coding: utf-8 -*-
  2. import oss2
  3. # 阿里雲主帳號AccessKey擁有所有API的存取權限,風險很高。強烈建議您建立並使用RAM帳號進行API訪問或日常運維,請登入 https://ram.console.aliyun.com 建立RAM帳號。
  4. auth = oss2.Auth('<yourAccessKeyId>', '<yourAccessKeySecret>')
  5. # Endpoint以杭州為例,其它Region請按實際情況填寫。
  6. bucket = oss2.Bucket(auth, 'http://oss-cn-hangzhou.aliyuncs.com', '<yourBucketName>')
  7. # 請將oss2.defaults.connection_pool_size設成大於或等於線程數,並將part_size參數設成大於或等於oss2.defaults.multiget_part_size。
  8. oss2.resumable_download(bucket, '<yourObjectName>', '<yourLocalFile>',
  9. store=oss2.ResumableDownloadStore(root='/tmp'),
  10. multiget_threshold=20*1024*1024,
  11. part_size=10*1024*1024,
  12. num_threads=3)

說明:避免多個程式(線程)同時調用該方法下載同一個源檔案到同一個目標檔案中。因為斷點資訊會在本地磁碟上互相覆蓋,且臨時檔案名可能會衝突。

進度條

進度條用於指示上傳或下載的進度。下面的代碼以bucket.get_object_to_file方法為例,介紹如何使用進度條。

  1. # -*- coding: utf-8 -*-
  2. from __future__ import print_function
  3. import os, sys
  4. import oss2
  5. # 阿里雲主帳號AccessKey擁有所有API的存取權限,風險很高。強烈建議您建立並使用RAM帳號進行API訪問或日常運維,請登入 https://ram.console.aliyun.com 建立RAM帳號。
  6. auth = oss2.Auth('<yourAccessKeyId>', '<yourAccessKeySecret>')
  7. # Endpoint以杭州為例,其它Region請按實際情況填寫。
  8. bucket = oss2.Bucket(auth, 'http://oss-cn-hangzhou.aliyuncs.com', '<yourBucketName>')
  9. # 當HTTP回應標頭部沒有Content-Length時,total_bytes的值為None。
  10. def percentage(consumed_bytes, total_bytes):
  11. if total_bytes:
  12. rate = int(100 * (float(consumed_bytes) / float(total_bytes)))
  13. print('\r{0}% '.format(rate), end='')
  14. sys.stdout.flush()
  15. # progress_callback是選擇性參數,用於實現進度條功能。
  16. bucket.get_object_to_file('<yourObjectName>', '<yourLocalFile>', progress_callback=percentage)

進度條的完整範例程式碼請參見GitHub