全部产品
Search
文档中心

Object Storage Service:Unggah multipart

更新时间:Jul 02, 2025

Jika Anda menggunakan metode unggah sederhana untuk objek berukuran lebih dari 5 GB, waktu yang lama mungkin diperlukan dan proses tersebut dapat gagal akibat gangguan jaringan atau pengecualian program. Untuk mempercepat proses, Anda dapat membagi objek menjadi beberapa bagian dan mengunggahnya secara paralel. Jika salah satu bagian gagal diunggah, Anda hanya perlu mengunggah ulang bagian tersebut.

Skenario

  • Mempercepat unggahan objek besar: Untuk objek berukuran lebih dari 5 GB, gunakan unggah multipart dengan membagi objek menjadi beberapa bagian dan mengunggahnya secara paralel.

  • Gangguan jaringan: Unggah multipart cocok untuk kondisi jaringan buruk. Jika salah satu bagian gagal diunggah, Anda cukup mengunggah ulang bagian tersebut, sehingga menghemat waktu dan bandwidth.

  • Jeda dan lanjutkan unggahan: Tugas unggah multipart tidak memiliki batas waktu. Anda dapat menjeda dan melanjutkan tugas kapan saja sebelum selesai atau dibatalkan.

  • Ukuran objek tidak diketahui: Dalam skenario seperti pengawasan video, ukuran objek akhir mungkin belum diketahui. Dalam hal ini, Anda dapat menggunakan unggah multipart.

Proses

Untuk mengunggah file lokal menggunakan unggah multipart, lakukan langkah-langkah berikut:

  1. Panggil operasi InitiateMultipartUpload untuk memulai tugas unggah multipart.

  2. Panggil operasi UploadPart untuk mengunggah bagian-bagian.

    • Bagian-bagian dari objek yang ingin Anda unggah diurutkan berdasarkan nomor bagian yang Anda tentukan selama pengunggahan. Namun, bagian-bagian tidak harus diunggah secara berurutan dan dapat diunggah secara paralel. Semakin banyak bagian yang diunggah secara paralel tidak selalu mempercepat pengunggahan. Kami sarankan Anda menentukan jumlah unggahan paralel berdasarkan kondisi jaringan Anda dan beban kerja perangkat Anda.

    • Secara default, jika Anda mengunggah bagian-bagian objek tetapi tidak memanggil operasi CompleteMultipartUpload untuk menggabungkan bagian-bagian menjadi objek, bagian-bagian yang diunggah tidak akan dihapus secara otomatis. Untuk membatalkan tugas unggah dan menghapus bagian-bagian, panggil operasi AbortMultipartUpload.

  3. Panggil operasi CompleteMultipartUpload untuk menggabungkan bagian-bagian yang diunggah menjadi objek.

Metode

Catatan

Anda tidak dapat melakukan unggah multipart melalui Konsol OSS. Untuk objek berukuran lebih dari 5 GB, gunakan ossbrowser, SDK OSS, atau ossutil.

Gunakan ossutil

Jika Anda menjalankan perintah cp dari ossutil 2.0 untuk mengunggah file lokal besar, ossutil secara otomatis menggunakan unggah multipart.

ossutil cp D:/localpath/example.iso oss://examplebucket/desfolder/

Untuk mengunggah file lokal secara manual menggunakan unggah multipart, Anda dapat menggunakan operasi initiate-multipart-upload, upload-part, dan complete-multipart-upload.

Gunakan SDK OSS

Java

Berikut adalah contoh implementasi unggah multipart menggunakan SDK OSS untuk Java:

import com.aliyun.oss.*;
import com.aliyun.oss.common.auth.*;
import com.aliyun.oss.common.comm.SignVersion;
import com.aliyun.oss.internal.Mimetypes;
import com.aliyun.oss.model.*;
import java.io.File;
import java.io.FileInputStream;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.List;

public class Demo {

    public static void main(String[] args) throws Exception {
        // Dalam contoh ini, endpoint wilayah China (Hangzhou) digunakan. Tentukan endpoint aktual Anda.
        String endpoint = "https://oss-cn-hangzhou.aliyuncs.com";
        // Dapatkan kredensial akses dari variabel lingkungan. Sebelum Anda 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. Contoh: exampledir/exampleobject.txt. Jangan masukkan nama bucket dalam jalur lengkap.
        String objectName = "exampledir/exampleobject.txt";
        // Tentukan jalur lengkap file lokal yang ingin Anda unggah.
        String filePath = "D:\\localpath\\examplefile.txt";
        // Tentukan wilayah tempat bucket berada. Misalnya, jika bucket berada di wilayah China (Hangzhou), atur wilayah ke cn-hangzhou.
        String region = "cn-hangzhou";

        // Buat instance OSSClient.
        // Panggil metode shutdown untuk melepaskan sumber daya terkait saat 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 {
            // Buat objek InitiateMultipartUploadRequest.
            InitiateMultipartUploadRequest request = new InitiateMultipartUploadRequest(bucketName, objectName);

            // Buat objek ObjectMetadata dan tentukan parameter Content-Type.
            ObjectMetadata metadata = new ObjectMetadata();
            if (metadata.getContentType() == null) {
                metadata.setContentType(Mimetypes.getInstance().getMimetype(new File(filePath), objectName));
            }
            System.out.println("Content-Type: " + metadata.getContentType());

            // Ikat metadata ke permintaan unggah.
            request.setObjectMetadata(metadata);

            // Inisialisasi tugas unggah multipart.
            InitiateMultipartUploadResult upresult = ossClient.initiateMultipartUpload(request);
            // Dapatkan ID unggah.
            String uploadId = upresult.getUploadId();

            // partETags adalah kumpulan PartETags. PartETag terdiri dari nomor bagian dan ETag dari bagian yang diunggah.
            List<PartETag> partETags = new ArrayList<PartETag>();
            // Tentukan ukuran setiap bagian, yang digunakan untuk menghitung jumlah bagian objek. Satuan: byte.

            // Atur ukuran bagian menjadi 1 MB.
            final long partSize = 1 * 1024 * 1024L;

            // Hitung jumlah bagian berdasarkan ukuran data yang diunggah. Dalam kode contoh berikut, file lokal digunakan sebagai contoh untuk menggambarkan cara menggunakan metode File.length() untuk mendapatkan ukuran data yang diunggah.
            final File sampleFile = new File(filePath);
            long fileLength = sampleFile.length();
            int partCount = (int) (fileLength / partSize);
            if (fileLength % partSize != 0) {
                partCount++;
            }
            // Unggah setiap bagian hingga semua bagian diunggah.
            for (int i = 0; i < partCount; i++) {
                long startPos = i * partSize;
                long curPartSize = (i + 1 == partCount) ? (fileLength - startPos) : partSize;
                UploadPartRequest uploadPartRequest = new UploadPartRequest();
                uploadPartRequest.setBucketName(bucketName);
                uploadPartRequest.setKey(objectName);
                uploadPartRequest.setUploadId(uploadId);
                // Tentukan aliran input tugas unggah multipart.
                // Dalam kode contoh berikut, file lokal digunakan sebagai contoh untuk menggambarkan cara membuat objek FileInputStream dan menggunakan metode InputStream.skip() untuk melewati data yang ditentukan.
                InputStream instream = new FileInputStream(sampleFile);
                instream.skip(startPos);
                uploadPartRequest.setInputStream(instream);
                // Tentukan ukuran yang tersedia untuk setiap bagian. Ukuran setiap bagian kecuali bagian terakhir harus lebih besar dari atau sama dengan 100 KB.
                uploadPartRequest.setPartSize(curPartSize);
                // Tentukan nomor bagian. Setiap bagian memiliki nomor bagian yang berkisar antara 1 hingga 10.000. Jika nomor bagian yang Anda tentukan tidak termasuk dalam rentang yang ditentukan, OSS mengembalikan kode kesalahan InvalidArgument.
                uploadPartRequest.setPartNumber(i + 1);
                // Bagian tidak harus diunggah secara berurutan dan dapat diunggah dari klien OSS yang berbeda. OSS mengurutkan bagian berdasarkan nomor bagian dan menggabungkan bagian menjadi objek lengkap.
                UploadPartResult uploadPartResult = ossClient.uploadPart(uploadPartRequest);
                // Setelah bagian diunggah, OSS mengembalikan hasil yang berisi PartETag. PartETag disimpan di partETags.
                partETags.add(uploadPartResult.getPartETag());

                // Nonaktifkan aliran input.
                instream.close();
            }

            // Buat objek CompleteMultipartUploadRequest.
            // Saat Anda memanggil operasi CompleteMultipartUpload, Anda harus menyediakan semua partETags yang valid. Setelah OSS menerima PartETags, OSS memverifikasi semua bagian satu per satu. Setelah semua bagian diverifikasi, OSS menggabungkan bagian-bagian ini menjadi objek lengkap.
            CompleteMultipartUploadRequest completeMultipartUploadRequest =
                    new CompleteMultipartUploadRequest(bucketName, objectName, uploadId, partETags);

            // Selesaikan tugas unggah multipart.
            CompleteMultipartUploadResult completeMultipartUploadResult = ossClient.completeMultipartUpload(completeMultipartUploadRequest);
            System.out.println("Unggah berhasil,ETag:" + completeMultipartUploadResult.getETag());

        } 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();
            }
        }
    }
}

