全部产品
Search
文档中心

Object Storage Service:Dapatkan kemajuan unggahan selama pengunggahan objek

更新时间:Jul 06, 2025

Saat mengunggah objek besar ke Object Storage Service (OSS), bilah kemajuan unggahan yang disediakan oleh SDK OSS memungkinkan Anda memantau status unggahan secara real-time serta melihat waktu tersisa untuk menyelesaikan proses tersebut.

Gunakan OSS SDK

Berikut adalah contoh kode untuk mendapatkan kemajuan unggahan saat memanggil operasi PutObject menggunakan OSS SDK dalam berbagai bahasa pemrograman. Untuk informasi lebih lanjut tentang cara mendapatkan kemajuan unggahan saat menggunakan operasi lain dengan OSS SDK, lihat Ikhtisar.

Java

import com.aliyun.oss.*;
import com.aliyun.oss.common.auth.*;
import com.aliyun.oss.common.comm.SignVersion;
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;

// Gunakan metode ProgressListener untuk menggunakan bilah kemajuan.
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 {
        // Dalam contoh ini, endpoint wilayah Tiongkok (Hangzhou) digunakan. Tentukan endpoint sebenarnya Anda. 
        String endpoint = "https://oss-cn-hangzhou.aliyuncs.com";
        // Dapatkan kredensial akses dari variabel lingkungan. Sebelum menjalankan kode contoh, pastikan variabel lingkungan OSS_ACCESS_KEY_ID dan OSS_ACCESS_KEY_SECRET telah dikonfigurasi. 
        EnvironmentVariableCredentialsProvider credentialsProvider = CredentialsProviderFactory.newEnvironmentVariableCredentialsProvider();
        // Tentukan nama bucket. Contoh: examplebucket. 
        String bucketName = "examplebucket";
        // Tentukan jalur lengkap objek. Jangan sertakan nama bucket dalam jalur lengkap. Contoh: exampledir\exampleobject.txt. 
        String objectName = "exampledir/exampleobject.txt";
        // Tentukan jalur lengkap file lokal. Contoh: D:\\localpath\\examplefile.txt. 
        String pathName = "D:\\localpath\\examplefile.txt";
        // Tentukan wilayah tempat bucket berada. Misalnya, jika bucket berada di wilayah Tiongkok (Hangzhou), atur wilayah menjadi cn-hangzhou.
        String region = "cn-hangzhou";

        // Buat instance OSSClient. 
        // Panggil metode shutdown untuk melepaskan sumber daya terkait ketika OSSClient tidak lagi digunakan.
        ClientBuilderConfiguration clientBuilderConfiguration = new ClientBuilderConfiguration();
        clientBuilderConfiguration.setSignatureVersion(SignVersion.V4);        
        OSS ossClient = OSSClientBuilder.create()
        .endpoint(endpoint)
        .credentialsProvider(credentialsProvider)
        .clientConfiguration(clientBuilderConfiguration)
        .region(region)               
        .build();

        try {
            // Tentukan parameter bilah kemajuan saat Anda mengunggah objek. Dalam contoh ini, PutObjectProgressListenerDemo menentukan nama kelas yang ingin Anda panggil. Ganti dengan nama kelas sebenarnya. 
            ossClient.putObject(new PutObjectRequest(bucketName,objectName, new File(pathName)).
                    <PutObjectRequest>withProgressListener(new PutObjectProgressListenerDemo()));
            // Tentukan parameter bilah kemajuan saat Anda mengunduh objek. Dalam contoh ini, GetObjectProgressListenerDemo menentukan nama kelas yang ingin Anda panggil. Ganti dengan nama kelas sebenarnya. 
//            ossClient.getObject(new GetObjectRequest(bucketName,objectName).
//                    <GetObjectRequest>withProgressListener(new GetObjectProgressListenerDemo()));

        } catch (OSSException oe) {
            System.out.println("Tangkap OSSException, yang berarti permintaan Anda sampai ke OSS, "
                    + "tetapi ditolak dengan respons kesalahan karena alasan tertentu.");
            System.out.println("Pesan Kesalahan:" + oe.getErrorMessage());
            System.out.println("Kode Kesalahan:" + oe.getErrorCode());
            System.out.println("ID Permintaan:" + oe.getRequestId());
            System.out.println("ID Host:" + oe.getHostId());
        } catch (ClientException ce) {
            System.out.println("Tangkap ClientException, yang berarti klien mengalami "
                    + "masalah internal serius saat mencoba berkomunikasi dengan OSS, "
                    + "seperti tidak dapat mengakses jaringan.");
            System.out.println("Pesan Kesalahan:" + ce.getMessage());
        } finally {
            if (ossClient != null) {
                ossClient.shutdown();
            }
        }
    }

    public boolean isSucceed() {
        return succeed;
    }

    // Tulis ulang metode callback untuk menggunakan bilah kemajuan. Kode contoh berikut memberikan contoh: 
    @Override
    public void progressChanged(ProgressEvent progressEvent) {
        long bytes = progressEvent.getBytes();
        ProgressEventType eventType = progressEvent.getEventType();
        switch (eventType) {
            case TRANSFER_STARTED_EVENT:
                System.out.println("Mulai mengunggah......");
                break;
            case REQUEST_CONTENT_LENGTH_EVENT:
                this.totalBytes = bytes;
                System.out.println(this.totalBytes + " byte akan diunggah ke 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 + " byte telah ditulis pada saat ini, kemajuan unggah: " + percent + "%(" + this.bytesWritten + "/" + this.totalBytes + ")");
                } else {
                    System.out.println(bytes + " byte telah ditulis pada saat ini, rasio unggah: tidak diketahui" + "(" + this.bytesWritten + "/...)");
                }
                break;
            case TRANSFER_COMPLETED_EVENT:
                this.succeed = true;
                System.out.println("Berhasil mengunggah, " + this.bytesWritten + " byte telah ditransfer secara total");
                break;
            case TRANSFER_FAILED_EVENT:
                System.out.println("Gagal mengunggah, " + this.bytesWritten + " byte telah ditransfer");
                break;
            default:
                break;
        }
    }
}

