Unggah multi-bagian membagi file besar menjadi bagian-bagian kecil yang diunggah secara konkuren, memungkinkan unggah yang dapat dilanjutkan dan meningkatkan performa pada jaringan yang tidak stabil.
Cara kerja
Unggah multi-bagian membagi file besar menjadi bagian-bagian yang diunggah secara independen. Jika suatu bagian gagal, hanya bagian tersebut yang perlu diunggah ulang. UploadId mengidentifikasi tugas unggah dan mengaitkan semua bagian. Proses ini terdiri dari tiga langkah:
-
Inisialisasi unggah: Panggil operasi InitiateMultipartUpload untuk membuat unggah multi-bagian dan mendapatkan UploadId unik guna mengidentifikasi operasi selanjutnya.
-
Unggah data bagian file: Unggah file secara konkuren dalam bentuk bagian-bagian, masing-masing berukuran antara 100 KB hingga 5 GB. Fitur unggah yang dapat dilanjutkan didukung.
-
Selesaikan unggah dengan menggabungkan bagian-bagian: Panggil operasi CompleteMultipartUpload untuk menggabungkan semua bagian sesuai nomor bagian mereka menjadi satu objek utuh.
Implementasikan unggah multi-bagian
Karena adanya perubahan kebijakan untuk meningkatkan kepatuhan dan keamanan, mulai 20 Maret 2025, pengguna OSS baru harus menggunakan nama domain kustom (CNAME) untuk melakukan operasi API data pada bucket OSS yang berlokasi di wilayah Tiongkok daratan. Titik akhir publik default dibatasi untuk operasi ini. Lihat pengumuman resmi untuk daftar lengkap operasi yang terdampak. Jika Anda mengakses data melalui HTTPS, Anda harus mengikat Sertifikat SSL yang valid ke domain kustom Anda. Ini wajib untuk akses Konsol OSS, karena konsol menerapkan HTTPS.
Gunakan alat grafis, alat CLI, atau SDK untuk mengimplementasikan unggah multi-bagian.
-
Konsol OSS tidak mendukung unggah multi-bagian.
-
Anda dapat mengunggah file terkompresi yang dienkripsi, tetapi tidak dapat mengunggah direktori.
Gunakan alat untuk pemisahan bagian otomatis
Untuk pengembangan, pengujian, atau tugas O&M, gunakan alat grafis atau CLI yang menangani pemisahan bagian secara otomatis.
-
Alat manajemen grafis: OSS Browser
ossbrowser 2.0 mengaktifkan unggah multi-bagian secara default dan menyediakan antarmuka visual untuk memantau progres unggah.
-
ossutil
Perintah cp dari ossutil 2.0 secara otomatis mengaktifkan unggah multi-bagian untuk file yang lebih besar dari 100 MiB. Untuk mengontrol proses secara manual, gunakan perintah initiate-multipart-upload, upload-part, dan complete-multipart-upload secara bersamaan.
ossutil cp example.zip oss://example-bucket
Kontrol pemrograman dengan SDK
SDK membungkus unggah multi-bagian dengan ukuran bagian kustom, konkurensi, dan penanganan error. Bagian berikut menunjukkan contoh untuk SDK umum. Untuk bahasa lainnya, lihat Referensi SDK.
Sebelum menjalankan kode, instal SDK dan konfigurasikan kredensial akses sebagai variabel lingkungan. Jika Anda menggunakan Pengguna RAM atau RAM role, berikan izin yang diperlukan. Untuk informasi lebih lanjut, lihat izin API.
Java SDK V2
import com.aliyun.sdk.service.oss2.OSSClient;
import com.aliyun.sdk.service.oss2.credentials.CredentialsProvider;
import com.aliyun.sdk.service.oss2.credentials.StaticCredentialsProvider;
import com.aliyun.sdk.service.oss2.io.BoundedInputStream;
import com.aliyun.sdk.service.oss2.models.*;
import com.aliyun.sdk.service.oss2.transport.BinaryData;
import java.io.File;
import java.io.FileInputStream;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.List;
/**
* Contoh unggah multi-bagian OSS.
* Mengimplementasikan unggah multi-bagian untuk file besar.
*/
public class MultipartUpload {
public static void main(String[] args) {
// Dapatkan kredensial akses dari variabel lingkungan.
String accessKeyId = System.getenv("OSS_ACCESS_KEY_ID");
String accessKeySecret = System.getenv("OSS_ACCESS_KEY_SECRET");
// Atur wilayah dan titik akhir OSS.
String region = "cn-hangzhou";
String endpoint = "oss-cn-hangzhou.aliyuncs.com";
// Konfigurasikan informasi bucket dan file.
String bucket = "example-bucket";
String key = "dest.jpg";
String filePath = "dest.jpg";
// Buat penyedia kredensial.
CredentialsProvider provider = new StaticCredentialsProvider(accessKeyId, accessKeySecret);
// Inisialisasi klien OSS.
OSSClient client = OSSClient.newBuilder()
.credentialsProvider(provider)
.region(region)
.endpoint(endpoint)
.build();
try {
// Langkah 1: Inisialisasi unggah multi-bagian.
InitiateMultipartUploadResult initiateResult = client.initiateMultipartUpload(
InitiateMultipartUploadRequest.newBuilder()
.bucket(bucket)
.key(key)
.build());
String uploadId = initiateResult.initiateMultipartUpload().uploadId();
System.out.printf("Inisialisasi unggah multi-bagian berhasil. Kode status: %d, ID Permintaan: %s, ID Unggah: %s\n",
initiateResult.statusCode(), initiateResult.requestId(), uploadId);
// Langkah 2: Unggah bagian-bagian.
File file = new File(filePath);
long fileSize = file.length();
long partSize = 100 * 1024; // 100 KB per bagian.
int partNumber = 1;
List<Part> uploadParts = new ArrayList<>();
for (long start = 0; start < fileSize; start += partSize) {
long curPartSize = Math.min(partSize, fileSize - start);
// Baca bagian file dan unggah.
try (InputStream is = new FileInputStream(file)) {
is.skip(start);
BoundedInputStream boundedInputStream = new BoundedInputStream(is, curPartSize);
// Unggah bagian.
UploadPartResult partResult = client.uploadPart(UploadPartRequest.newBuilder()
.bucket(bucket)
.key(key)
.uploadId(uploadId)
.partNumber((long) partNumber)
.body(BinaryData.fromStream(boundedInputStream))
.build());
System.out.printf("Kode status: %d, ID Permintaan: %s, Nomor bagian: %d, ETag: %s\n",
partResult.statusCode(), partResult.requestId(), partNumber, partResult.eTag());
uploadParts.add(Part.newBuilder()
.partNumber((long) partNumber)
.eTag(partResult.eTag())
.build());
}
partNumber++;
}
// Langkah 3: Selesaikan unggah multi-bagian.
uploadParts.sort((p1, p2) -> p1.partNumber().compareTo(p2.partNumber()));
CompleteMultipartUpload completeMultipartUpload = CompleteMultipartUpload.newBuilder()
.parts(uploadParts)
.build();
CompleteMultipartUploadResult completeResult = client.completeMultipartUpload(
CompleteMultipartUploadRequest.newBuilder()
.bucket(bucket)
.key(key)
.uploadId(uploadId)
.completeMultipartUpload(completeMultipartUpload)
.build());
System.out.printf("Unggah multi-bagian selesai. Kode status: %d, ID Permintaan: %s, Bucket: %s, Kunci: %s, Lokasi: %s, ETag: %s\n",
completeResult.statusCode(), completeResult.requestId(),
completeResult.completeMultipartUpload().bucket(),
completeResult.completeMultipartUpload().key(),
completeResult.completeMultipartUpload().location(),
completeResult.completeMultipartUpload().eTag());
} catch (Exception e) {
System.out.printf("Error:\n%s", e);
e.printStackTrace();
} finally {
// Tutup klien.
try {
client.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}
}
Java SDK V1
import com.aliyun.oss.*;
import com.aliyun.oss.common.auth.*;
import com.aliyun.oss.common.comm.SignVersion;
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;
/**
* Contoh unggah multi-bagian OSS (SDK V1).
* Mengimplementasikan unggah multi-bagian untuk file besar.
*/
public class MultipartUpload {
public static void main(String[] args) {
// Dapatkan kredensial akses dari variabel lingkungan.
String accessKeyId = System.getenv("OSS_ACCESS_KEY_ID");
String accessKeySecret = System.getenv("OSS_ACCESS_KEY_SECRET");
// Atur wilayah dan titik akhir OSS.
String region = "cn-hangzhou";
String endpoint = "oss-cn-hangzhou.aliyuncs.com";
// Konfigurasikan informasi bucket dan file.
String bucketName = "example-bucket";
String objectName = "dest.jpg";
String filePath = "dest.jpg";
// Buat penyedia kredensial.
DefaultCredentialProvider provider = new DefaultCredentialProvider(accessKeyId, accessKeySecret);
// Konfigurasikan parameter klien.
ClientBuilderConfiguration clientBuilderConfiguration = new ClientBuilderConfiguration();
clientBuilderConfiguration.setSignatureVersion(SignVersion.V4);
// Inisialisasi klien OSS.
OSS ossClient = OSSClientBuilder.create()
.credentialsProvider(provider)
.clientConfiguration(clientBuilderConfiguration)
.region(region)
.endpoint(endpoint)
.build();
try {
// Langkah 1: Inisialisasi unggah multi-bagian.
InitiateMultipartUploadRequest initiateRequest = new InitiateMultipartUploadRequest(bucketName, objectName);
InitiateMultipartUploadResult initiateResult = ossClient.initiateMultipartUpload(initiateRequest);
String uploadId = initiateResult.getUploadId();
System.out.printf("Inisialisasi unggah multi-bagian berhasil. ID Unggah: %s\n", uploadId);
// Langkah 2: Unggah bagian-bagian.
File file = new File(filePath);
long fileLength = file.length();
long partSize = 100 * 1024L; // 100 KB per bagian.
// Hitung jumlah bagian.
int partCount = (int) (fileLength / partSize);
if (fileLength % partSize != 0) {
partCount++;
}
// Simpan ETag dari bagian yang diunggah.
List<PartETag> partETags = new ArrayList<>();
// Iterasi dan unggah bagian-bagian.
for (int i = 0; i < partCount; i++) {
long startPos = i * partSize;
long curPartSize = (i + 1 == partCount) ? (fileLength - startPos) : partSize;
// Buat permintaan unggah bagian.
UploadPartRequest uploadPartRequest = new UploadPartRequest();
uploadPartRequest.setBucketName(bucketName);
uploadPartRequest.setKey(objectName);
uploadPartRequest.setUploadId(uploadId);
uploadPartRequest.setPartNumber(i + 1);
uploadPartRequest.setPartSize(curPartSize);
// Baca bagian file dan unggah.
try (InputStream instream = new FileInputStream(file)) {
instream.skip(startPos);
uploadPartRequest.setInputStream(instream);
UploadPartResult uploadPartResult = ossClient.uploadPart(uploadPartRequest);
partETags.add(uploadPartResult.getPartETag());
System.out.printf("Bagian %d/%d berhasil diunggah. ETag: %s\n",
i + 1, partCount, uploadPartResult.getPartETag().getETag());
}
}
// Langkah 3: Selesaikan unggah multi-bagian.
CompleteMultipartUploadRequest completeRequest = new CompleteMultipartUploadRequest(
bucketName, objectName, uploadId, partETags);
CompleteMultipartUploadResult completeResult = ossClient.completeMultipartUpload(completeRequest);
System.out.printf("Unggah multi-bagian selesai. ETag: %s\n", completeResult.getETag());
} catch (Exception e) {
System.out.printf("Error: %s\n", e.getMessage());
e.printStackTrace();
} finally {
// Tutup klien.
ossClient.shutdown();
}
}
}
Python SDK V2
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
# Contoh unggah multi-bagian menggunakan OSS Python SDK V2.
# Mengimplementasikan unggah multi-bagian untuk file besar.
import alibabacloud_oss_v2 as oss
import os
def main():
# Dapatkan kredensial akses dari variabel lingkungan.
credentials_provider = oss.credentials.EnvironmentVariableCredentialsProvider()
# Muat konfigurasi default SDK.
config = oss.config.load_default()
config.credentials_provider = credentials_provider
# Atur wilayah dan titik akhir OSS.
config.region = "cn-hangzhou"
config.endpoint = "oss-cn-hangzhou.aliyuncs.com"
# Inisialisasi klien OSS.
client = oss.Client(config)
# Konfigurasikan informasi bucket dan file.
bucket = "example-bucket"
key = "dest.jpg"
file_path = "dest.jpg"
try:
# Langkah 1: Inisialisasi unggah multi-bagian.
initiate_result = client.initiate_multipart_upload(
oss.InitiateMultipartUploadRequest(
bucket=bucket,
key=key
))
upload_id = initiate_result.upload_id
print(f"Inisialisasi unggah multi-bagian berhasil. Kode status: {initiate_result.status_code}, "
f"ID Permintaan: {initiate_result.request_id}, ID Unggah: {upload_id}")
# Langkah 2: Unggah bagian-bagian.
file_size = os.path.getsize(file_path)
part_size = 100 * 1024 # 100 KB per bagian.
part_number = 1
upload_parts = []
offset = 0
with open(file_path, 'rb') as f:
while offset < file_size:
# Hitung ukuran bagian saat ini.
current_part_size = min(part_size, file_size - offset)
# Baca data bagian.
f.seek(offset)
part_data = f.read(current_part_size)
# Unggah bagian.
part_result = client.upload_part(
oss.UploadPartRequest(
bucket=bucket,
key=key,
upload_id=upload_id,
part_number=part_number,
body=part_data
))
print(f"Kode status: {part_result.status_code}, ID Permintaan: {part_result.request_id}, "
f"Nomor bagian: {part_number}, ETag: {part_result.etag}")
# Catat informasi bagian yang diunggah.
upload_parts.append(oss.UploadPart(
part_number=part_number,
etag=part_result.etag
))
offset += current_part_size
part_number += 1
# Langkah 3: Selesaikan unggah multi-bagian.
upload_parts.sort(key=lambda p: p.part_number)
complete_result = client.complete_multipart_upload(
oss.CompleteMultipartUploadRequest(
bucket=bucket,
key=key,
upload_id=upload_id,
complete_multipart_upload=oss.CompleteMultipartUpload(
parts=upload_parts
)
))
print(f"Unggah multi-bagian selesai. Kode status: {complete_result.status_code}, "
f"ID Permintaan: {complete_result.request_id}, "
f"Bucket: {complete_result.bucket}, "
f"Kunci: {complete_result.key}, "
f"Lokasi: {complete_result.location}, "
f"ETag: {complete_result.etag}")
except Exception as e:
print(f"Error: {e}")
raise
if __name__ == "__main__":
main()
Python SDK V1
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
# Contoh unggah multi-bagian menggunakan OSS Python SDK V1.
# Mengimplementasikan unggah multi-bagian untuk file berukuran besar.
import os
import oss2
from oss2.credentials import EnvironmentVariableCredentialsProvider
from oss2 import SizedFileAdapter
from oss2.models import PartInfo
def main():
# Dapatkan kredensial akses dari variabel lingkungan.
auth = oss2.ProviderAuth(EnvironmentVariableCredentialsProvider())
# Atur wilayah dan titik akhir OSS.
region = "cn-hangzhou"
endpoint = "oss-cn-hangzhou.aliyuncs.com"
# Konfigurasikan informasi bucket dan file.
bucket_name = "example-bucket"
key = "dest.jpg"
file_path = "dest.jpg"
# Inisialisasi bucket OSS.
bucket = oss2.Bucket(auth, endpoint, bucket_name, region=region)
try:
# Langkah 1: Inisialisasi unggah multi-bagian.
upload_id = bucket.init_multipart_upload(key).upload_id
print(f"Initiated multipart upload successfully. Upload ID: {upload_id}")
# Langkah 2: Unggah bagian.
file_size = os.path.getsize(file_path)
part_size = 100 * 1024 # 100 KB per bagian.
part_number = 1
parts = []
offset = 0
with open(file_path, 'rb') as fileobj:
while offset < file_size:
# Hitung ukuran bagian saat ini.
current_part_size = min(part_size, file_size - offset)
# Unggah bagian.
result = bucket.upload_part(
key,
upload_id,
part_number,
SizedFileAdapter(fileobj, current_part_size)
)
print(f"Part number: {part_number}, ETag: {result.etag}")
# Catat informasi dari bagian yang diunggah.
parts.append(PartInfo(part_number, result.etag))
offset += current_part_size
part_number += 1
# Langkah 3: Selesaikan unggah multi-bagian.
result = bucket.complete_multipart_upload(key, upload_id, parts)
print(f"Completed multipart upload. ETag: {result.etag}")
except Exception as e:
print(f"Error: {e}")
raise
if __name__ == "__main__":
main()
Go SDK V2
package main
// Contoh unggah multi-bagian menggunakan OSS Go SDK V2.
// Mengimplementasikan unggah multi-bagian untuk file besar.
import (
"context"
"fmt"
"io"
"os"
"github.com/aliyun/alibabacloud-oss-go-sdk-v2/oss"
"github.com/aliyun/alibabacloud-oss-go-sdk-v2/oss/credentials"
)
func main() {
// Dapatkan kredensial akses dari variabel lingkungan.
// Konfigurasikan klien OSS, atur penyedia kredensial dan titik akhir.
config := oss.LoadDefaultConfig().
WithCredentialsProvider(credentials.NewEnvironmentVariableCredentialsProvider()).
WithRegion("cn-hangzhou").
WithEndpoint("oss-cn-hangzhou.aliyuncs.com")
// Inisialisasi klien OSS.
client := oss.NewClient(config)
// Konfigurasikan informasi bucket dan file.
bucket := "example-bucket"
key := "dest.jpg"
filePath := "dest.jpg"
// Langkah 1: Inisialisasi unggah multi-bagian.
initResult, err := client.InitiateMultipartUpload(context.TODO(), &oss.InitiateMultipartUploadRequest{
Bucket: oss.Ptr(bucket),
Key: oss.Ptr(key),
})
if err != nil {
fmt.Printf("Error: %v\n", err)
return
}
uploadId := *initResult.UploadId
fmt.Printf("Inisialisasi unggah multi-bagian berhasil. ID Unggah: %s\n", uploadId)
// Langkah 2: Unggah bagian-bagian.
file, err := os.Open(filePath)
if err != nil {
fmt.Printf("Error: %v\n", err)
return
}
defer file.Close()
fileInfo, err := file.Stat()
if err != nil {
fmt.Printf("Error: %v\n", err)
return
}
fileSize := fileInfo.Size()
partSize := int64(100 * 1024) // 100 KB per bagian.
partNumber := int32(1)
var parts []oss.UploadPart
for offset := int64(0); offset < fileSize; offset += partSize {
// Hitung ukuran bagian saat ini.
currentPartSize := partSize
if offset+partSize > fileSize {
currentPartSize = fileSize - offset
}
// Baca data bagian.
file.Seek(offset, 0)
partData := io.LimitReader(file, currentPartSize)
// Unggah bagian.
partResult, err := client.UploadPart(context.TODO(), &oss.UploadPartRequest{
Bucket: oss.Ptr(bucket),
Key: oss.Ptr(key),
UploadId: oss.Ptr(uploadId),
PartNumber: partNumber,
Body: partData,
})
if err != nil {
fmt.Printf("Error: %v\n", err)
return
}
fmt.Printf("Nomor bagian: %d, ETag: %s\n", partNumber, *partResult.ETag)
// Catat informasi bagian yang diunggah.
parts = append(parts, oss.UploadPart{
PartNumber: partNumber,
ETag: partResult.ETag,
})
partNumber++
}
// Langkah 3: Selesaikan unggah multi-bagian.
completeResult, err := client.CompleteMultipartUpload(context.TODO(), &oss.CompleteMultipartUploadRequest{
Bucket: oss.Ptr(bucket),
Key: oss.Ptr(key),
UploadId: oss.Ptr(uploadId),
CompleteMultipartUpload: &oss.CompleteMultipartUpload{
Parts: parts,
},
})
if err != nil {
fmt.Printf("Error: %v\n", err)
return
}
fmt.Printf("Unggah multi-bagian selesai. Bucket: %s, Kunci: %s, Lokasi: %s, ETag: %s\n",
*completeResult.Bucket, *completeResult.Key, *completeResult.Location, *completeResult.ETag)
}
Go SDK V1
package main
// Contoh unggah multi-bagian menggunakan OSS Go SDK V1.
// Mengimplementasikan unggah multi-bagian untuk file besar.
import (
"fmt"
"os"
"github.com/aliyun/aliyun-oss-go-sdk/oss"
)
func main() {
// Dapatkan kredensial akses dari variabel lingkungan.
provider, _ := oss.NewEnvironmentVariableCredentialsProvider()
// Buat instans klien OSS.
client, _ := oss.New(
"oss-cn-hangzhou.aliyuncs.com",
"",
"",
oss.SetCredentialsProvider(&provider),
oss.AuthVersion(oss.AuthV4),
oss.Region("cn-hangzhou"),
)
// Dapatkan objek bucket.
bucket, _ := client.Bucket("example-bucket")
// Konfigurasikan informasi file.
key := "dest.jpg"
filePath := "dest.jpg"
// Langkah 1: Inisialisasi unggah multi-bagian.
imur, err := bucket.InitiateMultipartUpload(key)
if err != nil {
fmt.Printf("Error: %v\n", err)
return
}
fmt.Printf("Inisialisasi unggah multi-bagian berhasil. ID Unggah: %s\n", imur.UploadID)
// Langkah 2: Unggah bagian-bagian.
file, err := os.Open(filePath)
if err != nil {
fmt.Printf("Error: %v\n", err)
return
}
defer file.Close()
fileInfo, err := file.Stat()
if err != nil {
fmt.Printf("Error: %v\n", err)
return
}
fileSize := fileInfo.Size()
partSize := int64(100 * 1024) // 100 KB per bagian.
// Pisahkan file menjadi bagian-bagian.
chunks, err := oss.SplitFileByPartSize(filePath, partSize)
if err != nil {
fmt.Printf("Error: %v\n", err)
return
}
var parts []oss.UploadPart
for _, chunk := range chunks {
part, err := bucket.UploadPart(imur, file, chunk.Size, chunk.Number)
if err != nil {
fmt.Printf("Error: %v\n", err)
return
}
fmt.Printf("Nomor bagian: %d, ETag: %s\n", chunk.Number, part.ETag)
parts = append(parts, part)
}
// Langkah 3: Selesaikan unggah multi-bagian.
_, err = bucket.CompleteMultipartUpload(imur, parts)
if err != nil {
fmt.Printf("Error: %v\n", err)
return
}
fmt.Printf("Unggah multi-bagian selesai. Ukuran file: %d byte\n", fileSize)
}
Bersihkan bagian yang belum selesai
Karena adanya perubahan kebijakan untuk meningkatkan kepatuhan dan keamanan, mulai 20 Maret 2025, pengguna OSS baru harus menggunakan nama domain kustom (CNAME) untuk melakukan operasi API data pada bucket OSS yang berlokasi di wilayah Tiongkok daratan. Titik akhir publik default dibatasi untuk operasi ini. Lihat pengumuman resmi untuk daftar lengkap operasi yang terdampak. Jika Anda mengakses data melalui HTTPS, Anda harus mengikat Sertifikat SSL yang valid ke domain kustom Anda. Ini wajib untuk akses Konsol OSS, karena konsol menerapkan HTTPS.
Jika unggah multi-bagian terganggu tanpa memanggil AbortMultipartUpload, bagian-bagian yang diunggah tetap berada di bucket dan terus dikenai biaya penyimpanan. Bersihkan bagian-bagian ini untuk menghindari biaya yang tidak perlu.
Gunakan konsol
-
Buka daftar Bucket dan klik bucket tujuan.
-
Pada daftar Objects, klik Parts untuk melihat dan menghapus bagian-bagian.
Gunakan aturan siklus hidup
Aturan siklus hidup membersihkan bagian yang kedaluwarsa secara otomatis, mengurangi pemeliharaan manual. Untuk informasi lebih lanjut, lihat Membersihkan bagian kedaluwarsa menggunakan aturan siklus hidup.
Gunakan alat
-
ossbrowser
Di halaman daftar objek bucket, klik Parts untuk melihat dan menghapus parts.
-
ossutil
Gunakan perintah abort-multipart-upload untuk membatalkan unggah multi-bagian dan menghapus data bagian:
ossutil api abort-multipart-upload --bucket example-bucket --key dest.jpg --upload-id D9F4****************************
Gunakan SDK
Panggil AbortMultipartUpload untuk membatalkan unggah multi-bagian dan menghapus data bagian. Bagian berikut menunjukkan contoh kode untuk SDK umum. Untuk bahasa lainnya, lihat Referensi SDK.
Sebelum menjalankan kode, instal SDK dan konfigurasikan kredensial akses sebagai variabel lingkungan. Jika Anda menggunakan Pengguna RAM atau RAM role, berikan izin yang diperlukan. Untuk informasi lebih lanjut, lihat izin API.
Java SDK V2
import com.aliyun.sdk.service.oss2.OSSClient;
import com.aliyun.sdk.service.oss2.credentials.CredentialsProvider;
import com.aliyun.sdk.service.oss2.credentials.StaticCredentialsProvider;
import com.aliyun.sdk.service.oss2.models.AbortMultipartUploadRequest;
import com.aliyun.sdk.service.oss2.models.AbortMultipartUploadResult;
/**
* Contoh pembatalan unggah multi-bagian OSS.
* Menunjukkan cara membatalkan unggah multi-bagian.
*/
public class AbortMultipartUpload {
public static void main(String[] args) {
// Dapatkan kredensial akses dari variabel lingkungan.
String accessKeyId = System.getenv("OSS_ACCESS_KEY_ID");
String accessKeySecret = System.getenv("OSS_ACCESS_KEY_SECRET");
// Atur wilayah dan titik akhir OSS.
String region = "cn-hangzhou";
String endpoint = "oss-cn-hangzhou.aliyuncs.com";
// Konfigurasikan informasi bucket dan file.
String bucket = "example-bucket";
String key = "dest.jpg";
String uploadId = "D9F4****************************";
// Buat penyedia kredensial.
CredentialsProvider provider = new StaticCredentialsProvider(accessKeyId, accessKeySecret);
// Inisialisasi klien OSS.
OSSClient client = OSSClient.newBuilder()
.credentialsProvider(provider)
.region(region)
.endpoint(endpoint)
.build();
try {
// Batalkan unggah multi-bagian.
AbortMultipartUploadResult result = client.abortMultipartUpload(
AbortMultipartUploadRequest.newBuilder()
.bucket(bucket)
.key(key)
.uploadId(uploadId)
.build());
System.out.printf("Pembatalan unggah multi-bagian berhasil. Kode status: %d, ID Permintaan: %s\n",
result.statusCode(), result.requestId());
} catch (Exception e) {
System.out.printf("Error: %s\n", e.getMessage());
e.printStackTrace();
} finally {
// Tutup klien.
try {
client.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}
}
Java SDK V1
import com.aliyun.oss.*;
import com.aliyun.oss.common.auth.*;
import com.aliyun.oss.common.comm.SignVersion;
import com.aliyun.oss.model.*;
/**
* Contoh pembatalan unggah multi-bagian OSS (SDK V1).
* Menunjukkan cara membatalkan unggah multi-bagian.
*/
public class AbortMultipartUpload {
public static void main(String[] args) {
// Dapatkan kredensial akses dari variabel lingkungan.
String accessKeyId = System.getenv("OSS_ACCESS_KEY_ID");
String accessKeySecret = System.getenv("OSS_ACCESS_KEY_SECRET");
// Atur wilayah dan titik akhir OSS.
String region = "cn-hangzhou";
String endpoint = "oss-cn-hangzhou.aliyuncs.com";
// Konfigurasikan informasi bucket dan file.
String bucketName = "example-bucket";
String objectName = "dest.jpg";
String uploadId = "D9F4****************************";
// Buat penyedia kredensial.
DefaultCredentialProvider provider = new DefaultCredentialProvider(accessKeyId, accessKeySecret);
// Konfigurasikan parameter klien.
ClientBuilderConfiguration clientBuilderConfiguration = new ClientBuilderConfiguration();
clientBuilderConfiguration.setSignatureVersion(SignVersion.V4);
// Inisialisasi klien OSS.
OSS ossClient = OSSClientBuilder.create()
.credentialsProvider(provider)
.clientConfiguration(clientBuilderConfiguration)
.region(region)
.endpoint(endpoint)
.build();
try {
// Batalkan unggah multi-bagian.
AbortMultipartUploadRequest abortMultipartUploadRequest =
new AbortMultipartUploadRequest(bucketName, objectName, uploadId);
ossClient.abortMultipartUpload(abortMultipartUploadRequest);
System.out.printf("Pembatalan unggah multi-bagian berhasil. ID Unggah: %s\n", uploadId);
} catch (Exception e) {
System.out.printf("Error: %s\n", e.getMessage());
e.printStackTrace();
} finally {
// Tutup klien.
ossClient.shutdown();
}
}
}
Python SDK V2
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
// Contoh pembatalan unggah multi-bagian menggunakan OSS Python SDK V2.
// Membatalkan unggah multi-bagian dan menghapus bagian yang diunggah.
import alibabacloud_oss_v2 as oss
def main():
// Dapatkan kredensial akses dari variabel lingkungan.
credentials_provider = oss.credentials.EnvironmentVariableCredentialsProvider()
// Muat konfigurasi default SDK.
config = oss.config.load_default()
config.credentials_provider = credentials_provider
// Atur wilayah dan titik akhir OSS.
config.region = "cn-hangzhou"
config.endpoint = "oss-cn-hangzhou.aliyuncs.com"
// Inisialisasi klien OSS.
client = oss.Client(config)
// Konfigurasikan informasi bucket dan file.
bucket = "example-bucket"
key = "dest.jpg"
upload_id = "D9F4****************************"
// Batalkan unggah multi-bagian.
result = client.abort_multipart_upload(
oss.AbortMultipartUploadRequest(
bucket=bucket,
key=key,
upload_id=upload_id
))
print(f"Pembatalan unggah multi-bagian berhasil. Kode status: {result.status_code}, ID Permintaan: {result.request_id}")
if __name__ == "__main__":
main()
Python SDK V1
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
# Contoh untuk membatalkan unggah multi-bagian menggunakan OSS Python SDK V1.
import oss2
from oss2.credentials import EnvironmentVariableCredentialsProvider
def main():
# Dapatkan kredensial akses dari variabel lingkungan.
auth = oss2.ProviderAuthV4(EnvironmentVariableCredentialsProvider())
# Atur wilayah OSS dan titik akhir.
region = "cn-hangzhou"
endpoint = "https://oss-cn-hangzhou.aliyuncs.com"
# Konfigurasikan informasi bucket dan file.
bucket_name = "example-bucket"
key = "dest.jpg"
upload_id = "D9F4****************************"
# Inisialisasi klien OSS.
bucket = oss2.Bucket(auth, endpoint, bucket_name, region=region)
# Batalkan unggah multi-bagian.
bucket.abort_multipart_upload(key, upload_id)
print(f"Canceled multipart upload successfully. Upload ID: {upload_id}")
if __name__ == "__main__":
main()
Go SDK V2
package main
// Contoh pembatalan unggah multi-bagian menggunakan OSS Go SDK V2.
import (
"context"
"fmt"
"github.com/aliyun/alibabacloud-oss-go-sdk-v2/oss"
"github.com/aliyun/alibabacloud-oss-go-sdk-v2/oss/credentials"
)
func main() {
// Dapatkan kredensial akses dari variabel lingkungan.
// Konfigurasikan klien OSS, atur penyedia kredensial dan titik akhir.
config := oss.LoadDefaultConfig().
WithCredentialsProvider(credentials.NewEnvironmentVariableCredentialsProvider()).
WithRegion("cn-hangzhou").
WithEndpoint("oss-cn-hangzhou.aliyuncs.com")
// Inisialisasi klien OSS.
client := oss.NewClient(config)
// Konfigurasikan informasi bucket dan file.
bucket := "example-bucket"
key := "dest.jpg"
uploadId := "D9F4****************************"
// Batalkan unggah multi-bagian.
client.AbortMultipartUpload(context.TODO(), &oss.AbortMultipartUploadRequest{
Bucket: oss.Ptr(bucket),
Key: oss.Ptr(key),
UploadId: oss.Ptr(uploadId),
})
fmt.Printf("Pembatalan unggah multi-bagian berhasil. ID Unggah: %s\n", uploadId)
}
Go SDK V1
package main
// Contoh pembatalan unggah multi-bagian menggunakan OSS Go SDK V1.
import (
"fmt"
"github.com/aliyun/aliyun-oss-go-sdk/oss"
)
func main() {
// Dapatkan kredensial akses dari variabel lingkungan.
provider, _ := oss.NewEnvironmentVariableCredentialsProvider()
// Buat instans klien OSS.
client, _ := oss.New(
"oss-cn-hangzhou.aliyuncs.com",
"",
"",
oss.SetCredentialsProvider(&provider),
oss.AuthVersion(oss.AuthV4),
oss.Region("cn-hangzhou"),
)
// Dapatkan objek bucket.
bucket, _ := client.Bucket("example-bucket")
// Konfigurasikan informasi file.
key := "dest.jpg"
uploadId := "D9F4****************************"
// Buat objek InitiateMultipartUploadResult.
imur := oss.InitiateMultipartUploadResult{
UploadID: uploadId,
Key: key,
}
// Batalkan unggah multi-bagian.
bucket.AbortMultipartUpload(imur)
fmt.Printf("Pembatalan unggah multi-bagian berhasil. ID Unggah: %s\n", uploadId)
}
Terapkan di produksi
Praktik terbaik
-
Optimasi performa: Tingkatkan kecepatan dan stabilitas unggah
-
Kontrol jumlah bagian konkuren: Seimbangkan tingkat konkurensi dengan bandwidth yang tersedia dan beban perangkat. Terlalu banyak koneksi menyebabkan kemacetan; terlalu sedikit menyebabkan jaringan tidak dimanfaatkan secara optimal.
-
Hindari awalan berurutan dalam nama: Jangan gunakan awalan berurutan seperti stempel waktu dalam nama objek. Hal ini memusatkan permintaan pada satu partisi dan menyebabkan hotspot. Untuk informasi lebih lanjut, lihat Praktik terbaik performa OSS.
-
-
Jaminan keandalan: Implementasikan unggah yang dapat dilanjutkan
Unggah multi-bagian tidak kedaluwarsa dan mendukung jeda serta lanjut. Gunakan UploadId sebagai pengenal tugas. Jika suatu bagian gagal, unggah ulang hanya bagian tersebut, bukan seluruh file.
-
Optimasi biaya: Optimalkan strategi unggah untuk Deep Cold Archive
Untuk mengoptimalkan biaya Deep Cold Archive, unggah file sebagai objek Standard dan gunakan aturan siklus hidup untuk mentransisikannya. Hal ini menghindari biaya PUT per permintaan yang lebih tinggi dibandingkan unggah langsung.
Pencegahan risiko
-
Keamanan data: Cegah penimpaan file
Atur
x-oss-forbid-overwriteketruedalam header permintaan untuk mencegah penimpaan nama yang sama yang dapat menyebabkan kehilangan data. Anda juga dapat mengaktifkan Pengendalian versi untuk menyimpan versi historis.
Batasan
|
Batasan |
Deskripsi |
|
Ukuran file tunggal |
Hingga 48,8 TB |
|
Jumlah bagian |
1 hingga 10.000 |
|
Ukuran bagian tunggal |
Ukuran minimum 100 KB dan ukuran maksimum 5 GB. Ukuran bagian terakhir boleh kurang dari 100 KB. |
|
Jumlah maksimum bagian yang dikembalikan dalam satu permintaan ListParts |
1.000 |
|
Jumlah maksimum event unggah multi-bagian yang dikembalikan dalam satu permintaan ListMultipartUploads |
1.000 |
Penagihan
Tabel berikut mencantumkan item yang dapat ditagih untuk operasi unggah multi-bagian. Untuk informasi lebih lanjut tentang penagihan, lihat Biaya permintaan dan Biaya penyimpanan.
|
API |
Item yang dapat ditagih |
Deskripsi |
|
InitiateMultipartUpload |
Permintaan PUT |
Biaya dihitung berdasarkan jumlah permintaan yang berhasil. |
|
UploadPart |
Permintaan PUT |
Biaya dihitung berdasarkan jumlah permintaan yang berhasil. |
|
Biaya penyimpanan |
Biaya penyimpanan dikenakan berdasarkan kelas penyimpanan bagian (yang sama dengan objek), ukuran aktualnya, dan durasi penyimpanan. Tidak ada satuan ukuran minimum. Penagihan berhenti setelah bagian dihapus atau digabung menjadi objek utuh. |
|
|
UploadPartCopy |
Permintaan PUT |
Biaya dihitung berdasarkan jumlah permintaan yang berhasil. |
|
CompleteMultipartUpload |
Permintaan PUT |
Biaya dihitung berdasarkan jumlah permintaan yang berhasil. |
|
Biaya penyimpanan |
Biaya penyimpanan dikenakan berdasarkan kelas penyimpanan, ukuran, dan durasi objek. |
|
|
AbortMultipartUpload |
Permintaan PUT |
Biaya dihitung berdasarkan jumlah permintaan yang berhasil. Penting
|
|
ListMultipartUploads |
Permintaan PUT |
Biaya dihitung berdasarkan jumlah permintaan yang berhasil. |
|
ListParts |
Permintaan PUT |
Biaya dihitung berdasarkan jumlah permintaan yang berhasil. |
Saat Anda menggunakan UploadPartCopy untuk menyalin data dari objek yang ada guna mengunggah bagian, jika kelas penyimpanan objek sumber adalah Akses Jarang (IA), Arsip, atau Penyimpanan Arsip Dingin, biaya pengambilan data akan dikenakan (jika objek sumber menggunakan kelas penyimpanan Arsip dan akses real-time ke objek Arsip diaktifkan, biaya akses real-time untuk objek Arsip akan dikenakan). Selain itu, kelas penyimpanan seperti IA, Arsip, dan Penyimpanan Arsip Dingin memiliki durasi penyimpanan minimum dan persyaratan ukuran tagihan minimum, yang dapat mengakibatkan biaya penyimpanan minimum terkait.
Izin API
Akun Alibaba Cloud memiliki izin API penuh secara default. Pengguna RAM dan role RAM memerlukan izin eksplisit untuk setiap operasi API. Untuk informasi lebih lanjut, lihat Kebijakan RAM dan Contoh umum kebijakan RAM.
|
API |
Action |
Deskripsi |
|
InitiateMultipartUpload |
|
Menginisialisasi unggah multi-bagian. |
|
|
Izin ini diperlukan jika Anda menentukan tag objek menggunakan x-oss-tagging saat menginisialisasi unggah multi-bagian. |
|
|
|
Izin ini diperlukan jika metadata objek berisi X-Oss-Server-Side-Encryption: KMS saat Anda mengunggah objek. |
|
|
|
||
|
UploadPart |
|
Mengunggah bagian. |
|
UploadPartCopy |
|
Izin untuk membaca objek sumber diperlukan saat Anda mengunggah bagian dengan menyalin data dari objek yang ada. |
|
|
Izin untuk menulis ke objek tujuan diperlukan saat Anda mengunggah bagian dengan menyalin data dari objek yang ada. |
|
|
|
Izin untuk membaca versi tertentu objek sumber diperlukan jika Anda menentukan versi objek menggunakan versionId saat mengunggah bagian dengan menyalin data dari objek yang ada. |
|
|
CompleteMultipartUpload |
|
Menggabungkan bagian menjadi objek. |
|
|
Izin ini diperlukan jika Anda menentukan tag objek menggunakan x-oss-tagging saat menggabungkan bagian menjadi objek. |
|
|
AbortMultipartUpload |
|
Membatalkan event unggah multi-bagian dan menghapus data bagian terkait. |
|
ListMultipartUploads |
|
Menampilkan semua event unggah multi-bagian yang sedang berlangsung. Ini adalah event yang telah diinisiasi namun belum diselesaikan atau dibatalkan. |
|
ListParts |
|
Menampilkan semua bagian yang berhasil diunggah yang termasuk dalam UploadId tertentu. |