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

Object Storage Service:再開可能なアップロード

最終更新日:Feb 22, 2024

ネットワークが不安定な場合、またはプログラムの例外が発生した場合、サイズが5 GBを超える大きなオブジェクトをobject Storage Service (OSS) にアップロードできません。 場合によっては、オブジェクトが何度もアップロードされないことがあります。 この場合、再開可能なアップロードを実行してラージオブジェクトをアップロードできます。 オブジェクトを複数のパーツに分割し、パーツを並行してアップロードすると、アップロードを高速化できます。 再開可能なアップロード中、アップロードの進行状況はチェックポイントファイルに記録されます。 パーツのアップロードに失敗した場合、次のアップロードはチェックポイントファイルに記録されている位置から開始されます。 すべてのパーツがアップロードされると、すべてのパーツが完全なオブジェクトに結合されます。

前提条件

バケット作成についての 詳細は、「バケットの作成」をご参照ください。

使用上の注意

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

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

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

  • チェックポイントファイルにはチェックサムが含まれています。 このチェックサムは変更できません。 チェックポイントファイルが破損している場合は、オブジェクトのすべての部分を再アップロードする必要があります。

  • アップロード中にローカルファイルが変更された場合は、オブジェクトのすべての部分を再アップロードする必要があります。

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) {
        // この例では、中国 (杭州) リージョンのエンドポイントが使用されます。 実際のエンドポイントを指定します。 
        String endpoint = "https://oss-cn-hangzhou.aliyuncs.com";
        // 環境変数からアクセス資格情報を取得します。 サンプルコードを実行する前に、OSS_ACCESS_KEY_IDおよびOSS_ACCESS_KEY_SECRET環境変数が設定されていることを確認してください。 
        EnvironmentVariableCredentialsProvider credentialsProvider = CredentialsProviderFactory.newEnvironmentVariableCredentialsProvider();

        // Create an OSSClient instance. 
        OSS ossClient = new OSSClientBuilder().build(endpoint, credentialsProvider);
        try {

            ObjectMetadata meta = new ObjectMetadata();
            // アップロードするコンテンツの種類を指定します。 
            meta.setContentType("text/plain");

            // アップロードするオブジェクトのアクセス制御リスト (ACL) を指定します。 
            // meta.setObjectAcl(CannedAccessControlList.Private);

            // UploadFileRequestを使用して複数のパラメーターを設定します。 
            // examplebucketなどのバケット名とexampledir/exampleobject.txtなどのオブジェクトの完全パスを指定します。 バケット名をフルパスに含めないでください。 
            UploadFileRequest uploadFileRequest = new UploadFileRequest("examplebucket","exampledir/exampleobject.txt");

            // UploadFileRequestを使用して単一のパラメーターを設定します。            
            // アップロードするローカルファイルのフルパスを指定します。 例: D :\\ localpath\\examplefile.txt。 デフォルトでは、ローカルファイルのパスを指定しない場合、サンプルプログラムが属するプロジェクトのローカルパスからファイルがアップロードされます。 
            uploadFileRequest.setUploadFile("D :\\ localpath\\examplefile.txt");
            // アップロードタスクの同時スレッド数を指定します。 デフォルト値は 1 です。 
            uploadFileRequest.setTaskNum(5);
            // パーツサイズを指定します。 単位:バイト 有効な値: 100 KB〜5 GB。 デフォルト値: 100 KB。 
            uploadFileRequest.setPartSize(1 * 1024 * 1024);
            // 再開可能アップロードを有効にするかどうかを指定します。 デフォルトでは、再開可能アップロードは無効になっています。 
            uploadFileRequest.setEnableCheckpoint(true);
            // 各パーツのアップロード結果を記録するチェックポイントファイルを指定します。 このチェックポイントファイルには、アップロードの進行状況に関する情報が格納されます。 パーツのアップロードに失敗した場合、チェックポイントファイルに記録された進行状況に基づいてタスクを続行できます。 ローカルファイルがアップロードされると、チェックポイントファイルは削除されます。 
            // デフォルトでは、このパラメーターを指定しないと、このチェックポイントファイルはアップロードするオブジェクトと同じディレクトリを共有します。 ディレクトリの名前は ${uploadFile}.ucpです。 
            uploadFileRequest.setCheckpointFile("yourCheckpointFile");
            // オブジェクトメタデータを設定します。 
            uploadFileRequest.setObjectMetadata(meta);
            // アップロードコールバックを設定します。 パラメータータイプはCallbackです。 
            // uploadFileRequest.setCallback("yourCallbackEvent");

            // Start resumable upload. 
            ossClient.uploadFile(uploadFileRequest);

        } 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());
        } 最後に{
                // Shut down the OSSClient instance. 
            if (ossClient != null) {
                ossClient.shutdown();
            }
        }
    }
} 
const OSS = require('ali-OSS ')