Python

# -*- coding: utf-8 -*-
from __future__ import print_function
import os
import sys
import oss2
from oss2.credentials import EnvironmentVariableCredentialsProvider
# Dapatkan kredensial akses dari variabel lingkungan. Sebelum menjalankan kode contoh, pastikan variabel lingkungan OSS_ACCESS_KEY_ID dan OSS_ACCESS_KEY_SECRET telah dikonfigurasi. 
auth = oss2.ProviderAuthV4(EnvironmentVariableCredentialsProvider())

# Tentukan endpoint wilayah tempat bucket berada. Misalnya, jika bucket berada di wilayah Tiongkok (Hangzhou), atur endpoint menjadi https://oss-cn-hangzhou.aliyuncs.com. 
endpoint = "https://oss-cn-hangzhou.aliyuncs.com"

# Tentukan ID wilayah yang sesuai dengan endpoint. Contoh: cn-hangzhou. Parameter ini diperlukan jika Anda menggunakan algoritma tanda tangan V4.
region = "cn-hangzhou"

# Tentukan nama bucket Anda.
bucket = oss2.Bucket(auth, endpoint, "yourBucketName", region=region)

# consumed_bytes menentukan ukuran data yang telah diunggah. 
# total_bytes menentukan ukuran total data yang ingin Anda unggah. Jika ukuran data yang ingin Anda unggah tidak dapat ditentukan, nilai parameter total_bytes adalah 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 adalah parameter opsional yang digunakan untuk mengembalikan informasi kemajuan. 
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()
        {
            // Tentukan endpoint wilayah tempat bucket berada. Misalnya, jika bucket berada di wilayah Tiongkok (Hangzhou), atur endpoint menjadi https://oss-cn-hangzhou.aliyuncs.com. 
            var endpoint = "yourEndpoint";
            // Dapatkan kredensial akses dari variabel lingkungan. Sebelum menjalankan kode contoh, pastikan variabel lingkungan OSS_ACCESS_KEY_ID dan OSS_ACCESS_KEY_SECRET telah dikonfigurasi. 
            var accessKeyId = Environment.GetEnvironmentVariable("OSS_ACCESS_KEY_ID");
            var accessKeySecret = Environment.GetEnvironmentVariable("OSS_ACCESS_KEY_SECRET");
            // Tentukan nama bucket. 
            var bucketName = "yourBucketName";
            // Tentukan jalur lengkap objek. Jangan sertakan nama bucket dalam jalur lengkap. 
            var objectName = "yourObjectName";
            // Tentukan jalur lengkap file lokal untuk diunggah. Dalam contoh ini, jalurnya diatur ke D:\\localpath\\examplefile.txt. File lokal bernama examplefile.txt disimpan di direktori D:\\localpath. 
            var localFilename = "yourLocalFilename";
            // Tentukan wilayah tempat bucket berada. Misalnya, jika bucket berada di wilayah Tiongkok (Hangzhou), atur wilayah menjadi cn-hangzhou.
            const string region = "cn-hangzhou";
            // Buat instance ClientConfiguration dan ubah parameter default berdasarkan kebutuhan Anda.
            var conf = new ClientConfiguration();
            // Gunakan algoritma tanda tangan V4.
            conf.SignatureVersion = SignatureVersion.V4;
            
            // Buat instance OSSClient.
            var client = new OssClient(endpoint, accessKeyId, accessKeySecret, conf);
            client.SetRegion(region);
            // Unggah objek dengan bilah kemajuan yang ditentukan. 
            try
            {
                using (var fs = File.Open(localFilename, FileMode.Open))
                {
                    var putObjectRequest = new PutObjectRequest(bucketName, objectName, fs);
                    putObjectRequest.StreamTransferProgress += streamProgressCallback;
                    client.PutObject(putObjectRequest);
                }
                Console.WriteLine("Put object:{0} berhasil", objectName);
            }
            catch (OssException ex)
            {
                Console.WriteLine("Gagal dengan kode kesalahan: {0}; Info kesalahan: {1}. \nRequestID: {2}\tHostID: {3}",
                    ex.ErrorCode, ex.Message, ex.RequestId, ex.HostId);
            }
            catch (Exception ex)
            {
                Console.WriteLine("Gagal dengan info kesalahan: {0}", ex.Message);
            }
        }
        // Dapatkan kemajuan tugas unggahan. 
        private static void streamProgressCallback(object sender, StreamTransferProgressArgs args)
        {
            System.Console.WriteLine("ProgressCallback - Kemajuan: {0}%, TotalBytes:{1}, TransferredBytes:{2} ",
                args.TransferredBytes * 100 / args.TotalBytes, args.TotalBytes, args.TransferredBytes);
        }
    }
}

