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

Object Storage Service:オブジェクトのアップロード中のアップロード進捗状況を取得する

最終更新日:Apr 25, 2025

サイズの大きいオブジェクトを Object Storage Service (OSS) にアップロードする際に、OSS SDK が提供するアップロードプログレスバーを使用すると、アップロードステータスをリアルタイムで監視し、アップロードの完了に必要な残り時間を知ることができます。

OSS SDK を使用する

一般的なプログラミング言語の OSS SDK を使用して PutObject 操作を呼び出してオブジェクトをアップロードする際の、アップロード進捗状況を取得するためのサンプルコードを以下に示します。OSS SDK を使用して他の操作を呼び出してアップロードする際のアップロード進捗状況の取得方法については、「概要」をご参照ください。

Java

import com.aliyun.oss.ClientException;
import com.aliyun.oss.OSS;
import com.aliyun.oss.common.auth.*;
import com.aliyun.oss.OSSClientBuilder;
import com.aliyun.oss.OSSException;
import com.aliyun.oss.event.ProgressEvent;
import com.aliyun.oss.event.ProgressEventType;
import com.aliyun.oss.event.ProgressListener;
import com.aliyun.oss.model.PutObjectRequest;
import java.io.File;

// ProgressListener メソッドを使用してプログレスバーを使用します。
public class PutObjectProgressListenerDemo implements ProgressListener {
    private long bytesWritten = 0;
    private long totalBytes = -1;
    private boolean succeed = false;

    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。
        String objectName = "exampledir/exampleobject.txt";
        // ローカルファイルの完全なパスを指定します。例: D:\\localpath\\examplefile.txt。
        String pathName = "D:\\localpath\\examplefile.txt";
        // バケットが配置されているリージョンを指定します。たとえば、バケットが中国 (杭州) リージョンにある場合は、リージョンを cn-hangzhou に設定します。
        String region = "cn-hangzhou";

        // OSSClient インスタンスを作成します。
        ClientBuilderConfiguration clientBuilderConfiguration = new ClientBuilderConfiguration();
        clientBuilderConfiguration.setSignatureVersion(SignVersion.V4);        
        OSS ossClient = OSSClientBuilder.create()
        .endpoint(endpoint)
        .credentialsProvider(credentialsProvider)
        .clientConfiguration(clientBuilderConfiguration)
        .region(region)               
        .build();

        try {
            // オブジェクトをアップロードするときに、プログレスバーのパラメーターを指定します。この例では、PutObjectProgressListenerDemo は呼び出すクラスの名前を指定しています。実際のクラス名に置き換えてください。
            ossClient.putObject(new PutObjectRequest(bucketName,objectName, new File(pathName)).
                    <PutObjectRequest>withProgressListener(new PutObjectProgressListenerDemo()));
            // オブジェクトをダウンロードするときに、プログレスバーのパラメーターを指定します。この例では、GetObjectProgressListenerDemo は呼び出すクラスの名前を指定しています。実際のクラス名に置き換えてください。
//            ossClient.getObject(new GetObjectRequest(bucketName,objectName).
//                    <GetObjectRequest>withProgressListener(new GetObjectProgressListenerDemo()));

        } catch (OSSException oe) {
            System.out.println("Caught an OSSException, which means your request made it to OSS, "
                    + "but was rejected with an error response for some reason.");
            System.out.println("Error Message:" + oe.getErrorMessage());
            System.out.println("Error Code:" + oe.getErrorCode());
            System.out.println("Request ID:" + oe.getRequestId());
            System.out.println("Host ID:" + oe.getHostId());
        } catch (ClientException ce) {
            System.out.println("Caught an ClientException, which means the client encountered "
                    + "a serious internal problem while trying to communicate with OSS, "
                    + "such as not being able to access the network.");
            System.out.println("Error Message:" + ce.getMessage());
        } finally {
            if (ossClient != null) {
                ossClient.shutdown();
            }
        }
    }

    public boolean isSucceed() {
        return succeed;
    }

    // コールバックメソッドを書き換えて、プログレスバーを使用します。次のサンプルコードは例を示しています。
    @Override
    public void progressChanged(ProgressEvent progressEvent) {
        long bytes = progressEvent.getBytes();
        ProgressEventType eventType = progressEvent.getEventType();
        switch (eventType) {
            case TRANSFER_STARTED_EVENT:
                System.out.println("アップロード開始......");
                break;
            case REQUEST_CONTENT_LENGTH_EVENT:
                this.totalBytes = bytes;
                System.out.println(this.totalBytes + " バイトが OSS にアップロードされます");
                break;
            case REQUEST_BYTE_TRANSFER_EVENT:
                this.bytesWritten += bytes;
                if (this.totalBytes != -1) {
                    int percent = (int)(this.bytesWritten * 100.0 / this.totalBytes);
                    System.out.println(bytes + " バイトが書き込まれました。アップロードの進捗状況: " + percent + "%(" + this.bytesWritten + "/" + this.totalBytes + ")");
                } else {
                    System.out.println(bytes + " バイトが書き込まれました。アップロードの進捗状況: 不明" + "(" + this.bytesWritten + "/...)");
                }
                break;
            case TRANSFER_COMPLETED_EVENT:
                this.succeed = true;
                System.out.println("アップロード成功、" + this.bytesWritten + " バイトが転送されました");
                break;
            case TRANSFER_FAILED_EVENT:
                System.out.println("アップロード失敗、" + this.bytesWritten + " バイトが転送されました");
                break;
            default:
                break;
        }
    }
}

