Untuk menyederhanakan pengorganisasian dan pengelolaan sejumlah besar objek dalam struktur datar, Object Storage Service (OSS) menawarkan fitur direktori yang mensimulasikan struktur folder.
Cara kerjanya
OSS menggunakan struktur penyimpanan datar dan tidak memiliki folder nyata. Direktori yang Anda lihat di konsol adalah representasi visual berdasarkan pemisah / dalam nama objek.
Sebagai contoh, saat Anda melihat struktur hierarki berikut di konsol:
examplebucket
└── log/
├── date1.txt
├── date2.txt
├── date3.txt
└── destfolder/
└── 2021/
├── photo.jpgOSS hanya menyimpan objek-objek berikut:
log/date1.txt
log/date2.txt
destfolder/2021/photo.jpgBuat direktori
Anda dapat membuat direktori dengan dua cara:
Pembuatan otomatis saat mengunggah objek: Saat Anda mengunggah objek yang namanya mengandung jalur, OSS secara otomatis membuat direktori yang sesuai.
Pembuatan manual direktori kosong: Operasi ini menciptakan objek nol byte dengan nama yang diakhiri dengan
/, yang berfungsi sebagai placeholder untuk direktori kosong.Konsol
Masuk ke konsol OSS, lalu navigasikan ke halaman Object Management > Objects dari bucket target.
Klik Create Directory.
Masukkan Directory Name dan klik OK.
Ikuti aturan penamaan berikut untuk direktori:
Nama direktori harus dikodekan UTF-8 dan tidak boleh mengandung emoji.
Garis miring (
/) digunakan dalam nama direktori untuk menunjukkan subdirektori. Gunakan garis miring (/) dalam nama direktori untuk membuat struktur direktori bersarang. Nama direktori tidak boleh diawali dengan garis miring (/) atau garis miring terbalik (\). Nama direktori juga tidak boleh mengandung garis miring berurutan (//).Nama subdirektori tidak boleh dua titik berturut-turut (
..).Nama direktori harus terdiri dari 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 (buat direktori).
SDK
Kode berikut memberikan contoh cara membuat direktori menggunakan SDK umum. Untuk informasi lebih lanjut tentang cara membuat direktori menggunakan SDK lainnya, lihat 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 { // Wilayah China (Hangzhou) digunakan sebagai contoh untuk endpoint. Tentukan endpoint berdasarkan wilayah Anda. String endpoint = "https://oss-cn-hangzhou.aliyuncs.com"; // Jangan hardcode kredensial akses Anda dalam kode Anda. Kredensial yang bocor dapat membahayakan keamanan semua sumber daya Anda. Contoh ini mendapatkan kredensial dari variabel lingkungan. Konfigurasikan variabel lingkungan sebelum menjalankan kode. EnvironmentVariableCredentialsProvider credentialsProvider = CredentialsProviderFactory.newEnvironmentVariableCredentialsProvider(); // Set bucketName ke nama bucket Anda, misalnya, examplebucket. String bucketName = "examplebucket"; // Set dirName ke nama direktori yang dibuat menggunakan metode 1. String dirName = "exampledir/"; // Set dirName2 ke nama direktori yang dibuat menggunakan 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 namespace hierarki. 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("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(); } } } }<?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 diatur. $provider = new EnvironmentVariableCredentialsProvider(); // Set yourEndpoint ke endpoint wilayah tempat bucket berada. Misalnya, jika bucket berada di wilayah China (Hangzhou), set endpoint ke https://oss-cn-hangzhou.aliyuncs.com. $endpoint = "yourEndpoint"; // Set bucket ke nama bucket Anda, misalnya, examplebucket. $bucket= "examplebucket"; // Set object ke nama direktori. Nama tersebut harus diakhiri dengan gariskemiring (/). $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__ . "OK" . "\n"); // Anda dapat menetapkan header saat mengunggah objek, seperti menetapkan izin akses ke 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__ . "OK" . "\n");const OSS = require('ali-oss'); const client = new OSS({ // Set yourregion ke wilayah tempat bucket berada. Misalnya, jika bucket berada di wilayah China (Hangzhou), set wilayah ke oss-cn-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 diatur. accessKeyId: process.env.OSS_ACCESS_KEY_ID, accessKeySecret: process.env.OSS_ACCESS_KEY_SECRET, // Set bucket ke nama bucket Anda. bucket: 'examplebucket', }); async function putBuffer () { try { // Set nama direktori. Nama tersebut harus diakhiri dengan gariskemiring (/). 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 diatur. auth = oss2.ProviderAuth(EnvironmentVariableCredentialsProvider()) # Set yourEndpoint ke endpoint wilayah tempat bucket berada. Misalnya, jika bucket berada di wilayah China (Hangzhou), set endpoint ke https://oss-cn-hangzhou.aliyuncs.com. # Set nama bucket. bucket = oss2.Bucket(auth, 'https://oss-cn-hangzhou.aliyuncs.com', 'examplebucket') # Set nama direktori. Nama tersebut harus diakhiri dengan gariskemiring (/). bucket.put_object('exampledir/', '')using System.Text; using Aliyun.OSS; // Set yourEndpoint ke endpoint wilayah tempat bucket berada. Misalnya, jika bucket berada di wilayah China (Hangzhou), set endpoint ke https://oss-cn-hangzhou.aliyuncs.com. 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 diatur. var accessKeyId = Environment.GetEnvironmentVariable("OSS_ACCESS_KEY_ID"); var accessKeySecret = Environment.GetEnvironmentVariable("OSS_ACCESS_KEY_SECRET"); // Set bucketName ke nama bucket Anda, misalnya, examplebucket. var bucketName = "examplebucket"; // Set objectName ke nama direktori. Nama tersebut harus diakhiri dengan gariskemiring (/). 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("Unggah objek berhasil"); } catch (Exception ex) { Console.WriteLine("Unggah objek gagal, {0}", ex.Message); }#include "oss_api.h" #include "aos_http_io.h" /* Set yourEndpoint ke endpoint wilayah tempat bucket berada. Misalnya, jika bucket berada di wilayah China (Hangzhou), set endpoint ke https://oss-cn-hangzhou.aliyuncs.com. */ const char *endpoint = "yourEndpoint"; /* Set bucket_name ke nama bucket Anda, misalnya, examplebucket. */ const char *bucket_name = "examplebucket"; /* Set object_name ke nama direktori. Nama tersebut harus diakhiri dengan gariskemiring (/). */ 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 diatur. */ 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 menunjukkan bahwa tidak ada CNAME yang digunakan. */ options->config->is_cname = 0; /* Tetapkan 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 di titik masuk program untuk menginisialisasi sumber daya global seperti jaringan dan memori. */ if (aos_http_io_initialize(NULL, 0) != AOSE_OK) { exit(1); } /* Pool memori (pool) digunakan untuk manajemen memori. Ini setara dengan apr_pool_t. Kode implementasi ada di pustaka apr. */ aos_pool_t *pool; /* Buat pool memori. Parameter kedua adalah NULL, yang menunjukkan bahwa pool memori tidak mewarisi dari pool memori 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 di pool memori. */ 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 file. */ 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("unggah objek dari buffer berhasil\n"); } else { printf("unggah objek dari buffer gagal\n"); } /* Hancurkan pool memori. Ini setara dengan melepaskan memori yang dialokasikan untuk sumber daya selama permintaan. */ aos_pool_destroy(pool); /* Lepaskan sumber daya global yang dialokasikan sebelumnya. */ aos_http_io_deinitialize(); return 0; }
Ubah nama direktori
Mengubah nama direktori bukanlah operasi atomik tunggal. Semua alat mengikuti alur kerja dasar yang sama:
Salin: Salin semua objek secara rekursif dari direktori sumber ke direktori tujuan.
Hapus: Setelah memastikan bahwa operasi salin berhasil, hapus secara permanen direktori sumber dan semua objek di dalamnya.
Karena pengubahan nama memerlukan penyalinan dan penghapusan setiap objek dalam direktori, operasi ini bisa memakan waktu lama untuk direktori besar dan menimbulkan biaya signifikan untuk panggilan API dan transfer data. Evaluasi dampaknya dengan hati-hati sebelum melanjutkan.
Jika fitur namespace hierarki diaktifkan, ubah nama direktori secara langsung.
Konsol
Masuk ke konsol OSS.
Di panel navigasi di sebelah kiri, klik Buckets. Di halaman Bucket, temukan dan klik bucket yang diinginkan.
Di pohon navigasi di sebelah kiri, pilih Object Management > Objects.
Ubah nama atau pindahkan direktori.
Hapus direktori dengan menentukan namanya di opsi prefix perintah rm ossutil rm.
Kasus penggunaan
Tindakan
Ubah nama direktori
Arahkan kursor ke direktori target, klik ikon
, dan ubah nama direktori. Nama direktori tidak boleh dimulai dengan gariskemiring (/).Pindahkan direktori
Untuk memindahkan direktori, Anda memberikan nama baru yang menentukan jalur tujuan. Jika nama baru dimulai dengan gariskemiring (
/), itu dianggap sebagai jalur mutlak dari direktori root bucket. Masukkan direktori tujuan sesuai kebutuhan:Untuk memindahkan subdirektori
subdirdari direktori indukdestdirke direktori indukdestfolder, masukkan/destfolder/subdirsebagai nama baru.Untuk memindahkan subdirektori
subdirdari direktori indukdestdirke direktori root Bucket, masukkan/subdirsebagai nama baru.
SDK
Pengubahan nama direktori hanya didukung menggunakan Java SDK, yang memerlukan 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 { // Set yourEndpoint ke endpoint wilayah tempat bucket berada. Misalnya, jika bucket berada di wilayah China (Hangzhou), set endpoint ke https://oss-cn-hangzhou.aliyuncs.com. String endPoint = "yourEndpoint"; // Jangan hardcode kredensial akses Anda dalam kode Anda. Kredensial yang bocor dapat membahayakan keamanan semua sumber daya Anda. Contoh ini mendapatkan kredensial dari variabel lingkungan. Konfigurasikan variabel lingkungan sebelum menjalankan kode. EnvironmentVariableCredentialsProvider credentialsProvider = CredentialsProviderFactory.newEnvironmentVariableCredentialsProvider(); // Set bucketName ke nama bucket Anda, misalnya, examplebucket. String bucketName = "examplebucket"; // Set sourceDir ke jalur absolut direktori sumber. Jalur absolut tidak boleh mengandung nama bucket. String sourceDir = "exampledir"; // Set destinationDir ke jalur absolut direktori tujuan, yang harus berada di bucket yang sama dengan direktori sumber. Jalur absolut 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("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(); } } } }API
Jika aplikasi Anda memiliki persyaratan kustomisasi tinggi, buat permintaan REST API. Untuk melakukannya, Anda harus menulis kode secara manual untuk menghitung tanda tangan. Untuk informasi lebih lanjut, lihat RenameObject.
Jika fitur namespace hierarki dinonaktifkan, daftar semua objek dalam direktori, salin mereka ke awalan baru, lalu hapus objek sumber untuk mengubah nama direktori.
CatatanUntuk menyalin banyak objek, gunakan Data Online Migration untuk operasi penyalinan batch. Untuk informasi lebih lanjut, lihat Migrasi data antar bucket OSS Alibaba Cloud.
ossutil
Saat menggunakan ossutil, lakukan langkah penyalinan dan penghapusan secara manual untuk menyelesaikan proses pengubahan nama.
Salin objek
Gunakan perintah cp 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 untuk memeriksa direktori baru dan pastikan semua objek berhasil disalin.ossutil ls oss://examplebucket/new-dir/Hapus direktori sumber
Setelah Anda memastikan bahwa operasi salin berhasil, gunakan perintah rm dengan opsi--recursive (-r)untuk menghapus direktori sumberold-dir/.PeringatanOperasi ini akan menghapus secara permanen direktori
old-dir/dan semua objek di dalamnya. Data yang dihapus tidak dapat dipulihkan. Lanjutkan dengan hati-hati.ossutil rm oss://examplebucket/old-dir/ -r
SDK
Sebagaimana dijelaskan, mengubah nama direktori menggunakan SDK memerlukan Anda untuk menggabungkan beberapa panggilan API. Untuk detail implementasi, lihat dokumentasi SDK untuk operasi inti berikut:
API
Untuk mengubah nama direktori menggunakan API, gunakan panggilan API berikut:
Salin: CopyObject
Daftar: ListObjectsV2 (GetBucketV2)
Hapus: DeleteObject
Hapus direktori
Menghapus direktori juga akan menghapus semua subdirektori dan objeknya. Lanjutkan dengan hati-hati.
Konsol
Masuk ke Konsol OSS.
Navigasikan ke 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 segarkan atau tutup halaman saat tugas penghapusan sedang berlangsung, karena ini akan mengganggu operasi.
ossutil
Contoh berikut menunjukkan cara menghapus direktori test/ dari bucket examplebucket.
ossutil rm oss://examplebucket/test/ -rUntuk informasi lebih lanjut, lihat rm (hapus).
SDK
Hapus direktori dan semua objeknya dengan menentukan Prefix. Misalnya, untuk menghapus direktori log dan semua objeknya dari bucket examplebucket, set parameter Prefix dalam kode contoh ke 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 {
// Wilayah China (Hangzhou) digunakan sebagai contoh untuk endpoint. Tentukan endpoint berdasarkan wilayah Anda.
String endpoint = "https://oss-cn-hangzhou.aliyuncs.com";
// Jangan hardcode kredensial akses Anda dalam kode Anda. Kredensial yang bocor dapat membahayakan keamanan semua sumber daya Anda. Contoh ini mendapatkan kredensial dari variabel lingkungan. Konfigurasikan variabel lingkungan sebelum menjalankan kode.
EnvironmentVariableCredentialsProvider credentialsProvider = CredentialsProviderFactory.newEnvironmentVariableCredentialsProvider();
// Set bucketName ke nama bucket Anda, misalnya, examplebucket.
String bucketName = "examplebucket";
// Set directoryName ke jalur absolut direktori. Jalur absolut tidak boleh mengandung nama bucket.
String directoryName = "exampledir";
// Set prefix ke jalur lengkap direktori yang ingin dihapus. Jalur lengkap 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 namespace hierarki.
DeleteDirectoryRequest deleteDirectoryRequest = new DeleteDirectoryRequest(bucketName, directoryName);
deleteDirectoryRequest.setDeleteRecursive(true);
DeleteDirectoryResult deleteDirectoryResult = ossClient.deleteDirectory(deleteDirectoryRequest);
// Lihat hasil penghapusan.
// Maksimal 100 direktori dan file dapat dihapus sekaligus. Jika tidak semua item dihapus dalam satu kali, server akan mengembalikan nextDeleteToken. Anda dapat menggunakan token ini untuk melanjutkan penghapusan data yang tersisa.
// nextDeleteToken digunakan oleh server untuk menemukan titik awal penghapusan berikutnya.
String nextDeleteToken = deleteDirectoryResult.getNextDeleteToken();
System.out.println("delete next token:" + nextDeleteToken);
// Jalur absolut direktori yang dihapus.
System.out.println("delete dir name :" + deleteDirectoryResult.getDirectoryName());
// Total jumlah file dan direktori yang dihapus kali ini.
System.out.println("delete number:" + deleteDirectoryResult.getDeleteNumber());
// Metode 2: Hapus direktori dan semua file di dalamnya dengan melintasi hasil 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("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();
}
}
}
}<?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;
// Dapatkan kredensial akses dari variabel lingkungan. Sebelum menjalankan contoh ini, pastikan variabel lingkungan OSS_ACCESS_KEY_ID dan OSS_ACCESS_KEY_SECRET telah diatur.
$accessKeyId = getenv("OSS_ACCESS_KEY_ID");
$accessKeySecret = getenv("OSS_ACCESS_KEY_SECRET");
// Set yourEndpoint ke endpoint wilayah tempat bucket berada. Misalnya, jika bucket berada di wilayah China (Hangzhou), set endpoint ke https://oss-cn-hangzhou.aliyuncs.com.
$endpoint = "yourEndpoint";
// Set nama bucket.
$bucket = "examplebucket";
try {
$ossClient = new OssClient($accessKeyId, $accessKeySecret, $endpoint, false);
$option = array(
OssClient::OSS_MARKER => null,
// Set OSS_PREFIX ke jalur lengkap direktori yang ingin dihapus. Jalur lengkap 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 file 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({
// Set yourregion ke wilayah tempat bucket berada. Misalnya, jika bucket berada di wilayah China (Hangzhou), set wilayah ke oss-cn-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 diatur.
accessKeyId: process.env.OSS_ACCESS_KEY_ID,
accessKeySecret: process.env.OSS_ACCESS_KEY_SECRET,
// Set bucket ke nama bucket Anda.
bucket: 'yourbucketname'
});
// Tangani permintaan gagal untuk mencegah promise.all terganggu dan mengembalikan alasan kegagalan serta nama file yang gagal.
async function handleDel(name, options) {
try {
await client.delete(name);
} catch (error) {
error.failObjectName = name;
return error;
}
}
// Hapus beberapa file.
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 file di dalamnya.
deletePrefix('log/')# -*- 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 diatur.
auth = oss2.ProviderAuth(EnvironmentVariableCredentialsProvider())
# Set yourEndpoint ke endpoint wilayah tempat bucket berada. Misalnya, jika bucket berada di wilayah China (Hangzhou), set endpoint ke https://oss-cn-hangzhou.aliyuncs.com.
# Set nama bucket.
bucket = oss2.Bucket(auth, 'https://oss-cn-hangzhou.aliyuncs.com', 'examplebucket')
prefix = "exampledir/"
# Hapus direktori dan semua file 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() {
// Dapatkan kredensial akses dari variabel lingkungan. Sebelum menjalankan contoh ini, pastikan variabel lingkungan 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.
// Set yourEndpoint ke endpoint wilayah tempat bucket berada. Misalnya, jika bucket berada di wilayah China (Hangzhou), set endpoint ke https://oss-cn-hangzhou.aliyuncs.com.
client, err := oss.New("yourEndpoint", "", "", oss.SetCredentialsProvider(&provider))
if err != nil {
fmt.Println("Error:", err)
os.Exit(-1)
}
// Set nama bucket.
bucket, err := client.Bucket("examplebucket")
if err != nil {
fmt.Println("Error:", err)
os.Exit(-1)
}
marker := oss.Marker("")
// Set prefix ke jalur lengkap direktori yang ingin dihapus. Jalur lengkap 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 file di dalamnya.
// Set oss.DeleteObjectsQuiet ke true untuk mencegah hasil penghapusan dikembalikan.
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 ini 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("sukses, total objek yang dihapus:%d\n", count)
}#include <alibabacloud/oss/OssClient.h>
using namespace AlibabaCloud::OSS;
int main(void)
{
/* Inisialisasi informasi akun OSS. */
/* Set yourEndpoint ke endpoint wilayah tempat bucket berada. Misalnya, jika bucket berada di wilayah China (Hangzhou), set endpoint ke https://oss-cn-hangzhou.aliyuncs.com. */
std::string Endpoint = "yourEndpoint";
/* Set nama bucket. */
std::string BucketName = "examplebucket";
/* Set keyPrefix ke jalur lengkap direktori yang ingin dihapus. Jalur lengkap tidak boleh mengandung nama bucket. */
std::string keyPrefix = "log/";
/* Inisialisasi sumber daya seperti jaringan. */
InitializeSdk();
ClientConfiguration conf;
/* Dapatkan kredensial akses dari variabel lingkungan. Sebelum menjalankan contoh ini, pastikan variabel lingkungan 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() <<
",ID permintaan:" << outcome.error().RequestId() << std::endl;
break;
}
for (const auto& object : outcome.result().ObjectSummarys()) {
DeleteObjectRequest request(BucketName, object.Key());
/* Hapus direktori dan semua file di dalamnya. */
auto delResult = client.DeleteObject(request);
}
nextMarker = outcome.result().NextMarker();
isTruncated = outcome.result().IsTruncated();
} while (isTruncated);
/* Lepaskan sumber daya seperti jaringan. */
ShutdownSdk();
return 0;
}API
Jika program Anda memerlukan kustomisasi ekstensif, buat permintaan REST API secara langsung. Untuk melakukannya, Anda harus menulis kode secara manual untuk menghitung tanda tangan. Untuk informasi lebih lanjut, lihat DeleteObject.
Kueri jumlah dan ukuran objek dalam direktori
Metode 1: Dapatkan statistik dengan mencantumkan objek
Cocok untuk direktori yang berisi sejumlah kecil objek, seperti kurang dari 10.000.
Di panel navigasi kiri bucket target, pilih .
Klik ikon statistik di sebelah kanan direktori target.