Android

// Konstruksi permintaan unggahan. 
// Tentukan nama bucket, jalur lengkap objek, dan jalur lengkap file lokal. Dalam contoh ini, nama bucket adalah examplebucket, jalur lengkap objek adalah exampledir/exampleobject.txt, dan jalur lengkap file lokal adalah /storage/emulated/0/oss/examplefile.txt. 
// Jangan sertakan nama bucket dalam jalur lengkap objek. 
PutObjectRequest put = new PutObjectRequest("examplebucket", "exampledir/exampleobject.txt", "/storage/emulated/0/oss/examplefile.txt");

// Konfigurasikan fungsi callback kemajuan untuk menampilkan bilah kemajuan. 
put.setProgressCallback(new OSSProgressCallback<PutObjectRequest>() {
    @Override
    public void onProgress(PutObjectRequest request, long currentSize, long totalSize) {
        // currentSize menentukan ukuran bagian objek yang diunggah. Unit: byte. 
        // totalSize menentukan ukuran total objek yang ingin Anda unggah. Unit: byte. 
        Log.d("PutObject", "currentSize: " + currentSize + " totalSize: " + totalSize);
    }
});

// Unggah file lokal secara asinkron. 
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) {
        // Tangani pengecualian permintaan. 
        if (clientExcepion != null) {
            // Tangani pengecualian klien, seperti pengecualian jaringan. 
            clientExcepion.printStackTrace();
        }
        if (serviceException != null) {
            // Tangani pengecualian layanan. 
            Log.e("ErrorCode", serviceException.getErrorCode());
            Log.e("RequestId", serviceException.getRequestId());
            Log.e("HostId", serviceException.getHostId());
            Log.e("RawMessage", serviceException.getRawMessage());
        }
    }
});
// task.cancel(); // Anda dapat membatalkan tugas unduhan. 
// task.waitUntilFinished(); // Tunggu hingga tugas selesai.