Untuk informasi lebih lanjut tentang kode contoh dalam skenario lainnya, lihat Unggah multipart.

Python

Berikut adalah contoh implementasi unggah multipart menggunakan SDK OSS untuk Python:

# -*- coding: utf-8 -*-
import os
from oss2 import SizedFileAdapter, determine_part_size
from oss2.models import PartInfo
import oss2
from oss2.credentials import EnvironmentVariableCredentialsProvider

# Dapatkan kredensial akses dari variabel lingkungan. Sebelum Anda 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 China (Hangzhou), atur endpoint ke https://oss-cn-hangzhou.aliyuncs.com.
endpoint = "https://oss-cn-hangzhou.aliyuncs.com"

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

# Tentukan jalur lengkap objek. Jangan masukkan nama bucket dalam jalur lengkap. Contoh: exampledir/exampleobject.txt.
key = 'exampledir/exampleobject.txt'
# Tentukan jalur lengkap file lokal yang ingin Anda unggah. Contoh: D:\\localpath\\examplefile.txt.
filename = 'D:\\localpath\\examplefile.txt'

total_size = os.path.getsize(filename)
# Gunakan metode determine_part_size untuk menentukan ukuran bagian. Ukuran bagian minimum adalah 100 KB dan maksimum adalah 5 GB. Bagian terakhir bisa lebih kecil dari 100 KB. Dalam contoh ini, ukuran bagian diatur menjadi 1 MB.
part_size = determine_part_size(total_size, preferred_size=1 * 1024 * 1024)

# Mulai tugas unggah multipart.
# Jika Anda ingin menentukan kelas penyimpanan objek saat memulai tugas unggah multipart, konfigurasikan header terkait saat menggunakan metode init_multipart_upload.
# headers = dict()
# Tentukan perilaku caching halaman web untuk objek.
# headers['Cache-Control'] = 'no-cache'
# Tentukan nama objek saat diunduh.
# headers['Content-Disposition'] = 'oss_MultipartUpload.txt'
# Tentukan periode validitas. Satuan: milidetik.
# headers['Expires'] = '1000'
# Tentukan apakah objek yang diunggah dengan melakukan unggah multipart menimpa objek yang ada dengan nama yang sama saat tugas unggah multipart dimulai. Dalam contoh ini, parameter ini diatur ke true, yang menunjukkan bahwa objek dengan nama yang sama tidak dapat ditimpa.
# headers['x-oss-forbid-overwrite'] = 'true'
# Tentukan metode enkripsi sisi server yang ingin Anda gunakan untuk mengenkripsi setiap bagian.
# headers[OSS_SERVER_SIDE_ENCRYPTION] = SERVER_SIDE_ENCRYPTION_KMS
# Tentukan algoritma yang ingin Anda gunakan untuk mengenkripsi objek. Jika Anda tidak mengonfigurasi parameter ini, objek dienkripsi menggunakan AES-256.
# headers[OSS_SERVER_SIDE_DATA_ENCRYPTION] = SERVER_SIDE_ENCRYPTION_KMS
# Tentukan ID Customer Master Key (CMK) yang dikelola oleh Key Management Service (KMS).
# headers[OSS_SERVER_SIDE_ENCRYPTION_KEY_ID] = '9468da86-3509-4f8d-a61e-6eab1eac****'
# Tentukan kelas penyimpanan objek.
# headers['x-oss-storage-class'] = oss2.BUCKET_STORAGE_CLASS_STANDARD
# Tentukan tag untuk objek. Anda dapat menentukan beberapa tag untuk objek pada saat yang sama.
# headers[OSS_OBJECT_TAGGING] = 'k1=v1&k2=v2&k3=v3'
# upload_id = bucket.init_multipart_upload(key, headers=headers).upload_id
upload_id = bucket.init_multipart_upload(key).upload_id
# Batalkan tugas unggah multipart atau daftar bagian yang diunggah berdasarkan ID unggah.
# Jika Anda ingin membatalkan tugas unggah multipart berdasarkan ID unggah, dapatkan ID unggah setelah Anda memanggil operasi InitiateMultipartUpload untuk memulai tugas unggah multipart.
# Jika Anda ingin mendaftar bagian yang diunggah dalam tugas unggah multipart berdasarkan ID unggah, dapatkan ID unggah setelah Anda memanggil operasi InitiateMultipartUpload untuk memulai tugas unggah multipart tetapi sebelum Anda memanggil operasi CompleteMultipartUpload untuk menyelesaikan tugas unggah multipart.
# print("UploadID:", upload_id)
parts = []

# Unggah bagian-bagian.
with open(filename, 'rb') as fileobj:
    part_number = 1
    offset = 0
    while offset < total_size:
        num_to_upload = min(part_size, total_size - offset)
        # Gunakan metode SizedFileAdapter(fileobj, size) untuk menghasilkan objek baru dan menghitung ulang posisi dari mana operasi tambahan dimulai.
        result = bucket.upload_part(key, upload_id, part_number,
                                    SizedFileAdapter(fileobj, num_to_upload))
        parts.append(PartInfo(part_number, result.etag))

        offset += num_to_upload
        part_number += 1

# Selesaikan tugas unggah multipart.
# Konfigurasikan header (jika Anda mau) saat menyelesaikan tugas unggah multipart.
headers = dict()
# Tentukan daftar kontrol akses (ACL) objek. Dalam contoh ini, ACL diatur ke OBJECT_ACL_PRIVATE, yang menunjukkan bahwa ACL objek bersifat pribadi.
# headers["x-oss-object-acl"] = oss2.OBJECT_ACL_PRIVATE
bucket.complete_multipart_upload(key, upload_id, parts, headers=headers)
# bucket.complete_multipart_upload(key, upload_id, parts)

Untuk informasi lebih lanjut tentang kode contoh dalam skenario lainnya, lihat Unggah multipart.

Go

Berikut adalah contoh implementasi unggah multipart menggunakan SDK OSS untuk Go:

package main