const client = new OSS({
  // バケットが配置されているリージョンを指定します。 たとえば、バケットが中国 (杭州) リージョンにある場合、リージョンをoss-cn-Hangzhouに設定します。 
  region: 'yourregion' 、
  // 環境変数からアクセス資格情報を取得します。 サンプルコードを実行する前に、OSS_ACCESS_KEY_IDおよびOSS_ACCESS_KEY_SECRET環境変数が設定されていることを確認してください。 
  accessKeyId: process.env.OSS_ACCESS_KEY_ID、
  accessKeySecret: process.env.OSS_ACCESS_KEY_SECRET、
  // バケットの名前を指定します。 
  bucket: 'examplebucket'
});

// アップロードされたファイルのローカルパスを指定します。 
const filePath = "yourfilepath";

チェックポイントを許可します。async関数resumeUpload() {
  // アップロードの再試行回数を5回に設定します。 
  for (let i = 0; i < 5; i ++) {
    try {
      const result = await client.multipartUpload('object-name', filePath, {
        チェックポイント、
        async progress(percentage, cpt) {
          checkpoint = cpt;
        },
      });
      console.log (結果);
      break; // ループから抜け出します。 
    } catch (e) {
      console.log(e);
    }
  }
}

resumeUpload();
# -*- coding: 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_upload (バケット、'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_upload(bucket, '<yourObjectName>', '<yourLocalFile>',
# store=oss2.ResumableStore(root='/tmp') 、## オブジェクトサイズがmultipart_thresholdの値以上の場合、マルチパートアップロードを使用するように指定します。 multipart_thresholdのデフォルト値は10 MBです。 
# multipart_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 = "exampledir/exampleobject.txt";
// アップロードするローカルファイルのフルパスを指定します。 例: D :\\ localpath\\examplefile.txt。 
// デフォルトでは、ローカルパスを指定せずにexamplefile.txtなどのローカルファイル名のみを指定すると、サンプルプログラムが属するプロジェクトのパスからローカルファイルがアップロードされます。 
var localFilename = "D :\\ localpath\\examplefile.txt";
// チェックポイントファイルを指定します。 チェックポイントファイルには、アップロードの進行状況に関する情報が格納されます。 
string checkpointDir = "yourCheckpointDir";
// OSSClientインスタンスを作成します。 
var client = new OssClient (エンドポイント、accessKeyId、accessKeySecret);
トライ
{
    // UploadFileRequestを使用してパラメーターを設定します。 
    UploadObjectRequest request = new UploadObjectRequest(bucketName, objectName, localFilename)
    {
        // 各パーツのサイズを指定します。 
        PartSize = 8 * 1024 * 1024,
        // 同時スレッドの数を指定します。 
        ParallelThreadCount = 3,
        // checkpointDirパラメーターを指定して、再開可能なアップロードタスクの状態を格納します。これは、アップロードタスクが失敗した場合にアップロードタスクを再開するために使用されます。 
        // checkpointDirをnullに設定すると、再開可能なアップロードは有効にならず、オブジェクトのアップロードに失敗した場合、オブジェクトは再アップロードされます。 
        CheckpointDir = checkpointDir,
    };
    // Start resumable upload. 
    client.ResumableUploadObject(request);
    Console.WriteLine("Resumable upload 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}" 、メッセージなど);
} 
// バケットの名前を指定します。 例: examplebucket. 
String bucketName = "examplebucket";
// オブジェクトのフルパスを指定します。 例: exampledir/exampleobject.txt。 オブジェクトのフルパスにバケット名を含めないでください。 
文字列objectName = "exampledir/exampleobject.txt";
// ローカルファイルのフルパスを指定します。 例: /storage/emulated/0/oss/examplefile.txt 
文字列localFilepath = "/storage/emulated/0/oss/examplefile.txt";