PHP

<?php

// Perkenalkan file autoload untuk memuat pustaka dependen.
require_once __DIR__ . '/../vendor/autoload.php';

use AlibabaCloud\Oss\V2 as Oss;

// Tentukan deskripsi untuk parameter baris perintah.
$optsdesc = [
    "region" => ['help' => 'Wilayah tempat bucket berada.', 'required' => True], // (Wajib) Tentukan wilayah tempat bucket berada.
    "endpoint" => ['help' => 'Nama domain yang dapat digunakan layanan lain untuk mengakses OSS.', 'required' => False], // (Opsional) Tentukan endpoint yang dapat digunakan layanan lain untuk mengakses OSS.
    "bucket" => ['help' => 'Nama bucket', 'required' => True], // (Wajib) Tentukan nama bucket.
    "key" => ['help' => 'Nama objek', 'required' => True], // (Wajib) Tentukan nama objek.
];

// Ubah deskripsi parameter menjadi daftar opsi panjang yang diperlukan oleh getopt.
// Tambahkan titik dua (:) di akhir setiap parameter untuk menunjukkan bahwa nilai diperlukan.
$longopts = \array_map(function ($key) {
    return "$key:";
}, array_keys($optsdesc));

// Parsing parameter baris perintah.
$options = getopt("", $longopts);

// Periksa apakah parameter yang diperlukan telah dikonfigurasi.
foreach ($optsdesc as $key => $value) {
    if ($value['required'] === True && empty($options[$key])) {
        $help = $value['help']; // Dapatkan informasi bantuan tentang parameter.
        echo "Error: argumen berikut diperlukan: --$key, $help";
        exit(1); // Jika parameter yang diperlukan tidak dikonfigurasi, keluar dari program.
    }
}

// Dapatkan nilai dari parameter yang telah diparsing.
$region = $options["region"]; // Wilayah tempat bucket berada.
$bucket = $options["bucket"]; // Nama bucket.
$key = $options["key"]; // Nama objek.

// Dapatkan kredensial akses dari variabel EnvironmentVariableCredentialsProvider.
// Pastikan variabel lingkungan ALIBABA_CLOUD_ACCESS_KEY_ID dan ALIBABA_CLOUD_ACCESS_KEY_SECRET dikonfigurasi dengan benar.
$credentialsProvider = new Oss\Credentials\EnvironmentVariableCredentialsProvider();

// Muat konfigurasi default SDK.
$cfg = Oss\Config::loadDefault();
$cfg->setCredentialsProvider($credentialsProvider); // Tentukan penyedia kredensial.
$cfg->setRegion($region); // Tentukan wilayah tempat bucket berada.

// Jika parameter endpoint diberikan, tentukan nama domain kustom.
if (isset($options["endpoint"])) {
    $cfg->setEndpoint($options["endpoint"]);
}

// Buat instance OSSClient.
$client = new Oss\Client($cfg);

// Tentukan konten data yang ingin Anda unggah.
$data = 'Hello OSS';

// Buat permintaan PutObjectRequest dan tentukan nama bucket dan nama objek dalam permintaan.
$request = new Oss\Models\PutObjectRequest($bucket, $key);

// Ubah konten data menjadi objek stream.
$request->body = Oss\Utils::streamFor($data);