Python

# -*- coding: utf-8 -*-
from __future__ import print_function
import os
import sys
import oss2
from oss2.credentials import EnvironmentVariableCredentialsProvider
# 環境変数からアクセス認証情報を取得します。サンプルコードを実行する前に、OSS_ACCESS_KEY_ID および OSS_ACCESS_KEY_SECRET 環境変数が構成されていることを確認してください。
auth = oss2.ProviderAuthV4(EnvironmentVariableCredentialsProvider())

# バケットが配置されているリージョンのエンドポイントを指定します。たとえば、バケットが中国 (杭州) リージョンにある場合は、エンドポイントを https://oss-cn-hangzhou.aliyuncs.com に設定します。
endpoint = "https://oss-cn-hangzhou.aliyuncs.com"

# エンドポイントにマップするリージョンの ID を指定します。例: cn-hangzhou。署名アルゴリズム V4 を使用する場合は、このパラメーターが必要です。
region = "cn-hangzhou"

# バケットの名前を指定します。
bucket = oss2.Bucket(auth, endpoint, "yourBucketName", region=region)

# consumed_bytes は、アップロードされたデータのサイズを指定します。
# total_bytes は、アップロードするデータの合計サイズを指定します。アップロードするデータのサイズを特定できない場合、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.put_object('yourObjectName', 'a'*1024*1024, progress_callback=percentage)

.NET