import (
	"bufio"
	"bytes"
	"context"
	"flag"
	"io"
	"log"
	"os"
	"sync"

	"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 sumber.")
	flag.StringVar(&objectName, "object", "", "Nama objek sumber.")
}

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

	// Tentukan ID unggah.
	var uploadId string

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

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

	// Periksa apakah nama objek telah ditentukan.
	if len(objectName) == 0 {
		flag.PrintDefaults()
		log.Fatalf("parameter tidak valid, nama objek sumber 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)

	// Buat permintaan untuk memulai tugas unggah multipart.
	initRequest := &oss.InitiateMultipartUploadRequest{
		Bucket: oss.Ptr(bucketName),
		Key:    oss.Ptr(objectName),
	}
	initResult, err := client.InitiateMultipartUpload(context.TODO(), initRequest)
	if err != nil {
		log.Fatalf("gagal memulai unggah multipart %v", err)
	}

	// Tampilkan hasil memulai tugas unggah multipart.
	log.Printf("hasil unggah multipart initiate:%#v\n", *initResult.UploadId)
	uploadId = *initResult.UploadId

	// Inisialisasi grup tunggu dan mutex.
	var wg sync.WaitGroup
	var parts []oss.UploadPart
	count := 3
	var mu sync.Mutex

	// Baca data dari file lokal ke memori dan ganti yourLocalFile dengan jalur aktual file lokal yang berisi nama file.
	file, err := os.Open("yourLocalFile")
	if err != nil {
		log.Fatalf("gagal membuka file lokal %v", err)
	}
	defer file.Close()

	bufReader := bufio.NewReader(file)
	content, err := io.ReadAll(bufReader)
	if err != nil {
		log.Fatalf("gagal membaca file lokal %v", err)
	}
	log.Printf("ukuran file: %d\n", len(content))

	// Hitung ukuran setiap bagian.
	chunkSize := len(content) / count
	if chunkSize == 0 {
		chunkSize = 1
	}

	// Mulai beberapa goroutine untuk tugas unggah multipart.
	for i := 0; i < count; i++ {
		start := i * chunkSize
		end := start + chunkSize
		if i == count-1 {
			end = len(content)
		}

		wg.Add(1)
		go func(partNumber int, start, end int) {
			defer wg.Done()

			// Buat permintaan untuk mengunggah bagian.
			partRequest := &oss.UploadPartRequest{
				Bucket:     oss.Ptr(bucketName),                 // Nama bucket.
				Key:        oss.Ptr(objectName),                 // Nama objek.
				PartNumber: int32(partNumber),                   // Nomor bagian.
				UploadId:   oss.Ptr(uploadId),                   // ID unggah.
				Body:       bytes.NewReader(content[start:end]), // Konten bagian.
			}

			// Kirim permintaan untuk mengunggah bagian.
			partResult, err := client.UploadPart(context.TODO(), partRequest)
			if err != nil {
				log.Fatalf("gagal mengunggah bagian %d: %v", partNumber, err)
			}

			// Tampilkan hasil permintaan unggah bagian.
			part := oss.UploadPart{
				PartNumber: partRequest.PartNumber,
				ETag:       partResult.ETag,
			}

			// Gunakan mutex untuk melindungi data bersama.
			mu.Lock()
			parts = append(parts, part)
			mu.Unlock()
		}(i+1, start, end)
	}

	// Tunggu hingga semua goroutine selesai.
	wg.Wait()

	// Selesaikan tugas unggah multipart.
	request := &oss.CompleteMultipartUploadRequest{
		Bucket:   oss.Ptr(bucketName),
		Key:      oss.Ptr(objectName),
		UploadId: oss.Ptr(uploadId),
		CompleteMultipartUpload: &oss.CompleteMultipartUpload{
			Parts: parts,
		},
	}
	result, err := client.CompleteMultipartUpload(context.TODO(), request)
	if err != nil {
		log.Fatalf("gagal menyelesaikan unggah multipart %v", err)
	}

	// Tampilkan hasil tugas unggah multipart.
	log.Printf("hasil unggah multipart complete:%#v\n", result)
}

Untuk informasi lebih lanjut tentang kode contoh dalam skenario lainnya, lihat Unggah multipart.

Node.js

Berikut adalah contoh implementasi unggah multipart menggunakan SDK OSS untuk Node.js:

const OSS = require('ali-oss');
const path = require("path");

const client = new OSS({
  // Tentukan wilayah tempat bucket berada. Misalnya, jika bucket berada di wilayah China (Hangzhou), atur wilayah ke oss-cn-hangzhou.
  region: 'yourregion',
  // Dapatkan kredensial akses dari variabel lingkungan. Sebelum Anda menjalankan kode contoh, pastikan variabel lingkungan OSS_ACCESS_KEY_ID dan OSS_ACCESS_KEY_SECRET telah dikonfigurasi.
  accessKeyId: process.env.OSS_ACCESS_KEY_ID,
  accessKeySecret: process.env.OSS_ACCESS_KEY_SECRET,
  authorizationV4: true,
  // Tentukan nama bucket.
  bucket: 'yourbucketname',
});


const progress = (p, _checkpoint) => {
  // Catat kemajuan unggah objek.
  console.log(p);
  // Catat informasi titik pemeriksaan tugas unggah multipart.
  console.log(_checkpoint);
};

const headers = {
  // Tentukan kelas penyimpanan objek.
  'x-oss-storage-class': 'Standard',
  // Tentukan tag untuk objek. Anda dapat menentukan beberapa tag untuk objek.
  'x-oss-tagging': 'Tag1=1&Tag2=2',
  // Tentukan apakah akan menimpa objek yang ada dengan nama yang sama saat tugas unggah multipart diinisialisasi. Dalam contoh ini, parameter ini diatur ke true, yang menunjukkan bahwa objek yang ada dengan nama yang sama dengan objek yang akan diunggah tidak ditimpa.
  'x-oss-forbid-overwrite': 'true'
}

// Mulai tugas unggah multipart.
async function multipartUpload() {
  try {
    // Tentukan jalur lengkap objek. Contoh: exampledir/exampleobject.txt. Kemudian, tentukan jalur lengkap file lokal. Contoh: D:\\localpath\\examplefile.txt. Jangan masukkan nama bucket dalam jalur lengkap.
    // Secara default, jika Anda mengatur parameter ini ke nama file lokal seperti examplefile.txt tanpa menentukan jalur lokal, file lokal diunggah dari jalur lokal proyek tempat program contoh berada.
    const result = await client.multipartUpload('exampledir/exampleobject.txt', path.normalize('D:\\localpath\\examplefile.txt'), {
      progress,
      // headers,
      // Konfigurasikan parameter meta untuk menentukan metadata untuk objek. Anda dapat memanggil operasi HeadObject untuk mendapatkan metadata objek.
      meta: {
        year: 2020,
        people: 'test',
      },
    });
    console.log(result);
    // Tentukan jalur lengkap objek. Contoh: exampledir/exampleobject.txt. Jangan masukkan nama bucket dalam jalur lengkap.
    const head = await client.head('exampledir/exampleobject.txt');
    console.log(head);
  } catch (e) {
    // Tangani pengecualian timeout.
    if (e.code === 'ConnectionTimeoutError') {
      console.log('TimeoutError');
      // lakukan operasi ConnectionTimeoutError
    }
    console.log(e);
  }
}

multipartUpload();

Untuk informasi lebih lanjut tentang kode contoh dalam skenario lainnya, lihat Unggah multipart.

PHP

Berikut adalah contoh implementasi unggah multipart menggunakan SDK OSS untuk PHP:

<?php
if (is_file(__DIR__ . '/../autoload.php')) {
    require_once __DIR__ . '/../autoload.php';
}
if (is_file(__DIR__ . '/../vendor/autoload.php')) {
    require_once __DIR__ . '/../vendor/autoload.php';
}

use OSS\Credentials\EnvironmentVariableCredentialsProvider;
use OSS\OssClient;
use OSS\CoreOssException;
use OSS\Core\OssUtil;

// Dapatkan kredensial akses dari variabel lingkungan. Sebelum Anda menjalankan kode contoh, pastikan variabel lingkungan OSS_ACCESS_KEY_ID dan OSS_ACCESS_KEY_SECRET telah dikonfigurasi.
$provider = new EnvironmentVariableCredentialsProvider();
// Dalam contoh ini, endpoint wilayah China (Hangzhou) digunakan. Tentukan endpoint aktual Anda.
$endpoint = 'https://oss-cn-hangzhou.aliyuncs.com';
// Tentukan nama bucket. Contoh: examplebucket.
$bucket= 'examplebucket';
// Tentukan jalur lengkap objek. Jangan masukkan nama bucket dalam jalur lengkap. Contoh: exampledir/exampleobject.txt.
$object = 'exampledir/exampleobject.txt';
// Tentukan jalur lengkap file lokal yang ingin Anda unggah.
$uploadFile = 'D:\\localpath\\examplefile.txt';
$initOptions = array(
    OssClient::OSS_HEADERS  => array(
        // Tentukan perilaku caching halaman web saat objek diunduh.
        // 'Cache-Control' => 'no-cache',
        //Tentukan nama objek saat objek diunduh.
        // 'Content-Disposition' => 'attachment;filename=oss_download.jpg',
        // Tentukan periode validitas permintaan. Satuan: milidetik.
        // 'Expires' => 150,
        // Tentukan apakah objek yang diunggah menggunakan unggah multipart menimpa objek yang ada dengan nama yang sama saat tugas unggah multipart diinisialisasi. Dalam contoh ini, parameter ini diatur ke true, yang menentukan bahwa objek yang diunggah dengan nama yang sama dengan objek yang ada tidak menimpa objek yang ada.
        //'x-oss-forbid-overwrite' => 'true',
        // Tentukan metode enkripsi sisi server yang ingin Anda gunakan untuk mengenkripsi setiap bagian objek.
        // 'x-oss-server-side-encryption'=> 'KMS',
        // Tentukan algoritma yang ingin Anda gunakan untuk mengenkripsi objek.
        // 'x-oss-server-side-data-encryption'=>'SM4',
        // Tentukan ID kunci master pelanggan (CMK) yang dikelola oleh Key Management Service (KMS).
        //'x-oss-server-side-encryption-key-id' => '9468da86-3509-4f8d-a61e-6eab1eac****',
        // Tentukan kelas penyimpanan objek.
        // 'x-oss-storage-class' => 'Standard',
        // Tentukan tag untuk objek. Anda dapat menentukan beberapa tag untuk objek pada saat yang sama.
        // 'x-oss-tagging' => 'TagA=A&TagB=B',
    ),
);

/**
 * Langkah 1: Mulai tugas unggah multipart dan dapatkan ID unggah.
 */
try{
    $config = array(
        "provider" => $provider,
        "endpoint" => $endpoint,
        "signatureVersion" => OssClient::OSS_SIGNATURE_VERSION_V4,
        "region"=> "cn-hangzhou"
    );
    $ossClient = new OssClient($config);
    // Dapatkan ID unggah. ID unggah adalah pengenal unik tugas unggah multipart. Anda dapat melakukan operasi terkait seperti membatalkan atau menanyakan tugas unggah multipart berdasarkan ID unggah.
    $uploadId = $ossClient->initiateMultipartUpload($bucket, $object, $initOptions);
    print("initiateMultipartUpload OK" . "\n");
    // Batalkan tugas unggah multipart atau daftar bagian yang diunggah berdasarkan ID unggah.
    // Jika Anda ingin membatalkan tugas unggah multipart berdasarkan ID unggah, dapatkan ID unggah setelah Anda memanggil operasi InitiateMultipartUpload untuk memulai tugas unggah multipart.
    // Jika Anda ingin mendaftar bagian yang diunggah dalam tugas unggah multipart berdasarkan ID unggah, dapatkan ID unggah setelah Anda memanggil operasi InitiateMultipartUpload untuk memulai tugas unggah multipart tetapi sebelum Anda memanggil operasi CompleteMultipartUpload untuk menyelesaikan tugas unggah multipart.
    //print("UploadId: " . $uploadId . "\n");
} catch(OssException $e) {
    printf($e->getMessage() . "\n");
    return;
}

/*
 * Langkah 2: Unggah bagian-bagian.
 */
$partSize = 10 * 1024 * 1024;
$uploadFileSize = sprintf('%u',filesize($uploadFile));
$pieces = $ossClient->generateMultiuploadParts($uploadFileSize, $partSize);
$responseUploadPart = array();
$uploadPosition = 0;
$isCheckMd5 = true;
foreach ($pieces as $i => $piece) {
    $fromPos = $uploadPosition + (integer)$piece[$ossClient::OSS_SEEK_TO];
    $toPos = (integer)$piece[$ossClient::OSS_LENGTH] + $fromPos - 1;
    $upOptions = array(
        // Unggah objek.
        $ossClient::OSS_FILE_UPLOAD => $uploadFile,
        // Tentukan nomor bagian.
        $ossClient::OSS_PART_NUM => ($i + 1),
        // Tentukan posisi dari mana tugas unggah multipart dimulai.
        $ossClient::OSS_SEEK_TO => $fromPos,
        // Tentukan panjang objek.
        $ossClient::OSS_LENGTH => $toPos - $fromPos + 1,
        // Tentukan apakah akan mengaktifkan verifikasi MD5. Nilai true menentukan bahwa verifikasi MD5 diaktifkan.
        $ossClient::OSS_CHECK_MD5 => $isCheckMd5,
    );
    // Aktifkan verifikasi MD5.
    if ($isCheckMd5) {
        $contentMd5 = OssUtil::getMd5SumForFile($uploadFile, $fromPos, $toPos);
        $upOptions[$ossClient::OSS_CONTENT_MD5] = $contentMd5;
    }
    try {
        // Unggah bagian-bagian.
        $responseUploadPart[] = $ossClient->uploadPart($bucket, $object, $uploadId, $upOptions);
        printf("initiateMultipartUpload, uploadPart - part#{$i} OK\n");
    } catch(OssException $e) {
        printf("initiateMultipartUpload, uploadPart - part#{$i} FAILED\n");
        printf($e->getMessage() . "\n");
        return;
    }

}
// $uploadParts adalah array yang terdiri dari ETag dan nomor bagian setiap bagian.
$uploadParts = array();
foreach ($responseUploadPart as $i => $eTag) {
    $uploadParts[] = array(
        'PartNumber' => ($i + 1),
        'ETag' => $eTag,
    );
}
/**
 * Langkah 3: Selesaikan tugas unggah multipart.
 */
$comOptions['headers'] = array(
    // Tentukan apakah objek yang diunggah menggunakan unggah multipart menimpa objek yang ada dengan nama yang sama saat tugas unggah multipart selesai. Dalam contoh ini, parameter ini diatur ke true, yang menentukan bahwa objek yang diunggah dengan nama yang sama dengan objek yang ada tidak menimpa objek yang ada.
    // 'x-oss-forbid-overwrite' => 'true',
    // Jika Anda mengatur parameter x-oss-complete-all ke yes, OSS akan mendaftar semua bagian yang diunggah menggunakan ID unggah saat ini, mengurutkan bagian berdasarkan nomor bagian, dan kemudian melakukan operasi CompleteMultipartUpload.
    // 'x-oss-complete-all'=> 'yes'
);

try {
    // Semua nilai valid dari parameter $uploadParts diperlukan untuk operasi CompleteMultipartUpload. Setelah OSS menerima nilai-nilai parameter $uploadParts, OSS memverifikasi semua bagian satu per satu. Setelah semua bagian diverifikasi, OSS menggabungkan bagian-bagian tersebut menjadi objek lengkap.
    $ossClient->completeMultipartUpload($bucket, $object, $uploadId, $uploadParts,$comOptions);
    printf( "Complete Multipart Upload OK\n");
}  catch(OssException $e) {
    printf("Complete Multipart Upload FAILED\n");
    printf($e->getMessage() . "\n");
    return;
}
           

Untuk informasi lebih lanjut tentang kode contoh dalam skenario lainnya, lihat Unggah multipart.

C#

Berikut adalah contoh implementasi unggah multipart menggunakan SDK OSS untuk C#:

using Aliyun.OSS;
using Aliyun.OSS.Common;

// Tentukan endpoint wilayah tempat bucket berada. Misalnya, jika bucket berada di wilayah China (Hangzhou), atur endpoint ke https://oss-cn-hangzhou.aliyuncs.com.
var endpoint = "yourEndpoint";
// Dapatkan kredensial akses dari variabel lingkungan. Sebelum Anda 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 = "examplebucket";
// Tentukan jalur lengkap objek. Jangan masukkan nama bucket dalam jalur lengkap.
var objectName = "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.
var localFilename = "D:\\localpath\\examplefile.txt";
// Tentukan wilayah tempat bucket berada. Misalnya, jika bucket berada di wilayah China (Hangzhou), atur wilayah ke cn-hangzhou.
const string region = "cn-hangzhou";

// Buat instance ClientConfiguration dan modifikasi 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);

// Mulai tugas unggah multipart dan dapatkan ID unggah dalam respons.
var uploadId = "";
try
{
    // Tentukan nama objek yang diunggah dan bucket untuk objek tersebut. Anda dapat mengonfigurasi metadata objek dalam InitiateMultipartUploadRequest. Namun, Anda tidak perlu menentukan ContentLength.
    var request = new InitiateMultipartUploadRequest(bucketName, objectName);
    var result = client.InitiateMultipartUpload(request);
    uploadId = result.UploadId;
    // Tampilkan ID unggah.
    Console.WriteLine("Inisiasi multi-part upload berhasil");
    // Batalkan tugas unggah multipart atau daftar bagian yang diunggah berdasarkan ID unggah.
    // Jika Anda ingin membatalkan tugas unggah multipart berdasarkan ID unggah, dapatkan ID unggah setelah Anda memanggil operasi InitiateMultipartUpload untuk memulai tugas unggah multipart.
    // Jika Anda ingin mendaftar bagian yang diunggah dalam tugas unggah multipart berdasarkan ID unggah, dapatkan ID unggah setelah Anda memanggil operasi InitiateMultipartUpload untuk memulai tugas unggah multipart tetapi sebelum Anda memanggil operasi CompleteMultipartUpload untuk menyelesaikan tugas unggah multipart.
    Console.WriteLine("Upload Id:{0}", result.UploadId);
}
catch (Exception ex)
{
    Console.WriteLine("Inisiasi multi-part upload gagal, {0}", ex.Message);
    Environment.Exit(1);
}
// Hitung jumlah total bagian.
var partSize = 100 * 1024;
var fi = new FileInfo(localFilename);
var fileSize = fi.Length;
var partCount = fileSize / partSize;
if (fileSize % partSize != 0)
{
    partCount++;
}
// Inisialisasi bagian dan mulai tugas unggah multipart. partETags adalah daftar PartETags. Setelah OSS menerima partETags, OSS memverifikasi semua bagian satu per satu. Setelah semua bagian diverifikasi, OSS menggabungkan bagian-bagian tersebut menjadi objek lengkap.
var partETags = new List<PartETag>();
try
{
    using (var fs = File.Open(localFilename, FileMode.Open))
    {
        for (var i = 0; i < partCount; i++)
        {
            var skipBytes = (long)partSize * i;
            // Temukan posisi awal tugas unggah saat ini.
            fs.Seek(skipBytes, 0);
            // Hitung ukuran bagian dalam unggahan ini. Ukuran bagian terakhir adalah ukuran sisa setelah objek dibagi dengan ukuran bagian yang dihitung.
            var size = (partSize < fileSize - skipBytes) ? partSize : (fileSize - skipBytes);
            var request = new UploadPartRequest(bucketName, objectName, uploadId)
            {
                InputStream = fs,
                PartSize = size,
                PartNumber = i + 1
            };
            // Panggil UploadPart untuk mengunggah bagian-bagian. Hasil yang dikembalikan berisi nilai ETag dari bagian-bagian.
            var result = client.UploadPart(request);
            partETags.Add(result.PartETag);
            Console.WriteLine("selesai {0}/{1}", partETags.Count, partCount);
        }
        Console.WriteLine("Unggah multi-part berhasil");
    }
}
catch (Exception ex)
{
    Console.WriteLine("Unggah multi-part gagal, {0}", ex.Message);
    Environment.Exit(1);
}
// Gabungkan bagian-bagian setelah bagian-bagian diunggah.
try
{
    var completeMultipartUploadRequest = new CompleteMultipartUploadRequest(bucketName, objectName, uploadId);
    foreach (var partETag in partETags)
    {
        completeMultipartUploadRequest.PartETags.Add(partETag);
    }
    var result = client.CompleteMultipartUpload(completeMultipartUploadRequest);
    Console.WriteLine("penyelesaian multi-part berhasil");
}
catch (Exception ex)
{
    Console.WriteLine("penyelesaian multi-part gagal, {0}", ex.Message);
    Environment.Exit(1);
}

Untuk informasi lebih lanjut tentang kode contoh dalam skenario lainnya, lihat Unggah multipart.

Browser.js

Berikut adalah contoh implementasi unggah multipart menggunakan SDK OSS untuk Browser.js:

<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <title>Document</title>
  </head>

  <body>
    <button id="submit">Unggah</button>
    <input id="file" type="file" />
    <!-- Impor file SDK -->
    <script
      type="text/javascript"
      src="https://gosspublic.alicdn.com/aliyun-oss-sdk-6.18.0.min.js"
    ></script>
    <script type="text/javascript">
      const client = new OSS({
        // Tentukan wilayah tempat bucket berada. Misalnya, jika bucket berada di wilayah China (Hangzhou), atur wilayah ke oss-cn-hangzhou.
        region: "yourRegion",
        authorizationV4: true,
        // Tentukan pasangan AccessKey sementara yang diperoleh dari STS. Pasangan AccessKey terdiri dari ID AccessKey dan rahasia AccessKey.
        accessKeyId: "yourAccessKeyId",
        accessKeySecret: "yourAccessKeySecret",
        // Tentukan token keamanan yang diperoleh dari STS.
        stsToken: "yourSecurityToken",
        // Tentukan nama bucket. Contoh: examplebucket.
        bucket: "examplebucket",
      });

      const headers = {
        // Tentukan perilaku caching halaman web saat objek diunduh.
        "Cache-Control": "no-cache",
        // Tentukan nama objek saat objek diunduh.
        "Content-Disposition": "example.txt",
        // Tentukan periode validitas permintaan. Satuan: milidetik.
        Expires: "1000",
        // Tentukan kelas penyimpanan objek.
        "x-oss-storage-class": "Standard",
        // Tentukan satu atau lebih tag untuk objek.
        "x-oss-tagging": "Tag1=1&Tag2=2",
        // Tentukan apakah akan menimpa objek yang ada dengan nama yang sama saat tugas unggah multipart diinisialisasi. Dalam contoh ini, parameter x-oss-forbid-overwrite diatur ke true. Nilai ini menentukan bahwa objek yang ada tidak dapat ditimpa oleh objek yang memiliki nama yang sama.
        "x-oss-forbid-overwrite": "true",
      };

      // Tentukan nama objek yang diunggah ke bucket examplebucket. Contoh: exampleobject.txt.
      const name = "exampleobject.txt";
      // Dapatkan DOM.
      const submit = document.getElementById("submit");
      const options = {
        // Tanyakan kemajuan, titik pemeriksaan, dan nilai kembali tugas unggah multipart.
        progress: (p, cpt, res) => {
          console.log(p);
        },
        // Tentukan jumlah bagian yang dapat diunggah secara paralel.
        parallel: 4,
        // Tentukan ukuran bagian. Nilai default: 1 MB. Nilai minimum: 100 KB.
        partSize: 1024 * 1024,
        // headers,
        // Tentukan metadata pengguna objek. Anda dapat memanggil operasi HeadObject untuk menanyakan metadata objek.
        meta: { year: 2020, people: "test" },
        mime: "text/plain",
      };

      // Konfigurasikan pendengar acara.
      submit.addEventListener("click", async () => {
        try {
          const data = document.getElementById("file").files[0];
          // Mulai tugas unggah multipart.
          const res = await client.multipartUpload(name, data, {
            ...options,
            // Konfigurasikan panggilan balik unggah. 
            // Jika tidak diperlukan server panggilan balik, hapus konfigurasi panggilan balik.
            callback: {
              // Tentukan alamat server yang menerima permintaan panggilan balik.
              url: "http://examplebucket.aliyuncs.com:23450",
              // Tentukan header Host dalam permintaan panggilan balik.
              host: "yourHost",
              /* eslint no-template-curly-in-string: [0] */
              // Tentukan konten body permintaan panggilan balik.
              body: "bucket=${bucket}&object=${object}&var1=${x:var1}",
              // Tentukan Content-Type dalam permintaan panggilan balik.
              contentType: "application/x-www-form-urlencoded",
              customValue: {
                // Tentukan parameter kustom untuk permintaan panggilan balik.
                var1: "value1",
                var2: "value2",
              },
            },
          });
          console.log(res);
        } catch (err) {
          console.log(err);
        }
      });
    </script>
  </body>
</html>

Untuk informasi lebih lanjut tentang kode contoh dalam skenario lainnya, lihat Unggah multipart.

Android

Berikut adalah contoh implementasi unggah multipart menggunakan SDK OSS untuk Android:

// Tentukan nama bucket. Contoh: examplebucket.
String bucketName = "examplebucket";
// Tentukan jalur lengkap objek. Contoh: exampledir/exampleobject.txt. Jangan masukkan nama bucket dalam jalur lengkap.
String objectName = "exampledir/exampleobject.txt";
// Tentukan jalur lengkap file lokal. Contoh: /storage/emulated/0/oss/examplefile.txt.
String localFilepath = "/storage/emulated/0/oss/examplefile.txt";

// Mulai tugas unggah multipart.
InitiateMultipartUploadRequest init = new InitiateMultipartUploadRequest(bucketName, objectName);
InitiateMultipartUploadResult initResult = oss.initMultipartUpload(init);
// Dapatkan ID unggah.
String uploadId = initResult.getUploadId();
// Batalkan tugas unggah multipart atau daftar bagian yang diunggah berdasarkan ID unggah.
// Jika Anda ingin membatalkan tugas unggah multipart berdasarkan ID unggah, dapatkan ID unggah setelah Anda memanggil operasi InitiateMultipartUpload untuk memulai tugas unggah multipart.
// Jika Anda ingin mendaftar bagian yang diunggah dalam tugas unggah multipart berdasarkan ID unggah, dapatkan ID unggah setelah Anda memanggil operasi InitiateMultipartUpload untuk memulai tugas unggah multipart dan sebelum Anda memanggil operasi CompleteMultipartUpload untuk menyelesaikan tugas unggah multipart.
// Log.d("uploadId", uploadId);

// Tentukan ukuran bagian. Satuan: byte. Nilai valid: 100 KB hingga 5 GB.
int partCount = 100 * 1024;
// Mulai tugas unggah multipart.
List<PartETag> partETags = new ArrayList<>();
for (int i = 1; i < 5; i++) {
    byte[] data = new byte[partCount];

    RandomAccessFile raf = new RandomAccessFile(localFilepath, "r");
    long skip = (i-1) * partCount;
    raf.seek(skip);
    raf.readFully(data, 0, partCount);

    UploadPartRequest uploadPart = new UploadPartRequest();
    uploadPart.setBucketName(bucketName);
    uploadPart.setObjectKey(objectName);
    uploadPart.setUploadId(uploadId);
    // Tentukan nomor bagian setiap bagian. Nomor dimulai dari 1. Setiap bagian memiliki nomor bagian. Nilai valid: 1 hingga 10000.
    uploadPart.setPartNumber(i);
    uploadPart.setPartContent(data);
    try {
        UploadPartResult result = oss.uploadPart(uploadPart);
        PartETag partETag = new PartETag(uploadPart.getPartNumber(), result.getETag());
        partETags.add(partETag);
    } catch (ServiceException serviceException) {
        OSSLog.logError(serviceException.getErrorCode());
    }
}
Collections.sort(partETags, new Comparator<PartETag>() {
    @Override
    public int compare(PartETag lhs, PartETag rhs) {
        if (lhs.getPartNumber() < rhs.getPartNumber()) {
            return -1;
        } else if (lhs.getPartNumber() > rhs.getPartNumber()) {
            return 1;
        } else {
            return 0;
        }
    }
});

// Selesaikan tugas unggah multipart.
CompleteMultipartUploadRequest complete = new CompleteMultipartUploadRequest(bucketName, objectName, uploadId, partETags);

// Implementasikan panggilan balik unggah. Anda dapat mengonfigurasi parameter CALLBACK_SERVER saat menyelesaikan tugas unggah multipart. Permintaan panggilan balik dikirim ke alamat server yang ditentukan setelah Anda menyelesaikan tugas unggah multipart. Anda dapat melihat hasil servercallback di completeResult.getServerCallbackReturnBody() dari respons.
complete.setCallbackParam(new HashMap<String, String>() {
    {
        put("callbackUrl", CALLBACK_SERVER); // Atur parameter CALLBACK_SERVER ke alamat server Anda.
        put("callbackBody", "test");
    }
});
CompleteMultipartUploadResult completeResult = oss.completeMultipartUpload(complete);
OSSLog.logError("-------------- serverCallback: " + completeResult.getServerCallbackReturnBody());

Untuk informasi lebih lanjut tentang kode contoh dalam skenario lainnya, lihat Unggah multipart.

C++

Berikut adalah contoh implementasi unggah multipart menggunakan SDK OSS untuk C++:

#include <alibabacloud/oss/OssClient.h>
#include <fstream>

int64_t getFileSize(const std::string& file)
{
    std::fstream f(file, std::ios::in | std::ios::binary);
    f.seekg(0, f.end);
    int64_t size = f.tellg();
    f.close();
    return size;
}

using namespace AlibabaCloud::OSS;

int main(void)
{
    /* Inisialisasi informasi tentang akun yang digunakan untuk mengakses OSS. */

    /* Tentukan endpoint wilayah tempat bucket berada. Misalnya, jika bucket berada di wilayah China (Hangzhou), atur endpoint ke https://oss-cn-hangzhou.aliyuncs.com. */
    std::string Endpoint = "yourEndpoint";
    /* Tentukan wilayah tempat bucket berada. Misalnya, jika bucket berada di wilayah China (Hangzhou), atur wilayah ke cn-hangzhou. */
    std::string Region = "yourRegion";
    /* Tentukan nama bucket. Contoh: examplebucket. */
    std::string BucketName = "examplebucket";
    /* Tentukan jalur lengkap objek. Jangan masukkan 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 Anda 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);

    InitiateMultipartUploadRequest initUploadRequest(BucketName, ObjectName);
    /* (Opsional) Tentukan kelas penyimpanan. */
    //initUploadRequest.MetaData().addHeader("x-oss-storage-class", "Standard");

    /* Mulai tugas unggah multipart. */
    auto uploadIdResult = client.InitiateMultipartUpload(initUploadRequest);
    /* Batalkan tugas unggah multipart atau daftar bagian yang diunggah berdasarkan ID unggah. */
    /* Jika Anda ingin membatalkan tugas unggah multipart berdasarkan ID unggah, dapatkan ID unggah setelah Anda memanggil operasi InitiateMultipartUpload untuk memulai tugas unggah multipart. */
    /* Jika Anda ingin mendaftar bagian yang diunggah dalam tugas unggah multipart berdasarkan ID unggah, dapatkan ID unggah setelah Anda memanggil operasi InitiateMultipartUpload untuk memulai tugas unggah multipart tetapi sebelum Anda memanggil operasi CompleteMultipartUpload untuk menyelesaikan tugas unggah multipart. */
    auto uploadId = uploadIdResult.result().UploadId();
    std::string fileToUpload = "yourLocalFilename";
    int64_t partSize = 100 * 1024;
    PartList partETagList;
    auto fileSize = getFileSize(fileToUpload);
    int partCount = static_cast<int>(fileSize / partSize);
    /* Hitung jumlah bagian. */
    if (fileSize % partSize != 0) {
        partCount++;
    }

    /* Unggah setiap bagian. */
    for (int i = 1; i <= partCount; i++) {
        auto skipBytes = partSize * (i - 1);
        auto size = (partSize < fileSize - skipBytes) ? partSize : (fileSize - skipBytes);
        std::shared_ptr<std::iostream> content = std::make_shared<std::fstream>(fileToUpload, std::ios::in|std::ios::binary);
        content->seekg(skipBytes, std::ios::beg);

        UploadPartRequest uploadPartRequest(BucketName, ObjectName, content);
        uploadPartRequest.setContentLength(size);
        uploadPartRequest.setUploadId(uploadId);
        uploadPartRequest.setPartNumber(i);
        auto uploadPartOutcome = client.UploadPart(uploadPartRequest);
        if (uploadPartOutcome.isSuccess()) {
            Part part(i, uploadPartOutcome.result().ETag());
            partETagList.push_back(part);
        }
        else {
            std::cout << "uploadPart gagal" <<
            ",code:" << uploadPartOutcome.error().Code() <<
            ",message:" << uploadPartOutcome.error().Message() <<
            ",requestId:" << uploadPartOutcome.error().RequestId() << std::endl;
        }

    }

    /* Selesaikan tugas unggah multipart. */
    /* Saat tugas unggah multipart selesai, Anda perlu menyediakan semua PartETags yang valid. Setelah OSS menerima PartETags, OSS memverifikasi semua bagian satu per satu. Setelah verifikasi bagian berhasil, OSS menggabungkan bagian-bagian ini menjadi objek lengkap. */
    CompleteMultipartUploadRequest request(BucketName, ObjectName);
    request.setUploadId(uploadId);
    request.setPartList(partETagList);
    /* (Opsional) Tentukan ACL objek. */
    //request.setAcl(CannedAccessControlList::Private);

    auto outcome = client.CompleteMultipartUpload(request);

    if (!outcome.isSuccess()) {
        /* Tangani pengecualian. */
        std::cout << "CompleteMultipartUpload 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;
}

Untuk informasi lebih lanjut tentang kode contoh dalam skenario lainnya, lihat Unggah multipart.

Object C

Berikut adalah contoh implementasi unggah multipart menggunakan SDK OSS untuk Object C:

__block NSString * uploadId = nil;
__block NSMutableArray * partInfos = [NSMutableArray new];
// Tentukan nama bucket. Contoh: examplebucket.
NSString * uploadToBucket = @"examplebucket";
// Tentukan jalur lengkap objek. Contoh: exampledir/exampleobject.txt. Jangan masukkan nama bucket dalam jalur lengkap.
NSString * uploadObjectkey = @"exampledir/exampleobject.txt";
// Gunakan OSSInitMultipartUploadRequest untuk menentukan nama objek yang diunggah dan nama bucket tempat objek disimpan.
OSSInitMultipartUploadRequest * init = [OSSInitMultipartUploadRequest new];
init.bucketName = uploadToBucket;
init.objectKey = uploadObjectkey;
// init.contentType = @"application/octet-stream";
// Respons multipartUploadInit berisi ID unggah. ID unggah adalah ID unik tugas unggah multipart.
OSSTask * initTask = [client multipartUploadInit:init];
[initTask waitUntilFinished];
if (!initTask.error) {
    OSSInitMultipartUploadResult * result = initTask.result;
    uploadId = result.uploadId;
    // Batalkan tugas unggah multipart atau daftar bagian yang diunggah berdasarkan ID unggah.
    // Jika Anda ingin membatalkan tugas unggah multipart berdasarkan ID unggah, dapatkan ID unggah setelah Anda memanggil operasi InitiateMultipartUpload untuk memulai tugas unggah multipart.
    // Jika Anda ingin mendaftar bagian yang diunggah dalam tugas unggah multipart berdasarkan ID unggah, dapatkan ID unggah setelah Anda memanggil operasi InitiateMultipartUpload untuk memulai tugas unggah multipart tetapi sebelum Anda memanggil operasi CompleteMultipartUpload untuk menyelesaikan tugas unggah multipart.
    //NSLog(@"UploadId": %@, uploadId);
} else {
    NSLog(@"multipart upload gagal, error: %@", initTask.error);
    return;
}

// Tentukan objek yang ingin Anda unggah.
NSString * filePath = @"<filepath>";
// Tanyakan ukuran objek.
uint64_t fileSize = [[[NSFileManager defaultManager] attributesOfItemAtPath:filePath error:nil] fileSize];
// Tentukan jumlah bagian.
int chuckCount = 10;
// Tentukan ukuran bagian.
uint64_t offset = fileSize/chuckCount;
for (int i = 1; i <= chuckCount; i++) {
    OSSUploadPartRequest * uploadPart = [OSSUploadPartRequest new];
    uploadPart.bucketName = uploadToBucket;
    uploadPart.objectkey = uploadObjectkey;
    uploadPart.uploadId = uploadId;
    uploadPart.partNumber = i; // nomor bagian dimulai dari 1

    NSFileHandle* readHandle = [NSFileHandle fileHandleForReadingAtPath:filePath];
    [readHandle seekToFileOffset:offset * (i -1)];

    NSData* data = [readHandle readDataOfLength:offset];
    uploadPart.uploadPartData = data;

    OSSTask * uploadPartTask = [client uploadPart:uploadPart];

    [uploadPartTask waitUntilFinished];

    if (!uploadPartTask.error) {
        OSSUploadPartResult * result = uploadPartTask.result;
        uint64_t fileSize = [[[NSFileManager defaultManager] attributesOfItemAtPath:uploadPart.uploadPartFileURL.absoluteString error:nil] fileSize];
        [partInfos addObject:[OSSPartInfo partInfoWithPartNum:i eTag:result.eTag size:fileSize]];
    } else {
        NSLog(@"upload part error: %@", uploadPartTask.error);
        return;
    }
}
OSSCompleteMultipartUploadRequest * complete = [OSSCompleteMultipartUploadRequest new];
complete.bucketName = uploadToBucket;
complete.objectKey = uploadObjectkey;
complete.uploadId = uploadId;
complete.partInfos = partInfos;

OSSTask * completeTask = [client completeMultipartUpload:complete];

[[completeTask continueWithBlock:^id(OSSTask *task) {
    if (!task.error) {
        OSSCompleteMultipartUploadResult * result = task.result;
        // ...
    } else {
        // ...
    }
    return nil;
}] waitUntilFinished];

Untuk informasi lebih lanjut tentang kode contoh dalam skenario lainnya, lihat Unggah multipart.

C

Berikut adalah contoh implementasi unggah multipart menggunakan SDK OSS untuk C:

#include "oss_api.h"
#include "aos_http_io.h"
#include <sys/stat.h>
/* Tentukan endpoint wilayah tempat bucket berada. Misalnya, jika bucket berada di wilayah China (Hangzhou), atur endpoint ke 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 masukkan 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 China (Hangzhou), atur wilayah ke 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 Anda 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 akan menggunakan CNAME untuk mengakses OSS. 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);
}
int64_t get_file_size(const char *file_path)
{
    int64_t filesize = -1;
    struct stat statbuff;
    if(stat(file_path, &statbuff) < 0){
        return filesize;
    } else {
        filesize = statbuff.st_size;
    }
    return filesize;
}
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 kolam memori untuk mengelola memori. aos_pool_t setara dengan apr_pool_t. Kode yang digunakan untuk membuat kolam memori termasuk dalam pustaka APR. */
    aos_pool_t *pool;
    /* Buat kolam memori. Nilai parameter kedua adalah NULL. Nilai ini menunjukkan bahwa kolam tidak mewarisi kolam memori lainnya. */
    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 kolam 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;
    oss_upload_file_t *upload_file = NULL;
    aos_string_t upload_id;   
    aos_table_t *headers = NULL;
    aos_table_t *complete_headers = NULL;
    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_null(&upload_id);
    headers = aos_table_make(pool, 1);
    complete_headers = aos_table_make(pool, 1);
    int part_num = 1;
    /* Mulai tugas unggah multipart dan dapatkan ID unggah. */
    resp_status = oss_init_multipart_upload(oss_client_options, &bucket, &object, &upload_id, headers, &resp_headers);
    /* Periksa apakah tugas unggah multipart diinisialisasi. */
    if (aos_status_is_ok(resp_status)) {
        printf("Inisiasi unggah multipart berhasil, upload_id:%.*s\n", 
               upload_id.len, upload_id.data);
    } else {
        printf("Inisiasi unggah multipart gagal, upload_id:%.*s\n", 
               upload_id.len, upload_id.data);
    }
    /* Unggah bagian-bagian. */
    int64_t file_length = 0;
    int64_t pos = 0;
    aos_list_t complete_part_list;
       oss_complete_part_content_t* complete_content = NULL;
    char* part_num_str = NULL;
    char* etag = NULL;
    aos_list_init(&complete_part_list);
    file_length = get_file_size(local_filename);
    while(pos < file_length) {
        upload_file = oss_create_upload_file(pool);
        aos_str_set(&upload_file->filename, local_filename);
        upload_file->file_pos = pos;
        pos += 100 * 1024;
        upload_file->file_last = pos < file_length ? pos : file_length;
        resp_status = oss_upload_part_from_file(oss_client_options, &bucket, &object, &upload_id, part_num++, upload_file, &resp_headers);

        /* Simpan nomor bagian dan ETags. */
        complete_content = oss_create_complete_part_content(pool);
        part_num_str = apr_psprintf(pool, "%d", part_num-1);
        aos_str_set(&complete_content->part_number, part_num_str);
        etag = apr_pstrdup(pool,
        (char*)apr_table_get(resp_headers, "ETag"));
        aos_str_set(&complete_content->etag, etag);
        aos_list_add_tail(&complete_content->node, &complete_part_list);

        if (aos_status_is_ok(resp_status)) {
            printf("Unggah multipart dari file berhasil\n");
        } else {
            printf("Unggah multipart dari file gagal\n");
        }
    }

    /* Selesaikan tugas unggah multipart. */
    resp_status = oss_complete_multipart_upload(oss_client_options, &bucket, &object, &upload_id,
            &complete_part_list, complete_headers, &resp_headers);
    /* Periksa apakah tugas unggah multipart selesai. */
    if (aos_status_is_ok(resp_status)) {
        printf("Penyelesaian unggah multipart dari file berhasil, upload_id:%.*s\n", 
               upload_id.len, upload_id.data);
    } else {
        printf("Penyelesaian unggah multipart dari file gagal\n");
    }
    /* Lepaskan kolam 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;
}

Untuk informasi lebih lanjut tentang kode contoh dalam skenario lainnya, lihat Unggah multipart.

Operasi API

Metode yang dijelaskan di atas pada dasarnya diimplementasikan berdasarkan API RESTful, yang dapat Anda panggil langsung jika bisnis Anda memerlukan tingkat penyesuaian yang tinggi. Untuk memanggil API secara langsung, Anda harus menyertakan perhitungan tanda tangan dalam kode Anda.

  • Untuk informasi tentang operasi API yang dapat Anda panggil untuk memulai tugas unggah multipart, lihat InitiateMultipartUpload.

  • Untuk informasi tentang operasi API yang dapat Anda panggil untuk mengunggah bagian, lihat UploadPart.

  • Untuk informasi tentang operasi API yang dapat Anda panggil untuk mengunggah bagian dengan menyalin data dari objek yang ada, lihat UploadPartCopy.

  • Untuk informasi tentang operasi API yang dapat Anda panggil untuk menyelesaikan tugas unggah multipart, lihat CompleteMultipartUpload.

  • Untuk informasi tentang operasi API yang dapat Anda panggil untuk membatalkan tugas unggah multipart dan menghapus bagian yang dihasilkan, lihat AbortMultipartUpload.

  • Untuk informasi lebih lanjut tentang operasi API yang dapat Anda panggil untuk mendaftar semua tugas unggah multipart yang sedang berlangsung, lihat ListMultipartUploads.

  • Untuk informasi tentang operasi API yang dapat Anda panggil untuk mendaftar semua bagian yang diunggah, lihat ListParts.

Izin

Izin

Secara default, akun Alibaba Cloud memiliki izin penuh. Pengguna RAM atau peran RAM di bawah akun Alibaba Cloud tidak memiliki izin apa pun secara default. Akun Alibaba Cloud atau administrator akun harus memberikan izin operasi melalui RAM Policy atau Bucket Policy.

API

Aksi

Definisi

InitiateMultipartUpload

oss:PutObject

Menginisialisasi tugas unggah multipart.

oss:PutObjectTagging

Saat menginisialisasi tugas unggah multipart, jika Anda menentukan tag objek melalui x-oss-tagging, izin ini diperlukan.

kms:GenerateDataKey

Saat mengunggah objek, jika metadata objek berisi X-Oss-Server-Side-Encryption: KMS, kedua izin ini diperlukan.

kms:Decrypt

API

Aksi

Definisi

UploadPart

oss:PutObject

Mengunggah bagian-bagian.

API

Aksi

Definisi

UploadPartCopy

oss:GetObject

Membaca data dalam objek sumber saat Anda mengunggah bagian dengan menyalin data dari objek yang ada.

oss:PutObject

Menulis data ke objek tujuan saat Anda mengunggah bagian dengan menyalin data dari objek yang ada.

oss:GetObjectVersion

Saat mengunggah bagian dengan menyalin data dari objek yang ada, jika Anda menentukan versi objek melalui versionId, izin ini diperlukan untuk membaca versi yang ditentukan dari objek sumber.

API

Aksi

Definisi

CompleteMultipartUpload

oss:PutObject

Menggabungkan bagian-bagian menjadi objek.

oss:PutObjectTagging

Saat menggabungkan bagian-bagian menjadi objek, jika Anda menentukan tag objek melalui x-oss-tagging, izin ini diperlukan.

API

Aksi

Definisi

AbortMultipartUpload

oss:AbortMultipartUpload

Membatalkan tugas unggah multipart dan menghapus bagian yang diunggah.

API

Aksi

Definisi

ListMultipartUploads

oss:ListMultipartUploads

Mendaftar semua tugas unggah multipart yang sedang berlangsung, yaitu tugas unggah multipart yang telah diinisialisasi tetapi belum selesai atau dibatalkan.

API

Aksi

Definisi

ListParts

oss:ListParts

Mendaftar semua bagian yang diunggah menggunakan ID unggah.

Penagihan

Saat Anda mengunggah file lokal ke OSS menggunakan unggah multipart, biaya akan dikenakan. Untuk informasi tentang item yang dapat ditagih dan detail harga, lihat Biaya OSS.

API

Item yang dapat ditagih

Deskripsi

InitiateMultipartUpload

Permintaan PUT

Anda dikenakan biaya permintaan berdasarkan jumlah permintaan sukses.

API

Item yang dapat ditagih

Deskripsi

UploadPart

Permintaan PUT

Anda dikenakan biaya permintaan berdasarkan jumlah permintaan sukses.

Biaya penyimpanan

Anda dikenakan biaya penyimpanan berdasarkan kelas penyimpanan, ukuran, dan durasi penyimpanan bagian-bagian. Kelas penyimpanan bagian-bagian objek sama dengan kelas penyimpanan objek. Namun, bagian-bagian tersebut tidak memiliki ukuran minimum yang dapat ditagih. Jika bagian kurang dari 64 KB, bagian tersebut tetap dihitung berdasarkan ukuran aktual. Setelah Anda mengunggah bagian-bagian ke OSS, Anda dikenakan biaya penyimpanan kecuali bagian-bagian tersebut dihapus atau digabungkan menjadi objek, terlepas dari apakah bagian-bagian tersebut diakses atau apakah operasi dilakukan pada bagian-bagian tersebut.

API

Item yang dapat ditagih

Deskripsi

UploadPartCopy

Permintaan PUT

Anda dikenakan biaya permintaan berdasarkan jumlah permintaan sukses.

API

Item yang dapat ditagih

Deskripsi

CompleteMultipartUpload

Permintaan PUT

Anda dikenakan biaya permintaan berdasarkan jumlah permintaan sukses.

Biaya penyimpanan

Anda dikenakan biaya penyimpanan berdasarkan kelas penyimpanan, ukuran, dan durasi penyimpanan objek. Setelah Anda menggabungkan bagian-bagian di OSS menjadi objek lengkap dan menyimpan objek tersebut di OSS, Anda dikenakan biaya penyimpanan, terlepas dari apakah objek tersebut diakses atau apakah operasi dilakukan pada objek tersebut.

API

Item yang dapat ditagih

Deskripsi

AbortMultipartUpload

Permintaan PUT

Anda dikenakan biaya permintaan berdasarkan jumlah permintaan sukses.

Penting
  • Di wilayah daratan Tiongkok, saat bagian IA, Arsip, atau Penyimpanan Dingin Dalam dihapus berdasarkan aturan siklus hidup, Anda akan dikenakan biaya permintaan PUT lebih tinggi dibandingkan dengan biaya permintaan PUT saat bagian Standar dihapus. Anda tidak dikenakan biaya permintaan PUT saat bagian Penyimpanan Dingin Dalam dihapus berdasarkan aturan siklus hidup.

  • Di wilayah China (Hong Kong) dan wilayah di luar daratan Tiongkok, Anda tidak dikenakan biaya permintaan PUT saat bagian dari kelas penyimpanan apa pun dihapus berdasarkan aturan siklus hidup.

API

Item yang dapat ditagih

Deskripsi

ListMultipartUploads

Permintaan PUT

Anda dikenakan biaya permintaan berdasarkan jumlah permintaan sukses.

API

Item yang dapat ditagih

Deskripsi

ListParts

Permintaan PUT

Anda dikenakan biaya permintaan berdasarkan jumlah permintaan sukses.

Batasan

Batasan

Deskripsi

Ukuran objek

Hingga 48,8 TB.

Jumlah bagian

1 hingga 10.000.

Ukuran bagian

100 KB hingga 5 GB. Ukuran bagian terakhir bisa kurang dari 100 KB.

Jumlah maksimum bagian yang dapat dikembalikan untuk satu permintaan ListParts

1.000

Jumlah maksimum tugas unggah multipart yang dapat dikembalikan untuk satu permintaan ListMultipartUploads

1.000

Tanya Jawab Umum

Apakah saya dapat mengunggah direktori menggunakan unggah multipart?

Tidak. Anda tidak dapat mengunggah direktori menggunakan unggah multipart.

Bagaimana cara mengoptimalkan kinerja unggah saat saya mengunggah sejumlah besar objek?

Jika Anda mengunggah sejumlah besar objek yang nama-namanya memiliki awalan berurutan, seperti cap waktu dan huruf, beberapa indeks objek mungkin disimpan dalam satu partisi. Jika sejumlah besar permintaan dikirim untuk menanyakan objek-objek tersebut, latensi meningkat. Kami sarankan agar Anda tidak mengunggah sejumlah besar objek yang nama-namanya memiliki awalan berurutan. Untuk informasi lebih lanjut, lihat Praktik terbaik kinerja OSS.

Bagaimana cara mencegah biaya permintaan PUT yang tinggi untuk objek yang kelas penyimpanannya adalah Penyimpanan Dingin Dalam?

Jika Anda ingin mengunggah sejumlah besar objek dan menetapkan kelas penyimpanan objek ke Penyimpanan Dingin Dalam, Anda akan dikenakan biaya biaya permintaan PUT. Kami sarankan agar Anda menetapkan kelas penyimpanan objek ke Standar saat Anda mengunggah objek, dan mengonfigurasi aturan siklus hidup untuk mengonversi kelas penyimpanan objek Standar ke Penyimpanan Dingin Dalam. Ini mengurangi biaya permintaan PUT.

Bagaimana cara mencegah objek tidak sengaja tertimpa?

Jika Anda mengunggah objek yang namanya sama dengan objek yang ada di OSS, objek yang ada akan tertimpa oleh objek yang diunggah. Anda dapat menggunakan salah satu metode berikut untuk mencegah objek tidak sengaja tertimpa:

  • Aktifkan penomoran versi: Setelah Anda mengaktifkan penomoran versi untuk bucket, objek yang tertimpa disimpan sebagai versi sebelumnya. Anda dapat memulihkan objek ke versi sebelumnya kapan saja. Untuk informasi lebih lanjut, lihat Penomoran Versi.

  • Sertakan header yang digunakan untuk mencegah objek dengan nama yang sama tertimpa dalam permintaan: Sertakan header x-oss-forbid-overwrite dalam permintaan unggah dan atur header ke true. Dengan cara ini, saat objek dengan nama yang sama dengan objek yang ada diunggah, unggahan gagal dan kesalahan FileAlreadyExists dikembalikan. Untuk informasi lebih lanjut, lihat InitiateMultipartUpload.

Bagaimana cara menghapus bagian?

Jika tugas unggah multipart terganggu dan operasi AbortMultipartUpload tidak dipanggil, bagian-bagian yang diunggah oleh tugas tersebut disimpan di bucket yang ditentukan. Jika Anda tidak lagi memerlukan bagian-bagian tersebut, Anda dapat menggunakan salah satu metode berikut untuk menghapus bagian-bagian tersebut guna mencegah biaya penyimpanan yang tidak perlu:

Bagaimana cara mendaftar bagian?

  • Jika Anda ingin mendaftar bagian yang diunggah menggunakan ID unggah tertentu, Anda dapat memanggil operasi ListParts. Untuk informasi lebih lanjut, lihat ListParts.

  • Jika Anda ingin mendaftar tugas unggah multipart yang telah dimulai tetapi belum selesai atau dibatalkan, Anda dapat memanggil operasi ListMultipartUploads. Untuk informasi lebih lanjut, lihat ListMultipartUploads.

Apakah saya dapat menggunakan unggah multipart untuk mengunggah file lokal yang dienkripsi dan dikompresi ke OSS?

Ya. Anda dapat menggunakan unggah multipart untuk mengunggah file lokal yang dienkripsi dan dikompresi ke OSS.

Apakah bagian yang diunggah tertimpa saat saya mengunggah ulang bagian setelah tugas unggah multipart terganggu?

Setelah tugas unggah multipart terganggu, jika Anda menggunakan ID unggah asli untuk mengunggah ulang semua bagian, bagian yang diunggah dengan nama yang sama akan tertimpa. Jika Anda menggunakan ID unggah baru untuk mengunggah ulang semua bagian, bagian yang diunggah dengan ID unggah asli akan tetap ada.

Apa itu ID unggah dalam unggah multipart?

ID unggah secara unik mengidentifikasi tugas unggah multipart. Nomor bagian mengidentifikasi posisi relatif bagian-bagian yang berbagi ID unggah yang sama.

Berapa lama ID unggah valid selama tugas unggah multipart?

ID unggah tetap valid selama proses unggah multipart. ID unggah menjadi tidak valid setelah tugas unggah multipart selesai atau dibatalkan. Jika Anda ingin melakukan tugas unggah multipart lainnya, Anda harus memulai ulang tugas unggah multipart untuk menghasilkan ID unggah baru.

Apakah OSS secara otomatis menggabungkan bagian?

Tidak. OSS tidak secara otomatis menggabungkan bagian. Anda harus secara manual menggabungkan bagian menjadi objek lengkap dengan memanggil operasi CompleteMultipartUpload.