Menyimpan sejumlah besar objek dalam struktur flat menyulitkan pencarian dan mempersulit operasi massal. Untuk mengatasi hal ini, OSS menyediakan fitur direktori yang mensimulasikan struktur folder guna mengorganisasi dan mengelola objek tersebut.
Cara kerja
OSS menggunakan penyimpanan flat dan tidak memiliki folder nyata. Direktori yang ditampilkan 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.jpgObjek-objek aktual yang disimpan di OSS adalah:
log/date1.txt
log/date2.txt
destfolder/2021/photo.jpgBuat direktori
Anda dapat membuat direktori dengan cara berikut:
Pembuatan otomatis: Saat Anda mengunggah objek yang namanya berisi jalur (path), direktori yang sesuai akan dibuat secara otomatis.
Pembuatan manual: Operasi ini membuat objek berukuran nol byte dengan nama yang diakhiri garis miring maju (
/) sebagai placeholder untuk direktori kosong.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.
-
Garis miring maju (
/) digunakan dalam nama direktori untuk menunjukkan subdirektori. Gunakan garis miring maju (/) dalam nama direktori untuk membuat struktur direktori bersarang. Nama direktori tidak boleh diawali dengan garis miring maju (/) atau garis miring terbalik (\). Nama direktori tidak boleh mengandung dua garis miring maju berurutan (//). -
Nama subdirektori tidak boleh berupa dua titik berurutan (
..). -
Panjang nama direktori harus antara 1 hingga 254 karakter.
-
ossutil
Contoh berikut menunjukkan cara membuat direktori bernama
dir/di bucketexamplebucket.ossutil mkdir oss://examplebucket/dirUntuk informasi lebih lanjut, lihat mkdir (create directory).
SDK
Contoh berikut menunjukkan cara membuat direktori menggunakan SDK umum. Untuk informasi tentang cara membuat direktori menggunakan SDK lainnya, lihat Introduction to OSS SDKs.
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 seluruh 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 respons 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 garis miring 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' => 'informasi Anda' ), ); 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 garis miring 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 garis miring 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 garis miring 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 garis miring 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 pengunggahan 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 tunggal yang atomik. Terlepas dari alat yang Anda gunakan, proses ini melibatkan dua langkah:
Salin: Salin semua objek dari direktori sumber ke direktori tujuan baru secara rekursif.
Hapus: Setelah Anda memastikan operasi salin berhasil, hapus permanen direktori sumber beserta semua objek di dalamnya.
Karena mengubah nama memerlukan penyalinan dan penghapusan setiap objek dalam direktori, operasi ini memakan waktu lama untuk direktori besar dan menimbulkan biaya signifikan untuk panggilan API dan transfer data. Evaluasi dampaknya secara hati-hati 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.
Anda dapat menghapus direktori tertentu dengan menentukan nama direktori untuk opsi prefix perintah
ossutilrm. Untuk informasi lebih lanjut, lihat 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 garis miring maju /.Pindahkan direktori
Memindahkan direktori mirip dengan mengubah namanya, tetapi nama direktori baru harus diawali dengan garis miring maju (/). Tentukan direktori target 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 telah 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 respons 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 aplikasi yang memerlukan kustomisasi ekstensif, Anda dapat membuat permintaan REST API langsung, yang melibatkan penulisan kode secara manual untuk menghitung signature. Untuk informasi lebih lanjut, lihat RenameObject.
-
Jika hierarchical namespace dinonaktifkan, Anda harus mengubah nama direktori dengan mencantumkan semua objek di dalamnya, menyalinnya ke prefix baru, lalu menghapus objek aslinya.
CatatanJika Anda perlu menyalin sejumlah besar objek, Anda dapat menggunakan Migrasi Data Online untuk penyalinan batch. Untuk informasi lebih lanjut, lihat Migrate data between OSS buckets.
ossutil
Dengan ossutil, Anda harus melakukan langkah Salin dan Hapus secara manual untuk mengubah nama direktori.
Salin objek
Gunakan perintah cp (Copy objects) dengan opsi--recursive (-r)untuk menyalin seluruh 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 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
Seperti dijelaskan, mengubah nama direktori dengan SDK memerlukan kombinasi beberapa panggilan API. Untuk detailnya, lihat dokumentasi SDK untuk operasi inti berikut:
API
Untuk mengubah nama direktori menggunakan API, Anda perlu 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
Contoh berikut menunjukkan cara menghapus direktori test/ dari bucket examplebucket.
ossutil rm oss://examplebucket/test/ -rUntuk informasi lebih lanjut, lihat rm (delete).
SDK
Anda dapat menghapus direktori dan semua objek di dalamnya dengan menentukan Prefix. Misalnya, jika Anda ingin menghapus direktori log dan semua objek di dalamnya dari bucket examplebucket, atur parameter Prefix dalam contoh kode menjadi Prefix 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 ini 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("token hapus berikutnya:" + nextDeleteToken);
// Jalur mutlak direktori yang dihapus.
System.out.println("nama direktori yang dihapus :" + deleteDirectoryResult.getDirectoryName());
// Jumlah total objek dan direktori yang dihapus dalam operasi ini.
System.out.println("jumlah yang dihapus:" + 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("nama kunci: " + 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 respons 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("nama kunci:".$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("Hapus ".$obj." : Berhasil" . PHP_EOL);
}
}
if($result->getIsTruncated() === 'true'){
$option[OssClient::OSS_MARKER] = $result->getNextMarker();
}else{
$bool = false;
}
}
printf("Hapus Objek : BERHASIL" . PHP_EOL);
} catch (OssException $e) {
printf("Hapus Objek : GAGAL" . 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 pengecualian. */
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 kebutuhan aplikasi tertentu, Anda dapat memanggil REST API secara langsung. Hal ini mengharuskan Anda menghitung signature permintaan secara manual. Untuk detailnya, lihat operasi API DeleteObject.
Kueri jumlah objek dan ukuran
Metode 1: Daftar objek sesuai permintaan
Metode ini ideal 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
Metode ini direkomendasikan untuk direktori dengan jumlah objek besar (hingga puluhan miliar) yang memerlukan kueri berkala.
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.

Untuk informasi lebih lanjut tentang bucket inventory, lihat bucket inventory.
Metode 3: Jalankan kueri kompleks dengan MetaSearch
Metode ini cocok untuk mendapatkan jumlah objek dan ukuran total direktori secara near-real-time, terutama saat Anda perlu memfilter berdasarkan kondisi seperti 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 dalam bucket.
Atur Object Name ke 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. Hasilnya menunjukkan jumlah total objek dan ukuran total untuk direktori
random_files/.
Untuk informasi lebih lanjut tentang MetaSearch, lihat MetaSearch.
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
logs/berukuran nol byte.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.