Metode 2: Lakukan kueri berkala menggunakan inventaris bucket
Metode ini cocok untuk analisis berkala direktori yang berisi sejumlah besar objek, seperti jutaan atau miliaran.
Di panel navigasi kiri bucket target, pilih .
Klik Create Inventory. Di panel Create Inventory, pilih Inventory Storage Bucket. Untuk konten inventaris, pilih Object Size. Untuk Object Prefix, masukkan nama direktori yang ingin dikueri, seperti
random_files/. Pertahankan pengaturan default untuk parameter lainnya.
Lihat hasil inventaris.
Di halaman Objects, temukan file inventaris yang dihasilkan di jalur
/Inventory Report Bucket/Inventory ID/data/.Unduh file inventaris ke mesin lokal Anda untuk melihat jumlah dan ukuran file dalam direktori.
Di file inventaris, kolom A merepresentasikan nama bucket, kolom B mencantumkan direktori dan semua objek di dalamnya, serta kolom C menunjukkan ukuran setiap objek yang sesuai.

Untuk informasi lebih lanjut, lihat Inventaris Bucket.
Metode 3: Lakukan kueri kompleks menggunakan MetaSearch
Metode ini cocok untuk melakukan kueri statistik hampir real-time terkait jumlah dan ukuran objek dalam direktori, terutama ketika Anda memerlukan kondisi penyaringan fleksibel seperti berdasarkan awalan, waktu, atau jenis file.
Di panel navigasi kiri bucket target, pilih .
Di halaman Data Indexing, klik Enable data indexing, pilih MetaSearch, lalu klik Enable.
CatatanProses mengaktifkan MetaSearch mungkin memakan waktu, bergantung pada jumlah objek dalam bucket.
Atur Object Name ke Prefix Match dan masukkan
random_files/sebagai awalan. Biarkan pengaturan default untuk parameter lainnya.
Konfigurasikan metode keluaran.
Atur Object Sort Order ke Default.
Untuk Data Aggregation, pilih By Sum untuk Object Size.

