當下載大檔案時,如果網路不穩定或者程式異常退出,會導致下載失敗,甚至重試多次仍無法完成下載。為此,OSS提供了斷點續傳下載功能。斷點續傳下載將需要下載的檔案分成若干個分區分別下載,所有分區都下載完成後,將所有分區合并成完整的檔案。
注意事項
本文以華東1(杭州)外網Endpoint為例。如果您希望通過與OSS同地區的其他阿里雲產品訪問OSS,請使用內網Endpoint。關於OSS支援的Region與Endpoint的對應關係,請參見訪問網域名稱和資料中心。
本文以OSS網域名稱建立OSSClient為例。如果您希望通過自訂網域名、STS等方式建立OSSClient,請參見初始化。
要斷點續傳下載,您必須有
oss:GetObject
許可權。具體操作,請參見為RAM使用者授權自訂的權限原則。
範例程式碼
以下代碼用於斷點續傳下載:
using Aliyun.OSS;
using Aliyun.OSS.Common;
// yourEndpoint填寫Bucket所在地區對應的Endpoint。以華東1(杭州)為例,Endpoint填寫為https://oss-cn-hangzhou.aliyuncs.com。
var endpoint = "yourEndpoint";
// 從環境變數中擷取訪問憑證。運行本程式碼範例之前,請確保已設定環境變數OSS_ACCESS_KEY_ID和OSS_ACCESS_KEY_SECRET。
var accessKeyId = Environment.GetEnvironmentVariable("OSS_ACCESS_KEY_ID");
var accessKeySecret = Environment.GetEnvironmentVariable("OSS_ACCESS_KEY_SECRET");
// 填寫Bucket名稱,例如examplebucket。
var bucketName = "examplebucket";
// 填寫Object完整路徑,完整路徑中不能包含Bucket名稱,例如exampledir/exampleobject.txt。
var objectName = "exampleobject.txt";
// 下載Object到本地檔案examplefile.txt,並儲存到指定的本地路徑中(D:\\localpath)。如果指定的本地檔案存在會覆蓋,不存在則建立。
// 如果未指定本地路徑,則下載後的檔案預設儲存到樣本程式所屬專案對應本地路徑中。
var downloadFilename = "D:\\localpath\\examplefile.txt";
// 設定斷點記錄檔案的完整路徑,例如D:\\localpath\\examplefile.txt.dcp。
// 只有當Object下載中斷產生了斷點記錄檔案後,如果需要繼續下載該Object,才需要設定對應的斷點記錄檔案。下載完成後,該檔案會被刪除。
var checkpointDir = "D:\\localpath\\examplefile.txt.dcp";
// 建立OssClient執行個體。
var client = new OssClient(endpoint, accessKeyId, accessKeySecret);
try
{
// 通過DownloadObjectRequest設定多個參數。
DownloadObjectRequest request = new DownloadObjectRequest(bucketName, objectName, downloadFilename)
{
// 指定下載的分區大小,單位為位元組。
PartSize = 8 * 1024 * 1024,
// 指定並發線程數。
ParallelThreadCount = 3,
// checkpointDir用於儲存斷點續傳進度資訊。如果某一分區下載失敗,再次下載時會根據檔案中記錄的點繼續下載。如果checkpointDir為null,斷點續傳功能不會生效,每次失敗後都會重新下載。
CheckpointDir = checkpointDir,
};
// 斷點續傳下載。
client.ResumableDownloadObject(request);
Console.WriteLine("Resumable download object:{0} succeeded", objectName);
}
catch (OssException ex)
{
Console.WriteLine("Failed with error code: {0}; Error info: {1}. \nRequestID:{2}\tHostID:{3}",
ex.ErrorCode, ex.Message, ex.RequestId, ex.HostId);
}
catch (Exception ex)
{
Console.WriteLine("Failed with error info: {0}", ex.Message);
}
相關文檔
關於斷點續傳下載的API介面說明,請參見GetObject。