// Tentukan fungsi callback kemajuan unggahan.
$request->progressFn = function (int $increment, int $transferred, int $total) {
    echo sprint("Uploaded:%d" . PHP_EOL, $transferred); // Jumlah byte yang diunggah.
    echo sprint("This upload:%d" . PHP_EOL, $increment); // Jumlah byte tambahan yang diunggah.
    echo sprint("Total data:%d" . PHP_EOL, $total); // Ukuran total objek.
    echo '-------------------------------------------'. PHP_EOL; // Pembatas garis putus-putus.
};

// Gunakan metode putObject untuk mengunggah file lokal.
$result = $client->putObject($request);

// Tampilkan hasil permintaan unggahan sederhana.
printf(
    'status code: %s' . PHP_EOL, $result->statusCode . // Kode status HTTP yang dikembalikan.
    'request id: %s' . PHP_EOL, $result->requestId . // ID permintaan.
    'etag: %s' . PHP_EOL, $result->etag // ETag objek.
);

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"
)

// Tentukan variabel global.
var (
	region     string // Wilayah tempat bucket berada.
	bucketName string // Nama bucket.
	objectName string // Nama objek.
)

// Tentukan fungsi init yang digunakan untuk menginisialisasi parameter baris perintah.
func init() {
	flag.StringVar(&region, "region", "", "Wilayah tempat bucket berada.")
	flag.StringVar(&bucketName, "bucket", "", "Nama bucket.")
	flag.StringVar(&objectName, "object", "", "Nama objek.")
}

func main() {
	// Parsing parameter baris perintah.
	flag.Parse()

	// Periksa apakah nama bucket kosong.
	if len(bucketName) == 0 {
		flag.PrintDefaults()
		log.Fatalf("parameter tidak valid, nama bucket diperlukan")
	}

	// Periksa apakah wilayah kosong.
	if len(region) == 0 {
		flag.PrintDefaults()
		log.Fatalf("parameter tidak valid, wilayah diperlukan")
	}

	// Periksa apakah nama objek kosong.
	if len(objectName) == 0 {
		flag.PrintDefaults()
		log.Fatalf("parameter tidak valid, nama objek diperlukan")
	}

	// Muat konfigurasi default dan tentukan penyedia kredensial dan wilayah.
	cfg := oss.LoadDefaultConfig().
		WithCredentialsProvider(credentials.NewEnvironmentVariableCredentialsProvider()).
		WithRegion(region)

	// Buat instance OSSClient.
	client := oss.NewClient(cfg)

	// Tentukan jalur file lokal yang ingin Anda unggah. Contoh: /Users/localpath/exampleobject.txt.
	localFile := "/Users/localpath/exampleobject.txt"

	// Buat permintaan untuk mengunggah file lokal.
	putRequest := &oss.PutObjectRequest{
		Bucket: oss.Ptr(bucketName), // Nama bucket.
		Key:    oss.Ptr(objectName), // Nama objek.
		ProgressFn: func(increment, transferred, total int64) {
			fmt.Printf("increment:%v, transferred:%v, total:%v\n", increment, transferred, total)
		}, // Tentukan fungsi callback kemajuan yang digunakan untuk memeriksa kemajuan unggahan.
	}

	// Eksekusi permintaan untuk mengunggah file lokal.
	result, err := client.PutObjectFromFile(context.TODO(), putRequest, localFile)
	if err != nil {
		log.Fatalf("gagal mengunggah objek dari file %v", err)
	}

	// Tampilkan hasil operasi unggahan objek.
	log.Printf("hasil unggah objek dari file:%#v\n", result)
}

iOS

