OSS menyediakan direktori yang mensimulasikan struktur folder untuk memudahkan pengorganisasian, pencarian, dan pelaksanaan operasi massal pada sejumlah besar objek.
Cara kerja
OSS menggunakan penyimpanan datar dan tidak memiliki folder nyata. Direktori di konsol dihasilkan dari delimiter / dalam nama objek.
Sebagai contoh, ketika Anda melihat hierarki berikut di konsol:
examplebucket
└── log/
├── date1.txt
├── date2.txt
├── date3.txt
└── destfolder/
└── 2021/
├── photo.jpg
Objek aktual yang disimpan di OSS adalah:
log/date1.txt
log/date2.txt
destfolder/2021/photo.jpg
Buat direktori
Buat direktori dengan cara berikut:
-
Pembuatan otomatis: Saat Anda mengunggah objek yang namanya berisi jalur, direktori yang sesuai akan dibuat secara otomatis.
-
Pembuatan manual: Buat objek berukuran nol byte yang diakhiri dengan
/sebagai placeholder direktori.Konsol
-
Login ke Konsol OSS. Di bucket target, navigasikan ke Object Management > Objects.
-
Klik Create Directory.
-
Masukkan Directory Name dan klik OK.
Nama direktori harus mengikuti aturan berikut:
-
Nama direktori harus dikodekan dalam UTF-8 dan tidak boleh mengandung emoji.
-
Slash maju (
/) digunakan dalam nama direktori untuk menunjukkan subdirektori. Gunakan slash maju (/) dalam nama direktori untuk membuat struktur direktori bersarang. Nama direktori tidak boleh diawali dengan slash maju (/) atau backslash (\). Nama direktori tidak boleh mengandung dua slash maju berturut-turut (//). -
Nama subdirektori tidak boleh berupa dua titik berturut-turut (
..). -
Panjang nama direktori harus antara 1 hingga 254 karakter.
-
ossutil
Buat direktori bernama
dir/di bucketexamplebucket:ossutil mkdir oss://examplebucket/dirSDK
Contoh berikut membuat direktori menggunakan SDK umum. SDK lainnya dijelaskan dalam Pengenalan SDK OSS.
import com.aliyun.oss.ClientException; import com.aliyun.oss.OSS; import com.aliyun.oss.common.auth.*; import com.aliyun.oss.OSSClientBuilder; import com.aliyun.oss.OSSException; import java.io.ByteArrayInputStream; public class Demo { public static void main(String[] args) throws Exception { // Tetapkan endpoint. Wilayah China (Hangzhou) digunakan dalam contoh ini. Tentukan endpoint yang sebenarnya. String endpoint = "https://oss-cn-hangzhou.aliyuncs.com"; // Untuk keamanan, jangan hard-code kredensial akses. Kredensial yang bocor dapat membahayakan semua resource Anda. Contoh ini menggunakan variabel lingkungan untuk kredensial. Pastikan telah dikonfigurasi sebelum menjalankan. EnvironmentVariableCredentialsProvider credentialsProvider = CredentialsProviderFactory.newEnvironmentVariableCredentialsProvider(); // Tentukan nama bucket, misalnya examplebucket. String bucketName = "examplebucket"; // Tentukan nama direktori untuk Metode 1. String dirName = "exampledir/"; // Tentukan nama direktori untuk Metode 2. String dirName2 = "exampledir1/"; // Buat instance OSSClient. OSS ossClient = new OSSClientBuilder().build(endpoint, credentialsProvider); try { // Metode 1: Buat direktori dengan memanggil operasi createDirectory. Sebelum menggunakan metode ini, Anda harus mengaktifkan hierarchical namespace. ossClient.createDirectory(bucketName, dirName); // Metode 2: Buat direktori dengan mengunggah string kosong. ossClient.putObject(bucketName, dirName2, new ByteArrayInputStream("".getBytes())); } catch (OSSException oe) { System.out.println("Terjadi OSSException, artinya permintaan Anda sampai ke OSS, " + "tetapi ditolak dengan tanggapan error karena suatu alasan."); System.out.println("Pesan Error:" + oe.getErrorMessage()); System.out.println("Kode Error:" + oe.getErrorCode()); System.out.println("ID Permintaan:" + oe.getRequestId()); System.out.println("Host ID:" + oe.getHostId()); } catch (ClientException ce) { System.out.println("Terjadi ClientException, artinya klien mengalami " + "masalah internal serius saat mencoba berkomunikasi dengan OSS, " + "seperti tidak dapat mengakses jaringan."); System.out.println("Pesan Error:" + ce.getMessage()); } finally { if (ossClient != null) { ossClient.shutdown(); } } } }<?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; // Dapatkan kredensial akses dari variabel lingkungan. Sebelum menjalankan contoh ini, pastikan variabel lingkungan OSS_ACCESS_KEY_ID dan OSS_ACCESS_KEY_SECRET telah dikonfigurasi. $provider = new EnvironmentVariableCredentialsProvider(); // Tentukan endpoint untuk wilayah bucket Anda. Misalnya, gunakan https://oss-cn-hangzhou.aliyuncs.com untuk wilayah China (Hangzhou). $endpoint = "yourEndpoint"; // Tentukan nama bucket, misalnya examplebucket. $bucket= "examplebucket"; // Tentukan nama direktori. Nama harus diakhiri dengan slash maju (/). $object = "exampledir/"; $content = ""; try{ $config = array( "provider" => $provider, "endpoint" => $endpoint, ); $ossClient = new OssClient($config); $ossClient->putObject($bucket, $object, $content); } catch(OssException $e) { printf(__FUNCTION__ . ": GAGAL\n"); printf($e->getMessage() . "\n"); return; } print(__FUNCTION__ . "BERHASIL" . "\n"); // Anda dapat mengatur header saat mengunggah objek, seperti mengatur izin akses menjadi private atau menentukan metadata kustom. $options = array( OssClient::OSS_HEADERS => array( 'x-oss-object-acl' => 'private', 'x-oss-meta-info' => 'your info' ), ); try{ $config = array( "provider" => $provider, "endpoint" => $endpoint, ); $ossClient = new OssClient($config); $ossClient->putObject($bucket, $object, $content, $options); } catch(OssException $e) { printf(__FUNCTION__ . ": GAGAL\n"); printf($e->getMessage() . "\n"); return; } print(__FUNCTION__ . "BERHASIL" . "\n");const OSS = require('ali-oss'); const client = new OSS({ // Tentukan wilayah tempat bucket Anda berada. Misalnya, gunakan 'oss-cn-hangzhou' untuk wilayah China (Hangzhou). region: 'yourregion', // Dapatkan kredensial akses dari variabel lingkungan. Sebelum menjalankan contoh ini, 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, // Tentukan nama bucket. bucket: 'examplebucket', }); async function putBuffer () { try { // Tentukan nama direktori. Nama harus diakhiri dengan slash maju (/). const result = await client.put('exampledir/', new Buffer('')); console.log(result); } catch (e) { console.log(e); } } putBuffer();# -*- coding: utf-8 -*- import oss2 from oss2.credentials import EnvironmentVariableCredentialsProvider # Dapatkan kredensial akses dari variabel lingkungan. Sebelum menjalankan contoh ini, pastikan variabel lingkungan OSS_ACCESS_KEY_ID dan OSS_ACCESS_KEY_SECRET telah dikonfigurasi. auth = oss2.ProviderAuth(EnvironmentVariableCredentialsProvider()) # Tentukan endpoint untuk wilayah bucket Anda. Misalnya, gunakan https://oss-cn-hangzhou.aliyuncs.com untuk wilayah China (Hangzhou). # Tentukan nama bucket. bucket = oss2.Bucket(auth, 'https://oss-cn-hangzhou.aliyuncs.com', 'examplebucket') # Tentukan nama direktori. Nama harus diakhiri dengan slash maju (/). bucket.put_object('exampledir/', '')using System.Text; using Aliyun.OSS; // Tentukan endpoint untuk wilayah bucket Anda. Misalnya, gunakan https://oss-cn-hangzhou.aliyuncs.com untuk wilayah China (Hangzhou). var endpoint = "yourEndpoint"; // Dapatkan kredensial akses dari variabel lingkungan. Sebelum menjalankan contoh ini, 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, misalnya examplebucket. var bucketName = "examplebucket"; // Tentukan nama direktori. Nama harus diakhiri dengan slash maju (/). var objectName = "exampledir/"; var objectContent = ""; // Buat instance OssClient. var client = new OssClient(endpoint, accessKeyId, accessKeySecret); try { byte[] binaryData = Encoding.ASCII.GetBytes(objectContent); MemoryStream requestContent = new MemoryStream(binaryData); // Buat direktori. client.PutObject(bucketName, objectName, requestContent); Console.WriteLine("Put object berhasil"); } catch (Exception ex) { Console.WriteLine("Put object gagal, {0}", ex.Message); }#include "oss_api.h" #include "aos_http_io.h" /* Tentukan endpoint untuk wilayah bucket Anda. Misalnya, gunakan https://oss-cn-hangzhou.aliyuncs.com untuk wilayah China (Hangzhou). */ const char *endpoint = "yourEndpoint"; /* Tentukan nama bucket, misalnya examplebucket. */ const char *bucket_name = "examplebucket"; /* Tentukan nama direktori. Nama harus diakhiri dengan slash maju (/). */ const char *object_name = "exampledir/"; const char *object_content = ""; void init_options(oss_request_options_t *options) { options->config = oss_config_create(options->pool); /* Inisialisasi tipe aos_string_t dengan string char*. */ aos_str_set(&options->config->endpoint, endpoint); /* Dapatkan kredensial akses dari variabel lingkungan. Sebelum menjalankan contoh ini, 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 apakah CNAME digunakan. 0 berarti tidak menggunakan CNAME. */ options->config->is_cname = 0; /* Atur parameter jaringan, seperti periode timeout. */ options->ctl = aos_http_controller_create(options->pool, 0); } int main(int argc, char *argv[]) { /* Panggil metode aos_http_io_initialize saat startup program untuk menginisialisasi resource global, seperti jaringan dan memori. */ if (aos_http_io_initialize(NULL, 0) != AOSE_OK) { exit(1); } /* Memory pool (pool), yang setara dengan apr_pool_t, digunakan untuk manajemen memori. Diimplementasikan dalam library apr. */ aos_pool_t *pool; /* Buat memory pool. Parameter kedua adalah NULL, yang berarti memory pool tidak mewarisi dari memory pool lain. */ aos_pool_create(&pool, NULL); /* Buat dan inisialisasi opsi. Parameter ini mencakup informasi konfigurasi global seperti endpoint, access_key_id, access_key_secret, is_cname, dan curl. */ oss_request_options_t *oss_client_options; /* Alokasikan memori untuk opsi dari memory pool. */ oss_client_options = oss_request_options_create(pool); /* Inisialisasi opsi klien oss_client_options. */ init_options(oss_client_options); /* Inisialisasi parameter. */ aos_string_t bucket; aos_string_t object; aos_list_t buffer; aos_buf_t *content = NULL; aos_table_t *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_list_init(&buffer); content = aos_buf_pack(oss_client_options->pool, object_content, strlen(object_content)); aos_list_add_tail(&content->node, &buffer); /* Unggah objek. */ resp_status = oss_put_object_from_buffer(oss_client_options, &bucket, &object, &buffer, headers, &resp_headers); /* Periksa apakah unggahan berhasil. */ if (aos_status_is_ok(resp_status)) { printf("put object from buffer berhasil\n"); } else { printf("put object from buffer gagal\n"); } /* Hancurkan memory pool. Ini melepaskan memori yang dialokasikan untuk resource selama permintaan. */ aos_pool_destroy(pool); /* Lepaskan resource global yang sebelumnya dialokasikan. */ aos_http_io_deinitialize(); return 0; } -
Ubah nama direktori
Mengubah nama direktori bukanlah operasi atomik. Proses ini terdiri dari dua langkah:
-
Salin: Salin secara rekursif semua objek dari direktori sumber ke direktori tujuan baru.
-
Hapus: Setelah Anda memastikan operasi salin berhasil, hapus secara permanen direktori sumber beserta semua objek di dalamnya.
Penggantian nama akan menyalin lalu menghapus setiap objek di dalam direktori. Untuk direktori berukuran besar, proses ini memerlukan waktu lama serta menimbulkan biaya panggilan API dan transfer data yang signifikan. Evaluasi dampaknya secara cermat sebelum melanjutkan.
-
Jika hierarchical namespace diaktifkan pada bucket Anda, Anda dapat langsung mengubah nama direktori.
Konsol
Login ke konsol OSS.
Di panel navigasi kiri, klik Buckets. Di halaman Buckets, temukan dan klik bucket yang diinginkan.
Di panel navigasi kiri, pilih Object Management > Objects.
-
Ubah nama atau pindahkan direktori.
Hapus direktori dengan menentukan namanya sebagai opsi prefix pada perintah
ossutilrm. rm (delete)Skenario
Aksi
Ubah nama direktori
Arahkan kursor ke direktori target dan klik ikon
untuk mengubah nama direktori. Nama direktori tidak boleh diawali dengan slash maju /.Pindahkan direktori
Memindahkan direktori mirip dengan mengubah namanya, tetapi nama direktori baru harus diawali dengan slash maju (/). Tentukan direktori tujuan berdasarkan salah satu skenario berikut:
-
Jika Anda ingin memindahkan subdirektori subdir dari direktori induk destdir ke direktori induk lain destfolder, masukkan /destfolder/subdir sebagai nama direktori baru.
-
Jika Anda ingin memindahkan subdirektori subdir dari direktori induk destdir ke direktori root bucket, masukkan /subdir sebagai nama direktori baru.
-
SDK
Mengubah nama direktori hanya didukung oleh Java SDK versi 3.12.0 atau lebih baru.
import com.aliyun.oss.ClientException; import com.aliyun.oss.OSS; import com.aliyun.oss.common.auth.*; import com.aliyun.oss.OSSClientBuilder; import com.aliyun.oss.OSSException; import com.aliyun.oss.model.*; public class Demo { public static void main(String[] args) throws Exception { // Tetapkan yourEndpoint ke endpoint wilayah tempat bucket berada. Misalnya, jika bucket berada di wilayah China (Hangzhou), tetapkan endpoint ke https://oss-cn-hangzhou.aliyuncs.com. String endPoint = "yourEndpoint"; // Hindari hard-coding kredensial akses, karena kredensial yang bocor dapat membahayakan resource Anda. Contoh ini mendapatkan kredensial dari variabel lingkungan. Pastikan variabel tersebut dikonfigurasi sebelum menjalankan kode. EnvironmentVariableCredentialsProvider credentialsProvider = CredentialsProviderFactory.newEnvironmentVariableCredentialsProvider(); // Tentukan nama bucket. Contoh: examplebucket. String bucketName = "examplebucket"; // Tentukan jalur mutlak direktori sumber. Jalur mutlak tidak boleh mengandung nama bucket. String sourceDir = "exampledir"; // Tentukan jalur mutlak direktori tujuan, yang harus berada di bucket yang sama dengan direktori sumber. Jalur mutlak tidak boleh mengandung nama bucket. String destinationDir = "newexampledir"; // Buat instance OSSClient. OSS ossClient = new OSSClientBuilder().build(endPoint, credentialsProvider); try { // Ubah nama direktori sumber di bucket menjadi direktori tujuan. RenameObjectRequest renameObjectRequest = new RenameObjectRequest(bucketName, sourceDir, destinationDir); ossClient.renameObject(renameObjectRequest); } catch (OSSException oe) { System.out.println("Terjadi OSSException, artinya permintaan Anda sampai ke OSS, " + "tetapi ditolak dengan tanggapan error karena suatu alasan."); System.out.println("Pesan Error:" + oe.getErrorMessage()); System.out.println("Kode Error:" + oe.getErrorCode()); System.out.println("ID Permintaan:" + oe.getRequestId()); System.out.println("Host ID:" + oe.getHostId()); } catch (ClientException ce) { System.out.println("Terjadi ClientException, artinya klien mengalami " + "masalah internal serius saat mencoba berkomunikasi dengan OSS, " + "seperti tidak dapat mengakses jaringan."); System.out.println("Pesan Error:" + ce.getMessage()); } finally { if (ossClient != null) { ossClient.shutdown(); } } } }API
Untuk akses REST API langsung, panggil RenameObject. Ini memerlukan perhitungan manual signature permintaan.
-
Jika hierarchical namespace dinonaktifkan, Anda harus mengubah nama direktori dengan mencantumkan semua objek di dalamnya, menyalinnya ke prefix baru, lalu menghapus objek aslinya.
CatatanUntuk menyalin sejumlah besar objek secara batch, gunakan Migrasi Data Online. Untuk informasi lebih lanjut, lihat Migrasi data antar bucket OSS.
ossutil
Dengan ossutil, lakukan secara manual langkah Salin dan Hapus:
-
Salin objek
Gunakan perintah cp (Copy objects) dengan opsi--recursive (-r)untuk menyalin semua konten dari direktoriold-dir/ke direktorinew-dir/di bucketexamplebucket.ossutil cp oss://examplebucket/old-dir/ oss://examplebucket/new-dir/ -r -
(Opsional) Verifikasi operasi salin
Gunakan perintah ls (List resources) untuk memeriksa direktori baru dan memastikan semua objek berhasil disalin.ossutil ls oss://examplebucket/new-dir/ -
Hapus direktori sumber
Setelah memastikan salinan berhasil, gunakan perintah rm (Delete objects) dengan opsi--recursive (-r)untuk menghapus direktori sumberold-dir/.PeringatanOperasi ini menghapus secara permanen direktori
old-dir/dan semua objek di dalamnya. Tindakan ini tidak dapat dikembalikan. Lakukan dengan hati-hati.ossutil rm oss://examplebucket/old-dir/ -r
SDK
Mengubah nama direktori dengan SDK memerlukan kombinasi panggilan API berikut:
API
Ubah nama direktori dengan menggabungkan panggilan API berikut:
-
Salin: CopyObject
-
Daftar: ListObjectsV2 (GetBucketV2)
-
Hapus: DeleteObject
-
Hapus direktori
Menghapus direktori juga akan menghapus semua subdirektori dan objek di dalamnya. Lakukan dengan hati-hati.
Konsol
-
Login ke Konsol OSS.
-
Buka halaman Object Management > Objects dari bucket target.
-
Pilih direktori yang ingin dihapus dan klik Permanently Delete di kolom Actions.
-
Di kotak dialog yang muncul, klik OK.
PentingJangan refresh atau tutup daftar tugas selama proses penghapusan. Hal ini dapat mengganggu tugas.
Ossutil
Hapus direktori test/ dari bucket examplebucket:
ossutil rm oss://examplebucket/test/ -r
SDK
Hapus direktori dan semua objeknya dengan menentukan Prefix. Misalnya, untuk menghapus direktori log dari bucket examplebucket, atur Prefix menjadi log/.
import com.aliyun.oss.ClientException;
import com.aliyun.oss.OSS;
import com.aliyun.oss.common.auth.*;
import com.aliyun.oss.OSSClientBuilder;
import com.aliyun.oss.OSSException;
import com.aliyun.oss.model.*;
import java.io.UnsupportedEncodingException;
import java.net.URLDecoder;
import java.util.ArrayList;
import java.util.List;
public class Demo {
public static void main(String[] args) throws Exception {
// Endpoint untuk wilayah China (Hangzhou) digunakan sebagai contoh. Tentukan endpoint untuk wilayah bucket Anda.
String endpoint = "https://oss-cn-hangzhou.aliyuncs.com";
// Hindari hard-coding kredensial akses dalam kode Anda untuk mencegah risiko keamanan akibat kebocoran. Contoh ini memuat kredensial dari variabel lingkungan. Pastikan variabel tersebut dikonfigurasi sebelum menjalankan kode.
EnvironmentVariableCredentialsProvider credentialsProvider = CredentialsProviderFactory.newEnvironmentVariableCredentialsProvider();
// Tentukan nama bucket, misalnya examplebucket.
String bucketName = "examplebucket";
// Tentukan jalur mutlak direktori. Jalur tidak boleh mengandung nama bucket.
String directoryName = "exampledir";
// Tentukan jalur lengkap direktori yang akan dihapus. Jalur tidak boleh mengandung nama bucket.
final String prefix = "log/";
// Buat instance OSSClient.
OSS ossClient = new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret);
try {
// Metode 1: Hapus direktori secara rekursif dengan memanggil operasi deleteDirectory. Sebelum menggunakan metode ini, Anda harus mengaktifkan fitur hierarchical namespace.
DeleteDirectoryRequest deleteDirectoryRequest = new DeleteDirectoryRequest(bucketName, directoryName);
deleteDirectoryRequest.setDeleteRecursive(true);
DeleteDirectoryResult deleteDirectoryResult = ossClient.deleteDirectory(deleteDirectoryRequest);
// Lihat hasil penghapusan.
// Maksimal 100 direktori dan objek dapat dihapus sekaligus. Jika penghapusan belum lengkap, server mengembalikan `nextDeleteToken`. Gunakan token ini untuk melanjutkan penghapusan item yang tersisa.
// Parameter nextDeleteToken menentukan titik awal untuk penghapusan berikutnya.
String nextDeleteToken = deleteDirectoryResult.getNextDeleteToken();
System.out.println("delete next token:" + nextDeleteToken);
// Jalur mutlak direktori yang dihapus.
System.out.println("delete dir name :" + deleteDirectoryResult.getDirectoryName());
// Jumlah total objek dan direktori yang dihapus dalam operasi ini.
System.out.println("delete number:" + deleteDirectoryResult.getDeleteNumber());
// Metode 2: Hapus direktori dan semua objek di dalamnya dengan mengiterasi hasil yang dikembalikan oleh operasi listObjects.
String nextMarker = null;
ObjectListing objectListing = null;
do {
ListObjectsRequest listObjectsRequest = new ListObjectsRequest(bucketName)
.withPrefix(prefix)
.withMarker(nextMarker);
objectListing = ossClient.listObjects(listObjectsRequest);
if (objectListing.getObjectSummaries().size() > 0) {
List<String> keys = new ArrayList<String>();
for (OSSObjectSummary s : objectListing.getObjectSummaries()) {
System.out.println("key name: " + s.getKey());
keys.add(s.getKey());
}
DeleteObjectsRequest deleteObjectsRequest = new DeleteObjectsRequest(bucketName).withKeys(keys).withEncodingType("url");
DeleteObjectsResult deleteObjectsResult = ossClient.deleteObjects(deleteObjectsRequest);
List<String> deletedObjects = deleteObjectsResult.getDeletedObjects();
try {
for(String obj : deletedObjects) {
String deleteObj = URLDecoder.decode(obj, "UTF-8");
System.out.println(deleteObj);
}
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
}
nextMarker = objectListing.getNextMarker();
} while (objectListing.isTruncated());
} catch (OSSException oe) {
System.out.println("Terjadi OSSException, artinya permintaan Anda sampai ke OSS, "
+ "tetapi ditolak dengan tanggapan error karena suatu alasan.");
System.out.println("Pesan Error:" + oe.getErrorMessage());
System.out.println("Kode Error:" + oe.getErrorCode());
System.out.println("ID Permintaan:" + oe.getRequestId());
System.out.println("Host ID:" + oe.getHostId());
} catch (ClientException ce) {
System.out.println("Terjadi ClientException, artinya klien mengalami "
+ "masalah internal serius saat mencoba berkomunikasi dengan OSS, "
+ "seperti tidak dapat mengakses jaringan.");
System.out.println("Pesan Error:" + ce.getMessage());
} finally {
if (ossClient != null) {
ossClient.shutdown();
}
}
}
}<?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\OssClient;
use OSS\Core\OssException;
// Contoh ini memuat kredensial akses dari variabel lingkungan. Sebelum menjalankan, pastikan `OSS_ACCESS_KEY_ID` dan `OSS_ACCESS_KEY_SECRET` telah diatur.
$accessKeyId = getenv("OSS_ACCESS_KEY_ID");
$accessKeySecret = getenv("OSS_ACCESS_KEY_SECRET");
// Tentukan endpoint untuk wilayah bucket Anda. Misalnya, untuk wilayah China (Hangzhou), tetapkan endpoint ke https://oss-cn-hangzhou.aliyuncs.com.
$endpoint = "your-endpoint";
// Tentukan nama bucket.
$bucket = "examplebucket";
try {
$ossClient = new OssClient($accessKeyId, $accessKeySecret, $endpoint, false);
$option = array(
OssClient::OSS_MARKER => null,
// Tentukan jalur lengkap direktori yang akan dihapus. Jalur tidak boleh mengandung nama bucket.
OssClient::OSS_PREFIX => "log/",
OssClient::OSS_DELIMITER=>'',
);
$bool = true;
while ($bool){
$result = $ossClient->listObjects($bucket,$option);
$objects = array();
if(count($result->getObjectList()) > 0){
foreach ($result->getObjectList() as $key => $info){
printf("key name:".$info->getKey().PHP_EOL);
$objects[] = $info->getKey();
}
// Hapus direktori dan semua objek di dalamnya.
$delObjects = $ossClient->deleteObjects($bucket, $objects);
foreach ($delObjects as $info){
$obj = strval($info);
printf("Delete ".$obj." : Success" . PHP_EOL);
}
}
if($result->getIsTruncated() === 'true'){
$option[OssClient::OSS_MARKER] = $result->getNextMarker();
}else{
$bool = false;
}
}
printf("Delete Objects : OK" . PHP_EOL);
} catch (OssException $e) {
printf("Delete Objects : Failed" . PHP_EOL);
printf($e->getMessage() . PHP_EOL);
return;
}const OSS = require('ali-oss');
const client = new OSS({
// Tentukan wilayah tempat bucket Anda berada. Misalnya, untuk wilayah China (Hangzhou), tetapkan region ke oss-cn-hangzhou.
region: 'yourregion',
// Contoh ini memuat kredensial akses dari variabel lingkungan. Sebelum menjalankan, pastikan `OSS_ACCESS_KEY_ID` dan `OSS_ACCESS_KEY_SECRET` telah diatur.
accessKeyId: process.env.OSS_ACCESS_KEY_ID,
accessKeySecret: process.env.OSS_ACCESS_KEY_SECRET,
// Tentukan nama bucket.
bucket: 'yourbucketname'
});
// Tangani permintaan yang gagal untuk mencegah `promise.all` terganggu. Mengembalikan alasan kegagalan dan nama objek yang gagal dihapus.
async function handleDel(name, options) {
try {
await client.delete(name);
} catch (error) {
error.failObjectName = name;
return error;
}
}
// Hapus beberapa objek.
async function deletePrefix(prefix) {
const list = await client.list({
prefix: prefix,
});
list.objects = list.objects || [];
const result = await Promise.all(list.objects.map((v) => handleDel(v.name)));
console.log(result);
}
// Hapus direktori dan semua objek di dalamnya.
deletePrefix('log/')# -*- coding: utf-8 -*-
import oss2
from oss2.credentials import EnvironmentVariableCredentialsProvider
# Contoh ini memuat kredensial akses dari variabel lingkungan. Sebelum menjalankan, pastikan `OSS_ACCESS_KEY_ID` dan `OSS_ACCESS_KEY_SECRET` telah diatur.
auth = oss2.ProviderAuth(EnvironmentVariableCredentialsProvider())
# Tetapkan endpoint Anda ke endpoint wilayah tempat bucket Anda berada. Misalnya, untuk wilayah China (Hangzhou), tetapkan endpoint ke https://oss-cn-hangzhou.aliyuncs.com.
# Tentukan nama bucket.
bucket = oss2.Bucket(auth, 'https://oss-cn-hangzhou.aliyuncs.com', 'examplebucket')
prefix = "exampledir/"
# Hapus direktori dan semua objek di dalamnya.
for obj in oss2.ObjectIterator(bucket, prefix=prefix):
bucket.delete_object(obj.key)package main
import (
"fmt"
"os"
"github.com/aliyun/aliyun-oss-go-sdk/oss"
)
func main() {
// Contoh ini memuat kredensial akses dari variabel lingkungan. Sebelum menjalankan, pastikan `OSS_ACCESS_KEY_ID` dan `OSS_ACCESS_KEY_SECRET` telah diatur.
provider, err := oss.NewEnvironmentVariableCredentialsProvider()
if err != nil {
fmt.Println("Error:", err)
os.Exit(-1)
}
// Buat instance OSSClient.
// Tentukan endpoint untuk wilayah tempat bucket Anda berada. Misalnya, endpoint untuk wilayah China (Hangzhou) adalah `https://oss-cn-hangzhou.aliyuncs.com`. Ganti ini dengan endpoint untuk wilayah Anda yang sebenarnya.
client, err := oss.New("your-endpoint", "", "", oss.SetCredentialsProvider(&provider))
if err != nil {
fmt.Println("Error:", err)
os.Exit(-1)
}
// Tentukan nama bucket.
bucket, err := client.Bucket("examplebucket")
if err != nil {
fmt.Println("Error:", err)
os.Exit(-1)
}
marker := oss.Marker("")
// Tentukan jalur lengkap direktori yang akan dihapus. Jalur tidak boleh mengandung nama bucket.
prefix := oss.Prefix("log/")
count := 0
for {
lor, err := bucket.ListObjects(marker, prefix)
if err != nil {
fmt.Println("Error:", err)
os.Exit(-1)
}
objects := []string{}
for _, object := range lor.Objects {
objects = append(objects, object.Key)
}
// Hapus direktori dan semua objek di dalamnya.
// Atur `oss.DeleteObjectsQuiet` ke `true` untuk menekan hasil penghapusan.
delRes, err := bucket.DeleteObjects(objects, oss.DeleteObjectsQuiet(true))
if err != nil {
fmt.Println("Error:", err)
os.Exit(-1)
}
if len(delRes.DeletedObjects) > 0 {
fmt.Println("Objek-objek berikut gagal dihapus:", delRes.DeletedObjects)
os.Exit(-1)
}
count += len(objects)
prefix = oss.Prefix(lor.Prefix)
marker = oss.Marker(lor.NextMarker)
if !lor.IsTruncated {
break
}
}
fmt.Printf("berhasil,total jumlah objek yang dihapus:%d\n", count)
}#include <alibabacloud/oss/OssClient.h>
using namespace AlibabaCloud::OSS;
int main(void)
{
/* Inisialisasi informasi akun OSS. */
/* Tentukan endpoint untuk wilayah tempat bucket Anda berada. Misalnya, untuk wilayah China (Hangzhou), tetapkan endpoint ke https://oss-cn-hangzhou.aliyuncs.com. */
std::string Endpoint = "your-endpoint";
/* Tentukan nama bucket. */
std::string BucketName = "examplebucket";
/* Tentukan jalur lengkap direktori yang akan dihapus. Jalur tidak boleh mengandung nama bucket. */
std::string keyPrefix = "log/";
/* Inisialisasi resource, seperti jaringan. */
InitializeSdk();
ClientConfiguration conf;
/* Contoh ini memuat kredensial akses dari variabel lingkungan. Sebelum menjalankan, pastikan `OSS_ACCESS_KEY_ID` dan `OSS_ACCESS_KEY_SECRET` telah diatur. */
auto credentialsProvider = std::make_shared<EnvironmentVariableCredentialsProvider>();
OssClient client(Endpoint, credentialsProvider, conf);
std::string nextMarker = "";
bool isTruncated = false;
do {
ListObjectsRequest request(BucketName);
request.setPrefix(keyPrefix);
request.setMarker(nextMarker);
auto outcome = client.ListObjects(request);
if (!outcome.isSuccess()) {
/* Tangani exception. */
std::cout << "ListObjects gagal" <<
",kode:" << outcome.error().Code() <<
",pesan:" << outcome.error().Message() <<
",requestId:" << outcome.error().RequestId() << std::endl;
break;
}
for (const auto& object : outcome.result().ObjectSummarys()) {
DeleteObjectRequest request(BucketName, object.Key());
/* Hapus direktori dan semua objek di dalamnya. */
auto delResult = client.DeleteObject(request);
}
nextMarker = outcome.result().NextMarker();
isTruncated = outcome.result().IsTruncated();
} while (isTruncated);
/* Lepaskan resource, seperti jaringan. */
ShutdownSdk();
return 0;
}API
Untuk akses REST API langsung, panggil operasi DeleteObject. Ini memerlukan perhitungan manual signature permintaan.
Kueri jumlah objek dan ukuran
Metode 1: Daftar objek sesuai permintaan
Metode ini paling cocok untuk kueri sesuai permintaan pada direktori dengan kurang dari 10.000 objek.
-
Di panel navigasi kiri bucket target, pilih .
-
Klik Statistics di sebelah kanan direktori target.
Metode 2: Kueri berkala dengan bucket inventory
Paling cocok untuk kueri berkala pada direktori dengan hingga puluhan miliar objek.
-
Di panel navigasi kiri bucket target, pilih .
-
Klik Create Inventory. Di panel Create Inventory, pilih Inventory Storage Bucket. Untuk konten inventory, pilih Object Size. Untuk pencocokan prefix, masukkan nama direktori (misalnya,
random_files/). Biarkan parameter lain pada pengaturan default. -
Lihat laporan inventory.
-
Di halaman Objects, temukan file laporan inventory yang dihasilkan di jalur
<u>/Destination Bucket/inventory-id/</u>data/. -
Unduh file laporan inventory untuk melihat jumlah objek dan ukuran total untuk direktori tersebut.
Dalam file laporan inventory, kolom A berisi nama bucket, kolom B mencantumkan nama setiap objek, dan kolom C menunjukkan ukuran objek tersebut.
-
Dokumentasi bucket inventory mencakup detail penyiapan dan konfigurasi.
Metode 3: Jalankan kueri kompleks dengan MetaSearch
Paling cocok untuk kueri hampir real-time yang difilter berdasarkan prefix, waktu, atau jenis objek.
-
Di panel navigasi kiri bucket target, pilih .
-
Di halaman Data Indexing, klik Enable Now, pilih MetaSearch, lalu klik Enable.
CatatanMengaktifkan MetaSearch mungkin memerlukan waktu, tergantung pada jumlah objek di bucket.
-
Atur Object Name untuk pencocokan prefix, masukkan
random_files/sebagai prefix, dan biarkan parameter lain pada pengaturan default. -
Konfigurasikan format output.
-
Atur Object Sort Order ke Default.
-
Untuk Data Aggregation, agregasikan Object Size berdasarkan Sum.
-
-
Klik Query Now. Hasil menunjukkan jumlah total objek dan ukuran total untuk direktori
random_files/.Hasil kueri menunjukkan bahwa dalam Data Aggregation, jumlah ukuran file adalah 14,47 GB. Di Objects, setiap file berukuran 50 MB, jenis unggahan adalah Normal, kelas penyimpanan adalah Standard, dan daftar kontrol akses (ACL) diwarisi dari bucket.
Dokumentasi MetaSearch mencakup opsi penyiapan dan kueri.
Pertimbangan produksi
Kontrol akses
Di OSS, kontrol akses didasarkan pada pencocokan prefix objek, bukan pada objek direktori itu sendiri.
Sebagai contoh, untuk memberikan izin akses read-only kepada pengguna untuk semua objek di direktori logs/:
-
Salah: Mengatur izin pada objek placeholder nol byte
logs/. -
Benar: Buat kebijakan RAM di mana bidang
Resourcediatur keacs:oss:*:*:your-bucket-name/logs/*. Kebijakan ini mencocokkan semua objek yang diawali dengan prefixlogs/, terlepas dari apakah objek placeholderlogs/ada atau tidak.
Optimalisasi kinerja
-
Kedalaman direktori: Hindari struktur bersarang yang terlalu dalam, seperti
a/b/c/d/.../file.log, karena logika pemfilteran untuk operasi daftar dapat menurunkan kinerja. -
Mengubah nama skala besar: Mengubah nama direktori dengan banyak objek menghasilkan volume tinggi panggilan API dan meningkatkan biaya trafik secara signifikan. Hindari praktik ini dalam desain sistem Anda.