すべてのプロダクト
Search
ドキュメントセンター

Object Storage Service:再開可能ダウンロード

最終更新日:Dec 14, 2023

サイズが5 GBを超える大きなオブジェクトをobject Storage Service (OSS) からローカルコンピューターにダウンロードすると、ネットワークの中断やプログラムのクラッシュにより、オブジェクトのダウンロードに失敗することがあります。 複数回の再試行後にオブジェクトのダウンロードに失敗した場合は、再開可能なダウンロードを使用できます。 オブジェクトを複数のパーツに分割し、パーツを並行してダウンロードして、ダウンロードを高速化できます。 再開可能なダウンロード中、ダウンロードの進行状況はチェックポイントファイルに記録されます。 パーツのダウンロードに失敗した場合、次のダウンロードはチェックポイントファイルに記録されている位置から開始されます。 すべてのパーツがダウンロードされると、すべてのパーツが完全なオブジェクトに結合されます。

前提条件

  • アーカイブオブジェクトのダウンロード: アーカイブオブジェクトが復元されるか、アーカイブオブジェクトが格納されているバケットに対してアーカイブオブジェクトのリアルタイムアクセスが有効になります。 詳細については、「オブジェクトの復元」および「アーカイブオブジェクトのリアルタイムアクセス」をご参照ください。

  • Cold ArchiveオブジェクトまたはDeep Cold Archiveオブジェクトのダウンロード: Cold ArchiveオブジェクトまたはDeep Cold Archiveオブジェクトが復元されます。 詳細については、「オブジェクトの復元」をご参照ください。

使用上の注意

再開可能なダウンロードは、OSS SDKを使用してのみ実行できます。 再開可能なダウンロードを行う場合は、次の項目に注意してください。

  • このトピックでは、中国 (杭州) リージョンのパブリックエンドポイントを使用します。 OSSと同じリージョンにある他のAlibaba Cloudサービスを使用してOSSにアクセスする場合は、内部エンドポイントを使用します。 OSSでサポートされているリージョンとエンドポイントの詳細については、「リージョンとエンドポイント」をご参照ください。

  • このトピックでは、アクセス資格情報は環境変数から取得します。 アクセス資格情報の設定方法の詳細については、「アクセス資格情報の設定」をご参照ください。

  • このトピックでは、OSSエンドポイントを使用してOSSClientインスタンスを作成します。 カスタムドメイン名またはSTS (Security Token Service) を使用してOSSClientインスタンスを作成する場合は、「初期化」をご参照ください。

  • 再開可能ダウンロードを使用するには、oss:GetObject権限が必要です。 詳細については、「RAMユーザーへのカスタムポリシーのアタッチ」をご参照ください。

  • OSS SDKは、ダウンロードの進行状況をチェックポイントファイルに記録します。 チェックポイントファイルに対する書き込み権限があることを確認してください。

  • チェックポイントファイルに含まれるチェックサムは変更できません。 チェックポイントファイルが破損している場合は、すべてのパーツを再度ダウンロードする必要があります。

  • オブジェクトのETagに一貫性がない場合、またはダウンロード中にパーツが失われたり変更されたりした場合は、オブジェクトを再度ダウンロードする必要があります。

OSS SDKの使用

次のサンプルコードは、一般的なプログラミング言語でOSS SDKを使用して再開可能なダウンロードを実行する方法の例を示しています。 他のプログラミング言語のOSS SDKを使用して再開可能なダウンロードを実行する方法の詳細については、「概要」をご参照ください。

Aliyun.OSSを使用した
com.aliyun.oss.OSSをインポートします。impor t com.aliyun.oss.com mon.auth.*;
com.aliyun.oss.OSSClientBuilderをインポートします。com.aliyun.oss.OSSExceptionをインポートします。com.aliyun.oss.mo delをインポートします。*;