using System;
using System.IO;
using System.Text;
using Aliyun.OSS;
using Aliyun.OSS.Common;
namespace PutObjectProgress
{
    class Program
    {
        static void Main(string[] args)
        {
            Program.PutObjectProgress();
            Console.ReadKey();
        }
        public static void PutObjectProgress()
        {
            // バケットが配置されているリージョンのエンドポイントを指定します。たとえば、バケットが中国 (杭州) リージョンにある場合は、エンドポイントを 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");
            // バケットの名前を指定します。
            var bucketName = "yourBucketName";
            // オブジェクトの完全なパスを指定します。完全なパスにはバケット名を含めないでください。
            var objectName = "yourObjectName";
            // アップロードするローカルファイルの完全なパスを指定します。この例では、パスは D:\\localpath\\examplefile.txt に設定されています。ローカルの examplefile.txt という名前のファイルは、D:\\localpath ディレクトリに保存されています。
            var localFilename = "yourLocalFilename";
            // バケットが配置されているリージョンを指定します。たとえば、バケットが中国 (杭州) リージョンにある場合は、リージョンを cn-hangzhou に設定します。
            const string region = "cn-hangzhou";
            // ClientConfiguration インスタンスを作成し、要件に基づいてデフォルトパラメーターを変更します。
            var conf = new ClientConfiguration();
            // 署名アルゴリズム V4 を使用します。
            conf.SignatureVersion = SignatureVersion.V4;
            
            // OSSClient インスタンスを作成します。
            var client = new OssClient(endpoint, accessKeyId, accessKeySecret, conf);
            client.SetRegion(region);
            // 指定されたプログレスバーを表示してオブジェクトをアップロードします。
            try
            {
                using (var fs = File.Open(localFilename, FileMode.Open))
                {
                    var putObjectRequest = new PutObjectRequest(bucketName, objectName, fs);
                    putObjectRequest.StreamTransferProgress += streamProgressCallback;
                    client.PutObject(putObjectRequest);
                }
                Console.WriteLine("オブジェクトの配置: {0} 成功", objectName);
            }
            catch (OssException ex)
            {
                Console.WriteLine("エラーコード: {0} で失敗しました。エラー情報: {1}。 \nRequestID: {2}\tHostID: {3}",
                    ex.ErrorCode, ex.Message, ex.RequestId, ex.HostId);
            }
            catch (Exception ex)
            {
                Console.WriteLine("エラー情報: {0} で失敗しました", ex.Message);
            }
        }
        // アップロードタスクの進捗状況を取得します。
        private static void streamProgressCallback(object sender, StreamTransferProgressArgs args)
        {
            System.Console.WriteLine("ProgressCallback - 進捗状況: {0}%, TotalBytes:{1}, TransferredBytes:{2} ",
                args.TransferredBytes * 100 / args.TotalBytes, args.TotalBytes, args.TransferredBytes);
        }
    }
}

Android

// アップロードリクエストを構築します。
// バケット名、オブジェクトの完全なパス、およびローカルファイルの完全なパスを指定します。この例では、バケット名は examplebucket、オブジェクトの完全なパスは exampledir/exampleobject.txt、ローカルファイルの完全なパスは /storage/emulated/0/oss/examplefile.txt です。
// オブジェクトの完全なパスにはバケット名を含めないでください。
PutObjectRequest put = new PutObjectRequest("examplebucket", "exampledir/exampleobject.txt", "/storage/emulated/0/oss/examplefile.txt");

// プログレスバーを表示するために、進捗状況コールバック関数を構成します。
put.setProgressCallback(new OSSProgressCallback<PutObjectRequest>() {
    @Override
    public void onProgress(PutObjectRequest request, long currentSize, long totalSize) {
        // currentSize は、オブジェクトのアップロードされた部分のサイズを指定します。単位: バイト。
        // totalSize は、アップロードするオブジェクトの合計サイズを指定します。単位: バイト。
        Log.d("PutObject", "currentSize: " + currentSize + " totalSize: " + totalSize);
    }
});

// ローカルファイルを非同期にアップロードします。
OSSAsyncTask task = oss.asyncPutObject(put, new OSSCompletedCallback<PutObjectRequest, PutObjectResult>() {
    @Override
    public void onSuccess(PutObjectRequest request, PutObjectResult result) {
        Log.d("PutObject", "UploadSuccess");
        Log.d("ETag", result.getETag());
        Log.d("RequestId", result.getRequestId());
    }

    @Override
    public void onFailure(PutObjectRequest request, ClientException clientExcepion, ServiceException serviceException) {
        // リクエストの例外を処理します。
        if (clientExcepion != null) {
            // ネットワーク例外などのクライアント例外を処理します。
            clientExcepion.printStackTrace();
        }
        if (serviceException != null) {
            // サービス例外を処理します。
            Log.e("ErrorCode", serviceException.getErrorCode());
            Log.e("RequestId", serviceException.getRequestId());
            Log.e("HostId", serviceException.getHostId());
            Log.e("RawMessage", serviceException.getRawMessage());
        }
    }
});
// task.cancel(); // ダウンロードタスクをキャンセルできます。
// task.waitUntilFinished(); // タスクが完了するまで待ちます。

