Mengunggah file besar bisa menjadi tantangan karena gangguan jaringan dan waktu transfer yang lama. Unggah multi-bagian mengatasi masalah ini dengan membagi file menjadi bagian-bagian kecil, mentransfernya secara bersamaan, serta mendukung unggah yang dapat dilanjutkan. Metode ini mengoptimalkan kinerja dan sangat efektif untuk transfer melalui jaringan yang tidak stabil.
Cara kerja
Unggah multi-bagian membagi file besar menjadi bagian-bagian kecil yang diproses secara independen. Setiap bagian ditransfer dan diverifikasi secara terpisah. Jika satu bagian gagal diunggah, Anda hanya perlu mengunggah ulang bagian tersebut, bukan seluruh file. Sebuah UploadId mengidentifikasi tugas tersebut dan memastikan semua bagian dikaitkan dengan benar. Proses intinya terdiri dari tiga langkah:
Inisialisasi unggah: Panggil operasi InitiateMultipartUpload untuk membuat unggah multi-bagian dan mendapatkan UploadId unik yang mengidentifikasi operasi selanjutnya.
Unggah data bagian file: Unggah file dalam bagian-bagian secara bersamaan, masing-masing berukuran antara 100 KB hingga 5 GB. Fitur unggah yang dapat dilanjutkan didukung.
Selesaikan unggah dengan menggabungkan bagian: Panggil operasi CompleteMultipartUpload untuk menggabungkan semua bagian sesuai nomor bagian mereka menjadi satu objek utuh.
Implementasikan unggah multi-bagian untuk file besar
Karena 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 Daratan Tiongkok. 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. Hal ini wajib untuk akses Konsol OSS, karena konsol menerapkan HTTPS.
Gunakan alat grafis, alat baris perintah, atau SDK sesuai kebutuhan 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 harian, pengujian, O&M, atau unggah manual, gunakan alat grafis atau baris perintah. Alat-alat ini secara otomatis menangani logika pemisahan bagian dan mudah digunakan.
Alat manajemen grafis: OSS Browser
Saat Anda menggunakan ossbrowser 2.0 untuk mengunggah file, unggah multi-bagian diaktifkan secara default. ossbrowser menyediakan antarmuka visual untuk memantau progres dan status unggah.
ossutil
Saat Anda menggunakan perintah cp dari ossutil 2.0 untuk mengunggah file, alat ini secara otomatis mengaktifkan unggah multi-bagian untuk file yang lebih besar dari 100 MiB guna meningkatkan tingkat keberhasilan dan efisiensi transfer file besar. Untuk mengontrol proses unggah multi-bagian secara manual, gunakan perintah initiate-multipart-upload, upload-part, dan complete-multipart-upload secara bersamaan.
ossutil cp example.zip oss://example-bucket
Kontrol programatis dengan SDK
SDK untuk berbagai bahasa telah mengenkapsulasi operasi unggah multi-bagian, mendukung ukuran bagian kustom, kontrol konkurensi, dan penanganan error. Bagian berikut menyediakan contoh unggah multi-bagian untuk SDK umum. Untuk contoh dalam bahasa lain, lihat kode sampel di Referensi SDK.
Sebelum menjalankan kode, instal SDK yang sesuai dan konfigurasikan kredensial akses Anda sebagai variabel lingkungan. Jika Anda menggunakan Pengguna RAM atau Peran RAM, Anda juga harus memberikan 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");
// Tetapkan 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, Upload ID: %s\n",
initiateResult.statusCode(), initiateResult.requestId(), uploadId);
// Langkah 2: Unggah 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, Key: %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");
// Tetapkan 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. Upload ID: %s\n", uploadId);
// Langkah 2: Unggah 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 bagian yang diunggah.
List<PartETag> partETags = new ArrayList<>();
// Telusuri dan unggah 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
# Tetapkan 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}, 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
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"Key: {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 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())
# Tetapkan 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"Inisialisasi unggah multi-bagian berhasil. 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"Nomor bagian: {part_number}, ETag: {result.etag}")
# Catat informasi 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"Unggah multi-bagian selesai. 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, tetapkan 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. Upload ID: %s\n", uploadId)
// Langkah 2: Unggah 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, Key: %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. Upload ID: %s\n", imur.UploadID)
// Langkah 2: Unggah 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.
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 tidak lengkap
Karena 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 Daratan Tiongkok. 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. Hal ini wajib untuk akses Konsol OSS, karena konsol menerapkan HTTPS.
Jika unggah multi-bagian terganggu tanpa dibatalkan (dengan memanggil AbortMultipartUpload), bagian-bagian yang telah diunggah tetap tersimpan di bucket dan terus dikenai biaya penyimpanan. Bersihkan bagian-bagian ini segera untuk menghindari biaya penyimpanan yang tidak perlu.
Gunakan konsol
Buka daftar Bucket dan klik bucket tujuan.
Pada daftar Objects, klik Parts untuk melihat dan menghapus bagian.
Gunakan aturan siklus hidup
Konfigurasikan aturan siklus hidup untuk membersihkan bagian kedaluwarsa secara otomatis. Ini mengurangi pemeliharaan manual dan mencegah kelalaian. Untuk informasi lebih lanjut, lihat Bersihkan bagian kedaluwarsa menggunakan aturan siklus hidup.
Gunakan alat
ossbrowser
Pada halaman daftar objek bucket, klik Parts untuk melihat dan menghapus bagian.
ossutil
Gunakan perintah abort-multipart-upload untuk membatalkan unggah multi-bagian dan menghapus data bagian terkait. Contoh perintahnya sebagai berikut:
ossutil api abort-multipart-upload --bucket example-bucket --key dest.jpg --upload-id D9F4****************************
Gunakan SDK
Panggil operasi AbortMultipartUpload untuk membatalkan unggah multi-bagian dan menghapus data bagian terkait. Bagian berikut menyediakan contoh kode untuk membatalkan unggah multi-bagian menggunakan SDK umum. Untuk contoh dalam bahasa lain, lihat kode sampel di Referensi SDK.
Sebelum menjalankan kode, instal SDK yang sesuai dan konfigurasikan kredensial akses Anda sebagai variabel lingkungan. Jika Anda menggunakan Pengguna RAM atau Peran RAM, Anda juga harus memberikan 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");
// Tetapkan 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");
// Tetapkan 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. Upload ID: %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
// Tetapkan 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 pembatalan 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())
// Tetapkan wilayah dan titik akhir OSS.
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"Pembatalan unggah multi-bagian berhasil. 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, tetapkan 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. Upload ID: %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. Upload ID: %s\n", uploadId)
}
Terapkan di produksi
Praktik terbaik
Optimasi kinerja: Tingkatkan kecepatan dan stabilitas unggah
Kontrol jumlah bagian bersamaan: Tentukan jumlah bagian bersamaan yang wajar berdasarkan lebar pita jaringan dan beban perangkat Anda. Terlalu banyak koneksi bersamaan dapat meningkatkan beban sistem dan menyebabkan kemacetan jaringan, sedangkan terlalu sedikit tidak dapat memanfaatkan sumber daya jaringan secara optimal.
Hindari awalan berurutan dalam nama: Saat mengunggah banyak file, hindari penggunaan awalan berurutan, seperti timestamp, dalam nama file. Hal ini mencegah permintaan terkonsentrasi pada partisi tertentu, yang dapat menyebabkan masalah hot spot dan memengaruhi kinerja unggah secara keseluruhan. Untuk informasi lebih lanjut, lihat Praktik terbaik kinerja OSS.
Jaminan keandalan: Implementasikan unggah yang dapat dilanjutkan
Unggah multi-bagian tidak kedaluwarsa dan mendukung operasi jeda serta lanjut. Gunakan UploadId sebagai pengenal tugas. Jika satu bagian gagal diunggah, Anda hanya perlu mengunggah ulang bagian tersebut, bukan seluruh file dari awal. Hal ini secara signifikan meningkatkan efisiensi transfer.
Optimasi biaya: Optimalkan strategi unggah untuk Deep Cold Archive
Untuk mengoptimalkan biaya Deep Cold Archive, unggah file terlebih dahulu sebagai objek Standard, lalu gunakan aturan siklus hidup untuk mengubah kelas penyimpanannya. Hal ini menghindari biaya PUT per permintaan yang lebih tinggi saat mengunggah langsung.
Pencegahan risiko
Keamanan data: Cegah penimpaan file
Pada header permintaan unggah, atur parameter
x-oss-forbid-overwriteketrueuntuk mencegah penimpaan file dengan 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 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 menjelaskan item yang dapat ditagih yang dihasilkan oleh berbagai operasi selama 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 (sama dengan objek), ukuran aktualnya, dan durasi penyimpanan. Tidak ada satuan pengukuran 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. |
Izin API
Akun Alibaba Cloud memiliki izin untuk memanggil semua operasi API secara default. Untuk menggunakan fitur unggah multi-bagian sebagai Pengguna RAM atau dengan mengasumsikan Peran RAM, Anda harus diberikan izin yang diperlukan untuk operasi API tertentu. 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 membaca objek sumber diperlukan saat Anda mengunggah bagian dengan menyalin data dari objek yang sudah ada. |
| Izin menulis ke objek tujuan diperlukan saat Anda mengunggah bagian dengan menyalin data dari objek yang sudah ada. | |
| Izin membaca versi tertentu objek sumber diperlukan jika Anda menentukan versi objek menggunakan versionId saat mengunggah bagian dengan menyalin data dari objek yang sudah 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 diinisialisasi tetapi belum diselesaikan atau dibatalkan. |
ListParts |
| Menampilkan semua bagian yang berhasil diunggah yang termasuk dalam UploadId tertentu. |