String recordDirectory = Environment.getExternalStorageDirectory().getAbsolutePath() + "/oss_record/";

ファイルrecordDir=新しいファイル (recordDirectory);

// チェックポイントファイルを格納するディレクトリが存在することを確認してください。 ディレクトリが存在しない場合は、ディレクトリを作成します。 
if (!recordDir.exists()) {
    recordDir.mkdirs();
}

// 再開可能なアップロードリクエストを作成し、チェックポイントファイルの絶対パスを指定します。 
ResumableUploadRequest request = new ResumableUploadRequest(bucketName、objectName、localFilepath、recordDirectory);
// OSSAsyncTask cancel() メソッドを使用する場合は、DeleteUploadOnCancellingパラメーターをfalseに設定します。 falseは、チェックポイントファイルが保持されていることを示します。 オブジェクトは、次のアップロード時にチェックポイントファイルに記録された位置からアップロードされます。 このパラメーターを指定しない場合、デフォルト値trueが使用されます。 Trueは、チェックポイントファイルが削除されたことを示します。 次のアップロード時にオブジェクト全体が再アップロードされます。 
request.setDeleteUploadOnCancelling(false);
// アップロードコールバックを設定します。 
request.setProgressCallback(new OSSProgressCallback<ResumableUploadRequest>() {
    @オーバーライド
    public void onProgress(ResumableUploadRequest request, long currentSize, long totalSize) {
        Log.d("resumableUpload" 、"currentSize: " + currentSize + "totalSize: " + totalSize);
    }
});


ResumableUploadResult uploadResult = oss.resumableUpload (リクエスト); 
パッケージメイン

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("yourEndpoint", ", " ", ", 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)
    }

    // UploadFileを使用して再開可能なアップロードを実行する場合、部品の数は10000を超えることはできません。 
    // アップロードするオブジェクトのサイズに基づいて、各パーツのサイズを指定します。 各パーツのサイズは100 KBから5 GBです。 デフォルト値: 100 KB (100x1024) 。 
    // oss.Routinesを使用して、並行してアップロードできるパーツの数を3に設定します。 
    // オブジェクトのフルパスを指定します。 バケット名をフルパスに含めないでください。 例: exampledir/exampleobject.txt。 
    // ローカルファイルのフルパスを指定します。 例: D :\\ localpath\\examplefile.txt。 デフォルトでは、ローカルファイルのパスを指定しない場合、サンプルプログラムが属するプロジェクトのパスからファイルがアップロードされます。 
    err = bucket.UploadFile("exampledir/exampleobject.txt", "D :\\ localpath\\examplefile.txt", 100*1024, oss.Routines(3), oss.Checkpoint(true, ""))
    if err! =nil {
        fmt.Println("Error:", err)
        os.Exit(-1)
    }
} 
// オブジェクトをアップロードするアップロードIDを取得します。 
OSSResumableUploadRequest * resumableUpload = [OSSResumableUploadRequest new];
resumableUpload.bucketName = <bucketName>;
// objectKeyは、再開可能アップロードを使用してOSSにアップロードするオブジェクトのフルパスを示すobjectNameと同等です。 パスには、オブジェクト名の拡張子を含める必要があります。 たとえば、objectKeyをabc/efg/123.jpg. に設定できます。
resumableUpload.objectKey = <objectKey>;
resumableUpload.partSize = 1024*1024;
resumableUpload.uploadProgress = ^(int64_t bytesSent, int64_t totalByteSent, int64_t totalBytesExpectedToSend) {
    NSLog(@ "% lld, % lld, % lld", bytesSent, totalByteSent, totalBytesExpectedToSend);
};
NSString * cachesDir = [NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES) firstObject];
// チェックポイントファイルを格納するパスを指定します。 
resumableUpload.recordDirectoryPath = cachesDir;
// deleteUploadIdOnCancellingパラメーターをNOに設定します。 NOは、アップロードタスクが失敗してもチェックポイントファイルが削除されないことを示します。 次のアップロードは、チェックポイントファイルに記録された位置から開始し、オブジェクト全体をアップロードします。 このパラメーターを指定しない場合、デフォルト値はYESになります。 YESは、アップロードタスクが失敗したときにチェックポイントファイルが削除されることを示します。 次のアップロード時にオブジェクト全体が再アップロードされます。 
resumableUpload.de leteUploadIdOnCancelling = NO;