PHP

<?php

// 依存ライブラリを読み込むために autoload ファイルを導入します。
require_once __DIR__ . '/../vendor/autoload.php';

use AlibabaCloud\Oss\V2 as Oss;

// コマンドラインパラメーターの説明を指定します。
$optsdesc = [
    "region" => ['help' => 'バケットが配置されているリージョン。', 'required' => True], // (必須) バケットが配置されているリージョンを指定します。
    "endpoint" => ['help' => '他のサービスが OSS にアクセスするために使用できるドメイン名。', 'required' => False], // (オプション) 他のサービスが OSS にアクセスするために使用できるエンドポイントを指定します。
    "bucket" => ['help' => 'バケットの名前', 'required' => True], // (必須) バケットの名前を指定します。
    "key" => ['help' => 'オブジェクトの名前', 'required' => True], // (必須) オブジェクトの名前を指定します。
];

// パラメーターの説明を、getopt が必要とする長いオプションリストに変換します。
// 各パラメーターの末尾にコロン (:) を追加して、値が必要であることを示します。
$longopts = \array_map(function ($key) {
    return "$key:";
}, array_keys($optsdesc));

// コマンドラインパラメーターを解析します。
$options = getopt("", $longopts);

// 必須パラメーターが構成されているかどうかを確認します。
foreach ($optsdesc as $key => $value) {
    if ($value['required'] === True && empty($options[$key])) {
        $help = $value['help']; // パラメーターに関するヘルプ情報を取得します。
        echo "エラー: 次の引数は必須です: --$key, $help";
        exit(1); // 必須パラメーターが構成されていない場合は、プログラムを終了します。
    }
}

// 解析されたパラメーターから値を取得します。
$region = $options["region"]; // バケットが配置されているリージョン。
$bucket = $options["bucket"]; // バケットの名前。
$key = $options["key"]; // オブジェクトの名前。

// EnvironmentVariableCredentialsProvider 変数からアクセス認証情報を取得します。
// ALIBABA_CLOUD_ACCESS_KEY_ID および ALIBABA_CLOUD_ACCESS_KEY_SECRET 環境変数が正しく構成されていることを確認してください。
$credentialsProvider = new Oss\Credentials\EnvironmentVariableCredentialsProvider();

// SDK のデフォルト設定を読み込みます。
$cfg = Oss\Config::loadDefault();
$cfg->setCredentialsProvider($credentialsProvider); // 認証プロバイダーを指定します。
$cfg->setRegion($region); // バケットが配置されているリージョンを指定します。

// endpoint パラメーターが指定されている場合は、カスタムドメイン名を指定します。
if (isset($options["endpoint"])) {
    $cfg->setEndpoint($options["endpoint"]);
}

// OSSClient インスタンスを作成します。
$client = new Oss\Client($cfg);

// アップロードするデータコンテンツを指定します。
$data = 'Hello OSS';

// PutObjectRequest リクエストを作成し、リクエストでバケット名とオブジェクト名を指定します。
$request = new Oss\Models\PutObjectRequest($bucket, $key);

// データコンテンツをストリームオブジェクトに変換します。
$request->body = Oss\Utils::streamFor($data);

// アップロード進捗状況コールバック関数を指定します。
$request->progressFn = function (int $increment, int $transferred, int $total) {
    echo sprint("アップロード済み:%d" . PHP_EOL, $transferred); // アップロードされたバイト数。
    echo sprint("今回のアップロード:%d" . PHP_EOL, $increment); // アップロードされた増分バイト数。
    echo sprint("合計データ:%d" . PHP_EOL, $total); // オブジェクトの合計サイズ。
    echo '-------------------------------------------'. PHP_EOL; // 点線区切り文字。
};

// putObject メソッドを使用してローカルファイルをアップロードします。
$result = $client->putObject($request);