OSSPutObjectRequest * put = [OSSPutObjectRequest new];
// Tentukan nama bucket. Contoh: examplebucket. 
put.bucketName = @"examplebucket";
// Tentukan jalur lengkap objek. Jangan sertakan nama bucket dalam jalur lengkap. Contoh: exampledir/exampleobject.txt. 
put.objectKey = @"exampledir/exampleobject.txt";
// Tentukan jalur lengkap file lokal yang ingin Anda unggah. 
// Secara default, jika Anda tidak menentukan jalur lengkap file lokal, file lokal diunggah dari jalur proyek tempat program contoh berada. 
put.uploadingFileURL = [NSURL fileURLWithPath:@"filePath"];
// Konfigurasikan fungsi callback kemajuan untuk menampilkan bilah kemajuan. 
put.uploadProgress = ^(int64_t bytesSent, int64_t totalByteSent, int64_t totalBytesExpectedToSend) {
    // Tentukan jumlah byte yang sedang diunggah, jumlah total byte yang diunggah, dan jumlah total byte yang ingin Anda unggah. 
    NSLog(@"%lld, %lld, %lld", bytesSent, totalByteSent, totalBytesExpectedToSend);
};
OSSTask * putTask = [client putObject:put];
[putTask continueWithBlock:^id(OSSTask *task) {
    if (!task.error) {
        NSLog(@"upload objek berhasil!");
    } else {
        NSLog(@"upload objek gagal, kesalahan: %@" , task.error);
    }
    return nil;
}];
// Implementasikan pemblokiran sinkron untuk menunggu tugas selesai. 
// [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 menentukan ukuran data yang diunggah oleh fungsi callback. 
    // transferred menentukan ukuran data yang diunggah. 
    // total menentukan ukuran total objek yang ingin Anda unggah. 
    std::cout << "ProgressCallback[" << userData << "] => " <<
    increment <<" ," << transfered << "," << total << std::endl;
}


int main(void)
{
    /* Inisialisasi informasi tentang akun yang digunakan untuk mengakses OSS. */
            
    /* Tentukan endpoint wilayah tempat bucket berada. Misalnya, jika bucket berada di wilayah Tiongkok (Hangzhou), atur endpoint menjadi https://oss-cn-hangzhou.aliyuncs.com. */
    std::string Endpoint = "yourEndpoint";
    /* Tentukan wilayah tempat bucket berada. Misalnya, jika bucket berada di wilayah Tiongkok (Hangzhou), atur wilayah menjadi cn-hangzhou. */
    std::string Region = "yourRegion";
    /* Tentukan nama bucket. Contoh: examplebucket. */
    std::string BucketName = "examplebucket";
    /* Tentukan jalur lengkap objek. Jangan sertakan nama bucket dalam jalur lengkap objek. Contoh: exampledir/exampleobject.txt. */
    std::string ObjectName = "exampledir/exampleobject.txt";

    /* Inisialisasi sumber daya seperti sumber daya jaringan. */
    InitializeSdk();

    ClientConfiguration conf;
    conf.signatureVersion = SignatureVersionType::V4;
    /* Dapatkan kredensial akses dari variabel lingkungan. Sebelum menjalankan kode contoh, pastikan variabel lingkungan OSS_ACCESS_KEY_ID dan OSS_ACCESS_KEY_SECRET telah dikonfigurasi. */
    auto credentialsProvider = std::make_shared<EnvironmentVariableCredentialsProvider>();
    OssClient client(Endpoint, credentialsProvider, conf);
    client.SetRegion(Region);
  
    /* Atur yourLocalFilename ke jalur lengkap file lokal. */
    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);
   
    /* Unggah objek. */
    auto outcome = client.PutObject(request);

    if (!outcome.isSuccess()) {
        /* Tangani pengecualian. */
        std::cout << "PutObject gagal" <<
        ",code:" << outcome.error().Code() <<
        ",message:" << outcome.error().Message() <<
        ",requestId:" << outcome.error().RequestId() << std::endl;
        return -1;
    }

    /* Lepaskan sumber daya seperti sumber daya jaringan. */
    ShutdownSdk();
    return 0;
}

C

#include "oss_api.h"
#include "aos_http_io.h"
/* Tentukan endpoint wilayah tempat bucket berada. Misalnya, jika bucket berada di wilayah Tiongkok (Hangzhou), atur endpoint menjadi https://oss-cn-hangzhou.aliyuncs.com. */
const char *endpoint = "yourEndpoint";