resumableUpload.uploadingFileURL = [NSURL fileURLWithPath:<ファイルパス>];
OSSTask * resumeTask = [client resumableUpload:resumableUpload];
[resumeTask continueWithBlock:^ id(OSSTask * task) {
    if (task.error) {
        NSLog(@ "error: % @" 、task.error);
        if ([task.error.domain isEqualToString:OSSClientErrorDomain] && task.error.code == OSSClientErrorCodeCannotResumeUpload) {
            // タスクを再開できません。 オブジェクトをアップロードするには、新しいアップロードIDを取得する必要があります。 
        }
    } else {
        NSLog(@ "ファイルのアップロード成功");
    }
    nilを返します。}];

// [resumeTask waitUntilFinished];

// [resumableUploadキャンセル];
                    
#include <alibabacloud/oss/OssClient.h>
名前空間listaCloud::OSSを使用します。int main(void)
{
    /* OSSへのアクセスに使用されるアカウントに関する情報を初期化します。 */
            
    /* バケットが配置されているリージョンのエンドポイントを指定します。 たとえば、バケットが中国 (杭州) リージョンにある場合、エンドポイントをhttps://oss-cn-hangzhou.aliyuncs.comに設定します。 */
    std::string Endpoint = "yourEndpoint";
    /* バケットの名前を指定します。 例: examplebucket. */
    std::string BucketName = "examplebucket";
    /* オブジェクトのフルパスを指定します。 バケット名をフルパスに含めないでください。 例: exampledir/exampleobject.txt。 */
    std::string ObjectName = "exampledir/exampleobject.txt";
    /* ローカルファイルのフルパスを指定します。 例: D :\\ localpath\\examplefile.txt。 デフォルトでは、ローカルファイルのフルパスを指定しない場合、サンプルプログラムが属するプロジェクトのパスからローカルファイルがアップロードされます。 */
    std::string UploadFilePath = "D :\\ localpath\\examplefile.txt";
    /* チェックポイントファイルを指定します。 アップロードの進捗情報はこのファイルに格納されます。 部品のアップロードに失敗した場合、アップロードはファイルに記録された位置から続行されます。 ローカルファイルがアップロードされると、チェックポイントファイルは削除されます。 */
    /* チェックポイントファイルが保存されているディレクトリを指定し、指定されたディレクトリが存在することを確認します (D :\\ localなど) 。 このパラメーターを指定しない場合、このチェックポイントファイルはアップロードするローカルファイルと同じディレクトリを共有します。 */
    std::string CheckpointFilePath = "D :\\ local";

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

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

    /* 再開可能なアップロードを開始します。 */
    UploadObjectRequestリクエスト (BucketName, ObjectName, UploadFilePath, CheckpointFilePath);
    auto outcome = client.ResumableUploadObject (リクエスト);

    if (!outcome.isSuccess()) {
        /* 例外を処理します。 */
        std::cout << "ResumableUploadObject 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_list_t resp_body;
    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);
    aos_list_init(&resp_body);
    /* 再開可能なアップロードを開始します。 */
    clt_params = oss_create_resumable_clt_params_content(pool, 1024 * 100, 3, AOS_TRUE, NULL);
    resp_status = oss_resumable_upload_file(oss_client_options, &bucket, &object, &file, headers, NULL, clt_params, NULL, &resp_headers, &resp_body);
    if (aos_status_is_ok(resp_status)) {
        printf("resumable upload succeeded\n");
    } else {
        printf("resumable upload 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. 
# fileパラメーターをアップロードするローカルファイルのフルパスに設定します。 例: /tmp/example.zip。 
bucket.resumable_upload('exampledir/example.zip ', '/tmp/example.zip ') do | p |
  「進捗状況: #{p} 」を置きます
終了

bucket.resumable_upload (
  'exampledir/example.zip '、'/tmp/example.zip '、
  : part_size => 100*1024, :cpt_file => '/tmp/example.zip.cpt') { | p |
  「進捗状況: #{p} 」を置きます
}