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(®ion, "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.