// シンプルなアップロードリクエストの結果を表示します。
printf(
    'status code: %s' . PHP_EOL, $result->statusCode . // 返された HTTP ステータスコード。
    'request id: %s' . PHP_EOL, $result->requestId . // リクエスト ID。
    'etag: %s' . PHP_EOL, $result->etag // オブジェクトの ETag。
);

Go

package main

import (
	"context"
	"flag"
	"fmt"
	"log"

	"github.com/aliyun/alibabacloud-oss-go-sdk-v2/oss"
	"github.com/aliyun/alibabacloud-oss-go-sdk-v2/oss/credentials"
)

// グローバル変数を指定します。
var (
	region     string // バケットが配置されているリージョン。
	bucketName string // バケットの名前。
	objectName string // オブジェクトの名前。
)

// コマンドラインパラメーターを初期化するために使用される init 関数を指定します。
func init() {
	flag.StringVar(&region, "region", "", "バケットが配置されているリージョン。")
	flag.StringVar(&bucketName, "bucket", "", "バケットの名前。")
	flag.StringVar(&objectName, "object", "", "オブジェクトの名前。")
}

func main() {
	// コマンドラインパラメーターを解析します。
	flag.Parse()

	// バケット名が空かどうかを確認します。
	if len(bucketName) == 0 {
		flag.PrintDefaults()
		log.Fatalf("無効なパラメーター、バケット名が必要です")
	}

	// リージョンが空かどうかを確認します。
	if len(region) == 0 {
		flag.PrintDefaults()
		log.Fatalf("無効なパラメーター、リージョンが必要です")
	}

	// オブジェクト名が空かどうかを確認します。
	if len(objectName) == 0 {
		flag.PrintDefaults()
		log.Fatalf("無効なパラメーター、オブジェクト名が必要です")
	}

	// デフォルト設定を読み込み、認証プロバイダーとリージョンを指定します。
	cfg := oss.LoadDefaultConfig().
		WithCredentialsProvider(credentials.NewEnvironmentVariableCredentialsProvider()).
		WithRegion(region)

	// OSSClient インスタンスを作成します。
	client := oss.NewClient(cfg)

	// アップロードするローカルファイルのパスを指定します。例: /Users/localpath/exampleobject.txt。
	localFile := "/Users/localpath/exampleobject.txt"

	// ローカルファイルをアップロードするリクエストを作成します。
	putRequest := &oss.PutObjectRequest{
		Bucket: oss.Ptr(bucketName), // バケットの名前。
		Key:    oss.Ptr(objectName), // オブジェクトの名前。
		ProgressFn: func(increment, transferred, total int64) {
			fmt.Printf("increment:%v, transferred:%v, total:%v\n", increment, transferred, total)
		}, // アップロードの進捗状況をクエリするために使用される進捗状況コールバック関数を指定します。
	}

	// ローカルファイルをアップロードするリクエストを実行します。
	result, err := client.PutObjectFromFile(context.TODO(), putRequest, localFile)
	if err != null {
		log.Fatalf("ファイル %v からオブジェクトを配置できませんでした", err)
	}

	// オブジェクトのアップロード操作の結果を表示します。
	log.Printf("ファイルからのオブジェクトの配置結果:%#v\n", result)
}

iOS