/* Tentukan nama bucket. Contoh: examplebucket. */
const char *bucket_name = "examplebucket";
/* Tentukan jalur lengkap objek. Jangan sertakan nama bucket dalam jalur lengkap. Contoh: exampledir/exampleobject.txt. */
const char *object_name = "exampledir/exampleobject.txt";
/* Tentukan jalur lengkap file lokal. */
const char *local_filename = "yourLocalFilename";
/* Tentukan wilayah tempat bucket berada. Misalnya, jika bucket berada di wilayah Tiongkok (Hangzhou), atur wilayah menjadi cn-hangzhou. */
const char *region = "yourRegion";
void init_options(oss_request_options_t *options)
{
    options->config = oss_config_create(options->pool);
    /* Gunakan string char* untuk menginisialisasi data bertipe aos_string_t. */
    aos_str_set(&options->config->endpoint, endpoint);
    /* Dapatkan kredensial akses dari variabel lingkungan. Sebelum menjalankan kode contoh, pastikan variabel lingkungan OSS_ACCESS_KEY_ID dan OSS_ACCESS_KEY_SECRET telah dikonfigurasi. */    
    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"));
    // Tentukan dua parameter tambahan.
    aos_str_set(&options->config->region, region);
    options->config->signature_version = 4;
    /* Tentukan apakah menggunakan CNAME. Nilai 0 menunjukkan bahwa CNAME tidak digunakan. */
    options->config->is_cname = 0;
    /* Konfigurasikan parameter jaringan seperti periode timeout. */
    options->ctl = aos_http_controller_create(options->pool, 0);
}
void percentage(int64_t consumed_bytes, int64_t total_bytes) 
{
    assert(total_bytes >= consumed_bytes);
    printf("%%%" APR_INT64_T_FMT "\n", consumed_bytes * 100 / total_bytes);
}
int main(int argc, char *argv[])
{
    /* Panggil metode aos_http_io_initialize di main() untuk menginisialisasi sumber daya global, seperti sumber daya jaringan dan memori. */
    if (aos_http_io_initialize(NULL, 0) != AOSE_OK) {
        exit(1);
    }
    /* Buat pool memori untuk mengelola memori. aos_pool_t setara dengan apr_pool_t. Kode untuk membuat pool memori termasuk dalam pustaka APR. */
    aos_pool_t *pool;
    /* Buat pool memori. Nilai parameter kedua adalah NULL. Nilai ini menunjukkan bahwa pool tidak mewarisi pool memori lain. */
    aos_pool_create(&pool, NULL);
    /* Buat dan inisialisasi opsi. Parameter ini mencakup informasi konfigurasi global, seperti endpoint, access_key_id, access_key_secret, is_cname, dan curl. */
    oss_request_options_t *oss_client_options;
    /* Alokasikan sumber daya memori di pool memori untuk opsi. */
    oss_client_options = oss_request_options_create(pool);
    /* Inisialisasi oss_client_options. */
    init_options(oss_client_options);
    /* Inisialisasi parameter. */
    aos_string_t bucket;
    aos_string_t object;
    aos_string_t file;   
    aos_list_t resp_body;
    aos_table_t *resp_headers = NULL;
    aos_status_t *resp_status = NULL; 
    aos_str_set(&bucket, bucket_name);
    aos_str_set(&object, object_name);
    aos_str_set(&file, local_filename);
    /* Unggah objek dengan bilah kemajuan yang ditentukan. */
    resp_status = oss_do_put_object_from_file(oss_client_options, &bucket, &object, &file, NULL, NULL, percentage, &resp_headers, &resp_body);
    if (aos_status_is_ok(resp_status)) {
        printf("put object from file succeeded\n");
    } else {
        printf("put object from file failed\n");
    }
    /* Lepaskan pool memori. Operasi ini melepaskan sumber daya memori yang dialokasikan untuk permintaan. */
    aos_pool_destroy(pool);
    /* Lepaskan sumber daya global yang dialokasikan. */
    aos_http_io_deinitialize();
    return 0;
}