public classデモ {
    public static void main(String[] args) throws Exception {
        // この例では、中国 (杭州) リージョンのエンドポイントが使用されます。 実際のエンドポイントを指定します。 
        String endpoint = "https://oss-cn-hangzhou.aliyuncs.com";
        // 環境変数からアクセス資格情報を取得します。 サンプルコードを実行する前に、OSS_ACCESS_KEY_IDおよびOSS_ACCESS_KEY_SECRET環境変数が設定されていることを確認してください。 
        EnvironmentVariableCredentialsProvider credentialsProvider = CredentialsProviderFactory.newEnvironmentVariableCredentialsProvider();
        // バケットの名前を指定します。 例: examplebucket. 
        String bucketName = "examplebucket";
        // オブジェクトのフルパスを指定します。 例: exampledir/exampleobject.txt。 バケット名をフルパスに含めないでください。 
        文字列objectName = "exampledir/exampleobject.txt";

        // Create an OSSClient instance. 
        OSS ossClient = new OSSClientBuilder().build(endpoint, credentialsProvider);
      	try {
            // 10個のパーツを同時にダウンロードできる再開可能なダウンロードを実行します。 
            DownloadFileRequest downloadFileRequest = new DownloadFileRequest(bucketName, objectName);
            // オブジェクトをダウンロードするフルパスを指定します。 例: D :\\ localpath\\examplefile.txt。 
            downloadFileRequest.setDownloadFile("D :\\ localpath\\examplefile.txt");
            // パーツサイズを指定します。 単位:バイト 有効な値: 100 KB〜5 GB。 デフォルトの部品サイズは100 KBです。 
            downloadFileRequest.setPartSize(1 * 1024 * 1024);
            // 再開可能ダウンロードタスクの同時スレッド数を指定します。 デフォルト値は 1 です。 
            downloadFileRequest.setTaskNum(10);
            // 再開可能ダウンロードを有効にするかどうかを指定します。 デフォルトでは、再開可能ダウンロードは無効になっています。 
            downloadFileRequest.setEnableCheckpoint(true);
            // チェックポイントファイルのフルパスを指定します。 例: D :\\ localpath\\examplefile.txt.dcp。 
            // ダウンロードが中断されると、チェックポイントファイルが生成されます。 ダウンロードタスクを再開する場合は、チェックポイントファイルのフルパスを指定する必要があります。 オブジェクトがダウンロードされた後、チェックポイントファイルは削除されます。 
            // downloadFileRequest.setCheckpointFile("D :\\ localpath\\examplefile.txt.dcp");

            // Download the object. 
            DownloadFileResult downloadRes = ossClient.downloadFile(downloadFileRequest);
            // オブジェクトがダウンロードされると、オブジェクトのメタデータが返されます。 
            ObjectMetadata objectMetadata = downloadRes.getObjectMetadata();
            System.out.println(objectMetadata.getETag());
            System.out.println(objectMetadata.getLastModified());
            System.out.println(objectMetadata.getUserMetadata().get("meta"));
        } catch (Exception e) {
            System.out.println("Caught an OSSException, which means your request made it to OSS, "
                    + "しかし、何らかの理由でエラー応答で拒否されました。");
            System.out.println("エラーメッセージ:" + oe.getErrorMessage());
            System.out.println("エラーコード:" + oe.getErrorCode());
            System.out.println("リクエストID:" + oe.getRequestId());
            System.out.println("ホストID:" + oe.getHostId());
        } catch (投げられるce) {
            System.out.println("Caught an ClientException, which means the client encountered "
                    + "a serious internal problem while trying to communicate with OSS, "
                    + 「ネットワークにアクセスできないなど」;
            System.out.println("エラーメッセージ:" + ce.getMessage());
        } 最後に{
            if (ossClient != null) {
                ossClient.shutdown();
            }
        }
    }
}
# -*-コーディング: utf-8 -*-
oss2のインポート
oss2.credentialsからEnvironmentVariableCredentialsProviderをインポート
# 環境変数からアクセス資格情報を取得します。 サンプルコードを実行する前に、環境変数OSS_ACCESS_KEY_IDとOSS_ACCESS_KEY_SECRETが設定されていることを確認してください。 
auth = oss2.ProviderAuth(EnvironmentVariableCredentialsProvider())
# バケットが配置されているリージョンのエンドポイントを指定します。 たとえば、バケットが中国 (杭州) リージョンにある場合、エンドポイントをhttps://oss-cn-hangzhou.aliyuncs.comに設定します。 
# バケットの名前を指定します。 例: examplebucket. 
bucket = oss2.Bucket(auth, 'https:// oss-cn-hangzhou.aliyuncs.com ', 'examplebucket')

# オブジェクトのフルパスを指定します。 バケット名をフルパスに含めないでください。 例: exampledir/exampleobject.txt。 
# ローカルファイルのフルパスを指定します。 例: D :\\ localpath\\examplefile.txt。 
oss2.resumable_download(bucket, 'exampledir/exampleobject.txt ', 'D :\\ localpath\\examplefile.txt')
# storeパラメーターでディレクトリを指定しない場合は、チェックポイント情報を格納するために、HOMEディレクトリにpy-oss-uploadディレクトリを作成します。 

# OSS SDK for Pythonバージョン2.1.0以降を使用する場合は、次のオプションパラメーターを設定できます。 
# インポートsys
## ダウンロードするデータの長さがわからない場合, total_bytesの値はNoneです。 
# defパーセンテージ (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()
※ storeパラメーターでディレクトリを指定すると, 指定したディレクトリにチェックポイント情報が格納されます。 num_threadsパラメーターを使用して同時ダウンロードスレッドの数を指定する場合は、oss2.defaults.connection_pool_sizeの値が同時ダウンロードスレッドの数以上であることを確認してください。 同時スレッドのデフォルト数は1です。 
# oss2.resumable_download (バケット、'exampledir/exampleobject.txt '、'D :\\ localpath\\examplefile.txt' 、# store=oss2.ResumableDownloadStore(root='/tmp') 、## オブジェクトの長さがmultipart_thresholdパラメーターの値以上の場合に再開可能なダウンロードを使用するように指定します。 multipart_thresholdパラメーターはオプションで、デフォルト値は10 MBです。 
# multiget_threshold=100*1024、## 各パーツのサイズを指定します。 単位:バイト 有効なパーツサイズは100 KB〜5 GBです。 デフォルトの部品サイズは100 KBです。 
# part_size=100*1024、## 再開可能ダウンロードタスクの進行状況を示すために使用するコールバック関数を設定します。 
# progress_callback=パーセンテージ、## num_threadsを使用して同時ダウンロードスレッド数を設定する場合は、oss2.defaults.connection_pool_sizeを同時ダウンロードスレッド数以上の値に設定します。 同時スレッドのデフォルト数は1です。 
# num_threads=4) 
;
Aliyun.OSS.Common; を使用

// バケットが配置されているリージョンのエンドポイントを指定します。 たとえば、バケットが中国 (杭州) リージョンにある場合、エンドポイントを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");
// バケットの名前を指定します。 例: examplebucket. 
var bucketName = "examplebucket";
// オブジェクトのフルパスを指定します。 バケット名をフルパスに含めないでください。 例: exampledir/exampleobject.txt。 
var objectName = "exampleobject.txt";
// オブジェクトをD :\\ localpathにダウンロードします。 オブジェクトがダウンロードされると、ローカルファイルの名前はexamplefile.txtになります。 同じ名前のファイルが既に存在する場合、ダウンロードされたオブジェクトはファイルを上書きします。 それ以外の場合、ダウンロードされたオブジェクトはパスに保存されます。 
// ダウンロードしたオブジェクトのパスを指定しない場合、ダウンロードしたオブジェクトはサンプルプログラムが属するプロジェクトのパスに保存されます。 
var downloadFilename = "D :\\ localpath\\examplefile.txt";
// チェックポイントファイルのフルパスを指定します。 例: D :\\ localpath\\examplefile.txt.dcp。 
// ダウンロードが中断されると、チェックポイントファイルが生成されます。 ダウンロードタスクを再開する場合は、チェックポイントファイルのフルパスを指定する必要があります。 オブジェクトがダウンロードされた後、チェックポイントファイルは削除されます。 
var checkpointDir = "D :\\ localpath\\examplefile.txt.dcp";
// OSSClientインスタンスを作成します。 
var client = new OssClient (エンドポイント、accessKeyId、accessKeySecret);
トライ
{
    // DownloadObjectRequestを使用して複数のパラメーターを設定します。 
    DownloadObjectRequest request = new DownloadObjectRequest(bucketName, objectName, downloadFilename)
    {
        // ダウンロードする各パーツのサイズを指定します。 単位:バイト 
        PartSize = 8 * 1024 * 1024,
        // 同時スレッドの数を指定します。 
        ParallelThreadCount = 3,
        // checkpointDirは、再開可能なダウンロードの進行状況に関する情報を格納するために使用されるファイルです。 パーツのダウンロードに失敗した場合は、checkpointDirファイルに記録されている進行状況に基づいてダウンロードタスクを再開できます。 checkpointDirをnullに設定すると、再開可能なダウンロードは有効にならず、ダウンロードに失敗した場合、オブジェクトは再度ダウンロードされます。 
        CheckpointDir = checkpointDir,
    };
    // Start the resumable download. 
    client.ResumableDownloadObject(request);
    Console.WriteLine("Resumable download object:{0} successed", objectName);
}
キャッチ (OssException ex)
{
    Console.WriteLine("Failed with error code: {0}; エラー情報: {1} 。 \nRequestID:{2}\tHostID:{3}"、
        ex.ErrorCode, ex.Message, ex.RequestId, ex.HostId);
}
キャッチ (例外ex)
{
    Console.WriteLine("Failed with error info: {0}" 、メッセージなど);
} 
パッケージメイン

import (import (import)
    "fmt"
    "os"
    「github.com/aliyun/aliyun-oss-go-sdk/oss」
)

func main() {
    /// 環境変数からアクセス資格情報を取得します。 サンプルコードを実行する前に、OSS_ACCESS_KEY_IDおよびOSS_ACCESS_KEY_SECRET環境変数が設定されていることを確認してください。 
    provider, err := oss.NewEnvironmentVariableCredentialsProvider()
    if err! =nil {
        fmt.Println("Error:", err)
        os.Exit(-1)
    }

    // Create an OSSClient instance. 
    // バケットが配置されているリージョンのエンドポイントを指定します。 たとえば、バケットが中国 (杭州) リージョンにある場合、エンドポイントをhttps://oss-cn-hangzhou.aliyuncs.comに設定します。 実際のエンドポイントを指定します。 
    client, err := oss.New("https://oss-cn-hangzhou.aliyuncs.com", ", ", ", oss.SetCredentialsProvider(&provider))
    if err! =nil {
        fmt.Println("Error:", err)
        os.Exit(-1)
    }

    // バケットの名前を指定します。 例: examplebucket. 
    bucket, err := client.Bucket("examplebucket")
    if err! =nil {
        fmt.Println("Error:", err)
        os.Exit(-1)
    }
    
    // オブジェクトのフルパスを指定します。 バケット名をフルパスに含めないでください。 例: exampledir/exampleobject.txt。 
    // ローカルファイルのフルパスを指定します。 例: D :\\ localpath\\examplefile.txt。 ローカルファイルのパスを指定しない場合、ダウンロードしたオブジェクトは、サンプルプログラムが属するプロジェクトのパスに保存されます。 
    // ダウンロードする各パーツのサイズを100 KB (100x1024) に設定し、同時ダウンロードパーツの数を3に設定します。 
    // oss.Checkpoint(true, "") 再開可能ダウンロードが有効になっていることを指定します。 デフォルトでは、チェックポイントファイルとダウンロードされたオブジェクトは同じディレクトリに保存され、同じ名前を共有します。 ただし、チェックポイントファイルの拡張子は. tempです。 また、oss.Checkpoint(true, "your-cp-file.temp") を使用して、チェックポイントファイルの名前を指定することもできます。 
    err = bucket.DownloadFile("file.zip", "D :\\ file.zip", 100*1024, oss.Routines(3), oss.Checkpoint(true, ""))
    if err! =nil {
        fmt.Println("Error:", err)
        os.Exit(-1)
    }
} 
#import "DownloadService.h"
# import "OSSTestMacros.h"

@ implementation DownloadRequest

@ end

@ implementationチェックポイント

- (instancetype)copyWithZone :( NSZone *)zone {
    Checkpoint * other = [[[self class] allocWithZone:zone] init];

    other.etag = self.etag;
    other.totalExpectedLength = self.totalExpectedLength;

    その他を返します。}

@ end


@ interface DownloadService()<NSURLSessionTaskDelegate, NSURLSessionDataDelegate>

@ property (nonatomic, strong) NSURLSession * session; // ネットワークセッション。 
@ property (non atomic, strong) NSURLSessionDataTask * dataTask; // データ要求タスク。 
@ property (nonatomic, copy) DownloadFailureBlock failure; // リクエストの失敗。 
@ property (nonatomic, copy) DownloadSuccessBlock success; // リクエストの成功。 
@ property (non atomic, copy) DownloadProgressBlock progress; // ダウンロードの進行状況。 
@ property (nonatomic, copy) Checkpoint * checkpoint; // チェックポイントファイル。 
@ property (非アトミック、コピー) NSString * requestURLString; // ダウンロード要求で使用されるオブジェクトリソースURL。 
@ property (非アトミック、コピー) NSString * headURLString; // HEAD要求で使用されるオブジェクトリソースURL。 
@ property (nonatomic, copy) NSString * targetPath; // オブジェクトが格納されるパス。 
@ property (nonatomic, assign) unsigned long totalReceivedContentLength; // ダウンロードしたコンテンツのサイズ。 
@ property (nonatomic, strong) dispatch_semaphore_t semaphore;

@ end

@ implementation DownloadService

- (instancetype)init
{
    self = [super init];
    if (self) {
        NSURLSessionConfiguration * conf = [NSURLSessionConfiguration defaultSessionConfiguration];
        conf.timeoutIntervalForRequest = 15;

        NSOperationQueue * processQueue = [NSOperationQueue new];
        _session = [NSURLSession sessionWithConfiguration:conf delegate:self delegateQueue:processQueue];
        _semaphore = dispatch_semaphore_create(0);
        _checkpoint = [[Checkpoint alloc] init];
    }
    自己を返す。}
// DownloadRequestはダウンロードロジックの中核です。 
+ (instancetype)downloadServiceWithRequest :( DownloadRequest *)request {
    DownloadService * service = [[DownloadService alloc] init];
    if (サービス) {
        service.failure = request.failure;
        service.success = request.success;
        service.requestURLString = request.sourceURLString;
        service.headURLString = request.headURLString;
        service.tar getPath = request.downloadFilePath;
        service.progress = request.downloadProgress;
        if (request.checkpoint) {
            service.checkpoint = request.checkpoint;
        }
    }
    帰りサービス;
}

/**
 * Headメソッドを呼び出してオブジェクト情報を取得します。 OSSは、オブジェクトのETagをローカルチェックポイントファイルに格納されているETagと比較し、比較結果を返します。 
 * /
- (BOOL)getFileInfo {
    __ブロックBOOL再開可能=NO;
    NSURL * url = [NSURL URLWithString:self.headURLString];
    NSMutableURLRequest * request = [[NSMutableURLRequest alloc]initWithURL:url];
    [リクエストsetHTTPMethod:@ "HEAD"];
    // オブジェクトに関する情報を処理します。 たとえば、ETagは再開可能なアップロード中の事前チェックに使用され、Content-Lengthヘッダーはダウンロードの進行状況を計算するために使用されます。 
    NSURLSessionDataTask * task = [[NSURLSession sharedSession] dataTaskWithRequest:request completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) {
        if (error) {
            NSLog(@ "オブジェクトメタデータの取得に失敗しました。 エラー: % @ ", エラー);
        } else {
            NSHTTPURLResponse * httpResponse = (NSHTTPURLResponse *)response;
            NSString * etag = [httpResponse.allHeaderFields objectForKey:@ "Etag"];
            if ([self.checkpoint.etag isEqualToString:etag]) {
                resumable = YES;
            } else {
                resumable = NO;
            }
        }
        dispatch_semaphore_signal(self.semaphore);
    }];
    [タスク再開];

    dispatch_semaphore_wait(self.semaphore, DISPATCH_TIME_FOREVER);
    resumableを返します;
}

/**
 * ローカルファイルのサイズを照会します。 
 * /
- (unsigned long long)fileSizeAtPath :( NSString *)filePath {
    unsigned long long fileSize = 0;
    NSFileManager * dfm = [NSFileManager defaultManager];
    if ([dfm fileExistsAtPath:filePath]) {
        NSError * error = nil;
        NSDictionary * attributes = [dfm attributesOfItemAtPath:filePathエラー:&エラー];
        if (!error && attributes) {
            fileSize = attributes.fileSize;
        } else if (エラー) {
            NSLog(@ "error: % @" 、エラー);
        }
    }

    fileSizeを返します。}

- (void)resume {
    NSURL * url = [NSURL URLWithString:self.requestURLString];
    NSMutableURLRequest * request = [[NSMutableURLRequest alloc]initWithURL:url];
    [リクエストsetHTTPMethod:@ "GET"];

    BOOL Resumable= [self getFileInfo]; // 再開可能フィールドの値がNOの場合、再開可能ダウンロード条件は満たされません。 
    if (再開可能) {
        self.totalReceivedContentLength = [self fileSizeAtPath:self.tar getPath];
        NSString * requestRange = [NSString stringWithFormat:@ "bytes=% llu-", self.totalReceivedContentLength];
        [リクエストsetValue:requestRange forHTTPHeaderField:@ "Range"];
    } else {
        self.totalReceivedContentLength = 0;
    }

    if (self.totalReceivedContentLength == 0) {
        [[NSFileManager defaultManager] createFileAtPath:self.tar getPathの内容: nil attributes:nil];
    }

    self.dataTask = [self.session dataTaskWithRequest: リクエスト];
    [self.dataTaskの履歴書];
}

- (void)pause {
    [self.dataTaskキャンセル];
    self.dataTask = nil;
}

- (void)cancel {
    [self.dataTaskキャンセル];
    self.dataTask = nil;
    [self removeFileAtPath: self.tar getPath];
}

- (void)removeFileAtPath :( NSString *)filePath {
    NSError * error = nil;
    [[NSFileManager defaultManager] removeItemAtPath:self.tar getPathエラー:&エラー];
    if (error) {
        NSLog(@ "エラーのあるファイルを削除: % @" 、エラー);
    }
}

# pragmaマーク-NSURLSessionDataDelegate

- (void)URLSession :( NSURLSession *) セッションタスク :( NSURLSessionTask *) タスク
// ダウンロードタスクが完了したかどうかを確認し、結果を上位レイヤーに返します。 
didCompleteWithError :( nullable NSError *)error {
    NSHTTPURLResponse * httpResponse = (NSHTTPURLResponse *)task.response;
    if ([httpResponse isKindOfClass:[NSHTTPURLResponseクラス]]) {
        if (httpResponse.statusCode == 200) {
            self.checkpoint.etag = [[httpResponse allHeaderFields] objectForKey:@ "Etag"];
            self.checkpoint.totalExpectedLength = httpResponse.expectedContentLength;
        } else if (httpResponse.statusCode == 206) {
            self.checkpoint.etag = [[httpResponse allHeaderFields] objectForKey:@ "Etag"];
            self.checkpoint.totalExpectedLength = self.totalReceivedContentLength + httpResponse.expectedContentLength;
        }
    }

    if (error) {
        if (self.failure) {
            NSMutableDictionary * userInfo = [NSMutableDictionary dictionaryWithDictionar y:error.us erInfo];
            [userInfo oss_setObject:self.checkpoint forKey:@ "checkpoint"];

            NSError * tError = [NSError errorWithDomain:error.domainコード: error.code userInfo:userInfo];
            self.failure(tError);
        }
    } else if (self.success) {
        self.success(@{@ "status": @ "success"});
    }
}

- (void)URLSession :( NSURLSession *)session dataTask :( NSURLSessionDataTask *)dataTask didReceiveResponse :( NSURLResponse *)response completionHandler :( void (^)(NSURLSessionResponseDisposition))completionHandler
{
    NSHTTPURLResponse * httpResponse = (NSHTTPURLResponse *)dataTask.response;
    if ([httpResponse isKindOfClass:[NSHTTPURLResponseクラス]]) {
        if (httpResponse.statusCode == 200) {
            self.checkpoint.totalExpectedLength = httpResponse.expectedContentLength;
        } else if (httpResponse.statusCode == 206) {
            self.checkpoint.totalExpectedLength = self.totalReceivedContentLength + httpResponse.expectedContentLength;
        }
    }

    completionHandler(NSURLSessionResponseAllow);
}
// 受信したネットワークデータを追加アップロードを使用してオブジェクトに書き込み、ダウンロードの進行状況を更新します。 
- (void)URLSession :( NSURLSession *)session dataTask :( NSURLSessionDataTask *)dataTask didReceiveData :( NSData *)data {

    NSFileHandle * fileHandle = [NSFileHandleForWritingAtPath: self.tar getPath];
    [fileHandle seekToEndOfFile];
    [fileHandle writeData: データ];
    [fileHandle closeFile];

    self.totalReceivedContentLength += data.length;
    if (self.progress) {
        self.progress(data.length、self.totalReceivedContentLength、self.checkpoint.totalExpectedLength);
    }
}

@ end 
#include <alibabacloud/oss/OssClient.h>
名前空間listaCloud::OSSを使用します。int main(void)
{
    /* OSSへのアクセスに使用されるアカウントに関する情報を初期化します。 */
            
    /* バケットが配置されているリージョンのエンドポイントを指定します。 たとえば、バケットが中国 (杭州) リージョンにある場合、エンドポイントをhttps://oss-cn-hangzhou.aliyuncs.comに設定します。 */
    std::stringエンドポイント="https://oss-cn-hangzhou.aliyuncs.com";
    /* バケットの名前を指定します。 例: examplebucket. */
    std::string BucketName = "examplebucket";
    /* オブジェクトのフルパスを指定します。 バケット名をフルパスに含めないでください。 例: exampledir/exampleobject.txt。 */
    std::string ObjectName = "exampledir/exampleobject.txt";
    /* examplefile.txtという名前のローカルファイルとして、ローカルパスD :\\ localpathにオブジェクトをダウンロードします。 指定されたパスに同じ名前のファイルがすでに存在する場合、ダウンロードされたオブジェクトはファイルを上書きします。 それ以外の場合、ダウンロードされたオブジェクトはパスに保存されます。 */
    /* ローカルファイルのパスを指定しない場合、ダウンロードしたオブジェクトはサンプルプログラムが属するプロジェクトのパスに保存されます。 */
    std::string DownloadFilePath = "D :\\ localpath\\examplefile.txt";
    /* チェックポイントファイルが保存されているディレクトリを指定し、指定されたディレクトリが存在することを確認します (D :\\ localpathなど) 。 */
    /* チェックポイントファイルは、ダウンロードが中断されると生成されます。 ダウンロードタスクを再開する場合は、チェックポイントファイルのフルパスを指定する必要があります。 オブジェクトがダウンロードされた後、チェックポイントファイルは削除されます。 */
    std::string CheckpointFilePath = "D :\\ localpath";

    /* ネットワークリソースなどのリソースを初期化します。 */
    InitializeSdk();

    ClientConfiguration conf;
    /* 環境変数からアクセス資格情報を取得します。 サンプルコードを実行する前に、OSS_ACCESS_KEY_IDおよびOSS_ACCESS_KEY_SECRET環境変数が設定されていることを確認してください。 */
    auto credentialsProvider = std::make_shared<EnvironmentVariableCredentialsProvider>();
    OssClientクライアント (Endpoint, credentialsProvider, conf);

    /* 再開可能ダウンロードを開始します。 */
    DownloadObjectRequestリクエスト (BucketName、ObjectName、DownloadFilePath、CheckpointFilePath);
    auto outcome = client.ResumableDownloadObject (リクエスト);

    if (!outcome.isSuccess()) {
        /* 例外を処理します。 */
        std::cout << "ResumableDownloadObject fail" <<
        ",code:" << outcome.error().Code() <<
        ",message:" << outcome.error().Message() <<
        ",requestId:" << outcome.error().RequestId() << std::endl;
        return -1;
    }

    /* ネットワークリソースなどのリソースを解放します。 */
    ShutdownSdk();
    0を返します。} 
#include "oss_api.h"
# 「aos_http_io.h」を含める
/* バケットが配置されているリージョンのエンドポイントを指定します。 たとえば、バケットが中国 (杭州) リージョンにある場合、エンドポイントをhttps://oss-cn-hangzhou.aliyuncs.comに設定します。 * /
const char * endpoint = "yourEndpoint";

/* バケットの名前を指定します。 例: examplebucket. * /
const char * bucket_name = "examplebucket";
/* オブジェクトのフルパスを指定します。 バケット名をフルパスに含めないでください。 例: exampledir/exampleobject.txt。 * /
const char * object_name = "exampledir/exampleobject.txt";
/* ローカルファイルのフルパスを指定します。 * /
const char * local_filename = "yourLocalFilename";
void init_options(oss_request_options_t * オプション)
{
    options->config = oss_config_create(options->pool);
    /* char * stringを使用して、aos_string_t型のデータを初期化します。 */
    aos_str_set(&options->config->endpoint, endpoint);
    /* 環境変数からアクセス資格情報を取得します。 サンプルコードを実行する前に、OSS_ACCESS_KEY_IDおよびOSS_ACCESS_KEY_SECRET環境変数が設定されていることを確認してください。 */    
    aos_str_set(&options->config->access_key_id, getenv("OSS_ACCESS_KEY_ID"));
    aos_str_set(&options->config->access_key_secret, getenv("OSS_ACCESS_KEY_SECRET"));
    /* CNAMEを使用するかどうかを指定します。 値0は、CNAMEが使用されないことを示す。 */
    options->config->is_cname = 0;
    /* タイムアウト時間などのネットワークパラメーターを指定します。 */
    options->ctl = aos_http_controller_create(options->pool, 0);
}
int main(int argc, char * argv[])
{
    /* main() でaos_http_io_initializeメソッドを呼び出して、ネットワークリソースやメモリリソースなどのグローバルリソースを初期化します。 */
    if (aos_http_io_initialize(NULL, 0))! =AOSE_OK) {
        exit(1);
    }
    /* メモリを管理するためのメモリプールを作成します。 aos_pool_tはapr_pool_tと同じです。 メモリプールの作成に使用されるコードは、APRライブラリに含まれています。 */
    aos_pool_t *pool;
    /* メモリプールを作成します。 2番目のパラメーターの値はNULLです。 この値は、プールが他のメモリプールを継承しないことを示します。 */
    aos_pool_create(&pool, NULL);
    /* Create and initialize options. このパラメーターには、エンドポイント、access_key_id、access_key_secret、is_cname、curlなどのグローバル構成情報が含まれます。 */
    oss_request_options_t *oss_client_options;
    /* メモリプール内のメモリリソースをオプションに割り当てます。 */
    oss_client_options = oss_request_options_create(pool);
    /* oss_client_optionsを初期化します。 */
    init_options(oss_client_options);
    /* パラメーターを初期化します。 */
    aos_string_t bucket;
    aos_string_t object;
    aos_string_t file;
    aos_table_t *headers = NULL;
    aos_table_t *resp_headers = NULL; 
    aos_status_t *resp_status = NULL; 
    oss_resumable_clt_params_t *clt_params;
    aos_str_set(&bucket, bucket_name);
    aos_str_set(&object, object_name);
    aos_str_set(&file, local_filename);
    /* 再開可能なダウンロードを実行してオブジェクトをダウンロードします。 */
    clt_params = oss_create_resumable_clt_params_content(pool, 1024 * 100, 3, AOS_TRUE, NULL);
    resp_status = oss_resumable_download_file(oss_client_options, &bucket, &object, &file, headers, NULL, clt_params, NULL, &resp_headers);
    if (aos_status_is_ok(resp_status)) {
        printf("download succeeded\n");
    } else {
        printf("download failed\n");
    }
    /* メモリプールを解放します。 この操作により、リクエストに割り当てられたメモリリソースが解放されます。 */
    aos_pool_destroy(pool);
    /* 割り当てられたグローバルリソースを解放します。 */
    aos_http_io_deinitialize();
    0を返します。} 