OSSPutObjectRequest * put = [OSSPutObjectRequest new];
// バケットの名前を指定します。例: examplebucket。
put.bucketName = @"examplebucket";
// オブジェクトの完全なパスを指定します。完全なパスにはバケット名を含めないでください。例: exampledir/exampleobject.txt。
put.objectKey = @"exampledir/exampleobject.txt";
// アップロードするローカルファイルの完全なパスを指定します。
// デフォルトでは、ローカルファイルの完全なパスを指定しないと、サンプルプログラムが属するプロジェクトのパスからローカルファイルがアップロードされます。
put.uploadingFileURL = [NSURL fileURLWithPath:@"filePath"];
// プログレスバーを表示するために、進捗状況コールバック関数を構成します。
put.uploadProgress = ^(int64_t bytesSent, int64_t totalByteSent, int64_t totalBytesExpectedToSend) {
    // アップロードされているバイト数、アップロードされたバイトの合計数、およびアップロードするバイトの合計数を指定します。
    NSLog(@"%lld, %lld, %lld", bytesSent, totalByteSent, totalBytesExpectedToSend);
};
OSSTask * putTask = [client putObject:put];
[putTask continueWithBlock:^id(OSSTask *task) {
    if (!task.error) {
        NSLog(@"オブジェクトのアップロード成功!");
    } else {
        NSLog(@"オブジェクトのアップロード失敗、エラー: %@" , task.error);
    }
    return nil;
}];
// タスクが完了するまで同期ブロッキングを実装します。
// [putTask waitUntilFinished]; 

C++

#include <alibabacloud/oss/OssClient.h>
#include <fstream>
using namespace AlibabaCloud::OSS;

void ProgressCallback(size_t increment, int64_t transfered, int64_t total, void* userData)
{
    // increment は、コールバック関数によってアップロードされるデータのサイズを指定します。
    // transferred は、アップロードされたデータのサイズを指定します。
    // total は、アップロードするオブジェクトの合計サイズを指定します。
    std::cout << "ProgressCallback[" << userData << "] => " <<
    increment <<" ," << transfered << "," << total << std::endl;
}


int main(void)
{
    /* OSS にアクセスするために使用されるアカウントに関する情報を初期化します。 */
            
    /* バケットが配置されているリージョンのエンドポイントを指定します。たとえば、バケットが中国 (杭州) リージョンにある場合は、エンドポイントを https://oss-cn-hangzhou.aliyuncs.com に設定します。 */
    std::string Endpoint = "yourEndpoint";
    /* バケットが配置されているリージョンを指定します。たとえば、バケットが中国 (杭州) リージョンにある場合は、リージョンを cn-hangzhou に設定します。 */
    std::string Region = "yourRegion";
    /* バケットの名前を指定します。例: examplebucket。 */
    std::string BucketName = "examplebucket";
    /* オブジェクトの完全なパスを指定します。オブジェクトの完全なパスにはバケット名を含めないでください。例: exampledir/exampleobject.txt。 */
    std::string ObjectName = "exampledir/exampleobject.txt";

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

    ClientConfiguration conf;
    conf.signatureVersion = SignatureVersionType::V4;
    /* 環境変数からアクセス認証情報を取得します。サンプルコードを実行する前に、OSS_ACCESS_KEY_ID および OSS_ACCESS_KEY_SECRET 環境変数が構成されていることを確認してください。 */
    auto credentialsProvider = std::make_shared<EnvironmentVariableCredentialsProvider>();
    OssClient client(Endpoint, credentialsProvider, conf);
    client.SetRegion(Region);
  
    /* yourLocalFilename をローカルファイルの完全なパスに設定します。 */
    std::shared_ptr<std::iostream> content = std::make_shared<std::fstream>("yourLocalFilename", std::ios::in|std::ios::binary);
    PutObjectRequest request(BucketName, ObjectName, content);
  
    TransferProgress progressCallback = { ProgressCallback , nullptr };
    request.setTransferProgress(progressCallback);
   
    /* オブジェクトをアップロードします。 */
    auto outcome = client.PutObject(request);

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

    /* ネットワークリソースなどのリソースを解放します。 */
    ShutdownSdk();
    return 0;
}

C

#include "oss_api.h"
#include "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";
/* バケットが配置されているリージョンを指定します。たとえば、バケットが中国 (杭州) リージョンにある場合は、リージョンを cn-hangzhou に設定します。 */
const char *region = "yourRegion";
void init_options(oss_request_options_t *options)
{
    options->config = oss_config_create(options->pool);
    /* char* 文字列を使用して 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"));
    // 2 つの追加パラメーターを指定します。
    aos_str_set(&options->config->region, region);
    options->config->signature_version = 4;
    /* CNAME を使用するかど