Klik Query Now. Hasil akan menampilkan total jumlah dan ukuran semua objek dalam direktori
random_files/.
Untuk informasi lebih lanjut, lihat MetaSearch.
Terapkan dalam produksi
Kontrol akses
OSS mengontrol akses berdasarkan pencocokan awalan untuk nama objek, bukan pada objek placeholder direktori itu sendiri.
Sebagai contoh, untuk memberikan akses baca-saja kepada pengguna untuk semua objek dalam direktori logs/:
Salah: Tetapkan izin pada objek nol byte
logs/placeholder.Benar: Buat kebijakan Resource Access Management (RAM) di mana bidang
Resourcediatur keacs:oss:*:*:your-bucket-name/logs/*. Kebijakan ini cocok untuk semua objek yang namanya dimulai dengan awalanlogs/, terlepas dari apakah objek placeholderlogs/ada.
Optimasi kinerja
Kedalaman direktori: Hindari struktur direktori bersarang dalam (misalnya,
a/b/c/d/.../file.log), karena ini dapat menurunkan kinerja operasi daftar.Pengubahan nama skala besar: Mengubah nama direktori yang berisi sejumlah besar objek menghasilkan volume tinggi panggilan API dan lalu lintas, menimbulkan biaya signifikan. Hindari praktik ini dalam desain sistem Anda.