'aliyun/oss' が必要です

client = Aliyun::OSS::Client.new (
  # この例では、中国 (杭州) リージョンのエンドポイントが使用されます。 実際のエンドポイントを指定します。 
  エンドポイント: 'https:// oss-cn-hangzhou.aliyuncs.com '、
  # 環境変数からアクセス資格情報を取得します。 サンプルコードを実行する前に、OSS_ACCESS_KEY_IDおよびOSS_ACCESS_KEY_SECRET環境変数が設定されていることを確認してください。 
  access_key_id: ENV['OSS_ACCESS_KEY_ID '] 、
  access_key_secret: ENV['OSS_ACCESS_KEY_SECRET ']
)

# バケットの名前を指定します。 例: examplebucket. 
bucket = client.get_bucket('examplebucket')
# キーをオブジェクトのフルパスに設定します。 バケット名をフルパスに含めないでください。 例: exampledir/example.zip. 
# ファイルをローカルファイルのフルパスに設定します。 例: /tmp/example.zip。 
bucket.resumable_download('exampledir/example.zip ', '/tmp/example.zip ') do | p |
  「進捗状況: #{p} 」を置きます
終了

bucket.resumable_download (
  'exampledir/example.zip '、'/tmp/example.zip '、
  # cpt_fileをチェックポイントファイルのパスに設定します。 
  : part_size => 100*1024, :cpt_file => '/tmp/example.zip.cpt') { | p |
  「進捗状況: #{p} 」を置きます
} 

参考資料

  • OSSでは、バケットとオブジェクトのアクセス制御リスト (ACL) を設定できます。 このように、権限のないサードパーティユーザーはバケットからデータをダウンロードできません。 詳細については、「概要」をご参照ください。

  • ACLが非公開のバケットからオブジェクトをダウンロードする権限をサードパーティのユーザーに付与する場合は、STSを使用して一時的なアクセス資格情報を生成するか、署名付きURLを使用します。 詳細については、「サードパーティユーザーにオブジェクトのダウンロードを許可する」をご参照ください。