Topik ini menjelaskan cara menghapus satu objek, beberapa objek, atau objek yang memiliki awalan tertentu dari bucket yang diaktifkan Pengendalian versi.
Pertimbangan
Topik ini menggunakan titik akhir publik wilayah China (Hangzhou). Untuk mengakses OSS dari layanan Alibaba Cloud lainnya dalam wilayah yang sama, gunakan titik akhir internal. Untuk detail wilayah dan titik akhir yang didukung, lihat Wilayah dan titik akhir.
Kredensial akses pada topik ini diperoleh dari variabel lingkungan. Untuk informasi lebih lanjut tentang cara mengonfigurasi kredensial akses, lihat Konfigurasi kredensial akses.
Instans OSSClient pada topik ini dibuat menggunakan titik akhir OSS. Jika Anda ingin membuat instans OSSClient menggunakan nama domain kustom atau Security Token Service (STS), lihat Contoh konfigurasi untuk skenario umum.
Untuk menghapus objek, Anda harus memiliki izin
oss:DeleteObject. Untuk informasi lebih lanjut, lihat Berikan kebijakan akses kustom kepada RAM user.
Perilaku penghapusan pada bucket yang diaktifkan Pengendalian versi
Perilaku penghapusan pada bucket yang diaktifkan Pengendalian versi adalah sebagai berikut:
Hapus tanpa menentukan ID versi (penghapusan temporary):
Jika Anda menghapus objek tanpa menentukan ID versi, OSS tidak menghapus objek tersebut secara permanen. Sebagai gantinya, OSS menambahkan penanda hapus, yang menjadi versi terkini dari objek tersebut. Jika Anda mencoba mengambil objek tersebut, OSS akan menemukan penanda hapus dan mengembalikan error
404 Not Found. Tanggapan tersebut menyertakanheader:x-oss-delete-marker = truedan ID versi dari penanda hapus baru dalamx-oss-version-id.Nilai true untuk
x-oss-delete-markermenunjukkan bahwa versi yang sesuai denganx-oss-version-idyang dikembalikan merupakan penanda hapus.Hapus dengan menentukan ID versi (penghapusan permanen):
Jika Anda menentukan `versionId` dalam operasi penghapusan, OSS akan menghapus secara permanen versi objek dengan
versionIdyang ditentukan dalam parameterparams. Untuk menghapus versi objek yang `versionId`-nya berupa string "null", tambahkanparams['versionId'] = "null"ke parameterparams. Dalam kasus ini, OSS memperlakukan string "null" sebagai `versionId` dan menghapus versi objek yang sesuai.
Hapus satu objek
Contoh berikut menunjukkan cara menghapus satu objek secara permanen atau temporary.
Penghapusan permanen
Kode berikut menunjukkan cara menghapus objek secara permanen dengan menentukan ID versinya:
import com.aliyun.oss.*; import com.aliyun.oss.common.auth.*; import com.aliyun.oss.common.comm.SignVersion; public class Demo { public static void main(String[] args) throws Exception { // Wilayah China (Hangzhou) digunakan sebagai contoh. Tentukan wilayah dan titik akhir Anda yang sebenarnya. String endpoint = "https://oss-cn-hangzhou.aliyuncs.com"; // Peroleh kredensial akses dari variabel lingkungan. Sebelum menjalankan kode ini, pastikan variabel lingkungan OSS_ACCESS_KEY_ID dan OSS_ACCESS_KEY_SECRET telah disetel. EnvironmentVariableCredentialsProvider credentialsProvider = CredentialsProviderFactory.newEnvironmentVariableCredentialsProvider(); // Tetapkan nama bucket, misalnya examplebucket. String bucketName = "examplebucket"; // Tetapkan path lengkap objek. Path lengkap tidak boleh mengandung nama bucket. String objectName = "exampledir/object"; String versionId = "CAEQMxiBgICAof2D0BYiIDJhMGE3N2M1YTI1NDQzOGY5NTkyNTI3MGYyMzJm****"; // Tetapkan wilayah tempat bucket berada. Misalnya, jika bucket berada di wilayah China (Hangzhou), tetapkan wilayah menjadi cn-hangzhou. String region = "cn-hangzhou"; // Buat instans OSSClient. // Saat instans OSSClient tidak lagi diperlukan, panggil metode shutdown untuk melepas sumber dayanya. ClientBuilderConfiguration clientBuilderConfiguration = new ClientBuilderConfiguration(); clientBuilderConfiguration.setSignatureVersion(SignVersion.V4); OSS ossClient = OSSClientBuilder.create() .endpoint(endpoint) .credentialsProvider(credentialsProvider) .clientConfiguration(clientBuilderConfiguration) .region(region) .build(); try { // Hapus versi objek yang ditentukan. ossClient.deleteVersion(bucketName, objectName , versionId); } catch (OSSException oe) { System.out.println("Terjadi OSSException, yang berarti 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, yang berarti 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(); } } } }Penghapusan temporary
Kode berikut menunjukkan cara menghapus objek secara temporary tanpa menentukan ID versi:
import com.aliyun.oss.*; import com.aliyun.oss.common.auth.*; import com.aliyun.oss.common.comm.SignVersion; public class Demo { public static void main(String[] args) throws Exception { // Wilayah China (Hangzhou) digunakan sebagai contoh. Tentukan wilayah dan titik akhir Anda yang sebenarnya. String endpoint = "https://oss-cn-hangzhou.aliyuncs.com"; // Peroleh kredensial akses dari variabel lingkungan. Sebelum menjalankan kode ini, pastikan variabel lingkungan OSS_ACCESS_KEY_ID dan OSS_ACCESS_KEY_SECRET telah disetel. EnvironmentVariableCredentialsProvider credentialsProvider = CredentialsProviderFactory.newEnvironmentVariableCredentialsProvider(); // Tetapkan nama bucket, misalnya examplebucket. String bucketName = "examplebucket"; // Tetapkan path lengkap objek. Path lengkap tidak boleh mengandung nama bucket. String objectName = "exampledir/object"; // Tetapkan wilayah tempat bucket berada. Misalnya, jika bucket berada di wilayah China (Hangzhou), tetapkan wilayah menjadi cn-hangzhou. String region = "cn-hangzhou"; // Buat instans OSSClient. // Saat instans OSSClient tidak lagi diperlukan, panggil metode shutdown untuk melepas sumber dayanya. ClientBuilderConfiguration clientBuilderConfiguration = new ClientBuilderConfiguration(); clientBuilderConfiguration.setSignatureVersion(SignVersion.V4); OSS ossClient = OSSClientBuilder.create() .endpoint(endpoint) .credentialsProvider(credentialsProvider) .clientConfiguration(clientBuilderConfiguration) .region(region) .build(); try { // Pada bucket yang diaktifkan Pengendalian versi, metode ini melakukan penghapusan temporary dengan menambahkan penanda hapus ke objek. ossClient.deleteObject(bucketName, objectName); } catch (OSSException oe) { System.out.println("Terjadi OSSException, yang berarti 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, yang berarti 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(); } } } }
Hapus beberapa objek
Contoh berikut menunjukkan cara menghapus beberapa objek secara permanen atau temporary.
Penghapusan permanen
Kode berikut menunjukkan cara menghapus beberapa objek dan penanda hapus secara permanen dengan menentukan ID versi masing-masing:
import com.aliyun.oss.*; import com.aliyun.oss.common.auth.*; import com.aliyun.oss.common.comm.SignVersion; import com.aliyun.oss.model.DeleteVersionsRequest; import com.aliyun.oss.model.DeleteVersionsResult; 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. Tentukan wilayah dan titik akhir Anda yang sebenarnya. String endpoint = "https://oss-cn-hangzhou.aliyuncs.com"; // Peroleh kredensial akses dari variabel lingkungan. Sebelum menjalankan kode ini, pastikan variabel lingkungan OSS_ACCESS_KEY_ID dan OSS_ACCESS_KEY_SECRET telah disetel. EnvironmentVariableCredentialsProvider credentialsProvider = CredentialsProviderFactory.newEnvironmentVariableCredentialsProvider(); // Tetapkan nama bucket, misalnya examplebucket. String bucketName = "examplebucket"; // Tetapkan path lengkap objek. Path lengkap tidak boleh mengandung nama bucket. String objectName = "exampledir/object"; String object2Name = "exampledir/object2"; String yourObjectNameVersionId = "CAEQMxiBgICAof2D0BYiIDJhMGE3N2M1YTI1NDQzOGY5NTkyNTI3MGYyMzJm****"; String yourObject2DelMarkerNameVersionId = "MGE3N2M1YgICAof2D0BYiID3N2M1YTITI1NDQzOGY5NTN2M1YTI1NDQz****"; // Tetapkan wilayah tempat bucket berada. Misalnya, jika bucket berada di wilayah China (Hangzhou), tetapkan wilayah menjadi cn-hangzhou. String region = "cn-hangzhou"; // Buat instans OSSClient. // Saat instans OSSClient tidak lagi diperlukan, panggil metode shutdown untuk melepas sumber dayanya. ClientBuilderConfiguration clientBuilderConfiguration = new ClientBuilderConfiguration(); clientBuilderConfiguration.setSignatureVersion(SignVersion.V4); OSS ossClient = OSSClientBuilder.create() .endpoint(endpoint) .credentialsProvider(credentialsProvider) .clientConfiguration(clientBuilderConfiguration) .region(region) .build(); try { // Hapus versi objek dan penanda hapus yang ditentukan. List<DeleteVersionsRequest.KeyVersion> keyVersionsList = new ArrayList<DeleteVersionsRequest.KeyVersion>(); keyVersionsList.add(new DeleteVersionsRequest.KeyVersion(objectName,yourObjectNameVersionId)); keyVersionsList.add(new DeleteVersionsRequest.KeyVersion(object2Name,yourObject2DelMarkerNameVersionId)); DeleteVersionsRequest delVersionsRequest = new DeleteVersionsRequest(bucketName); delVersionsRequest.setKeys(keyVersionsList); // Kirim permintaan deleteVersions. DeleteVersionsResult delVersionsResult = ossClient.deleteVersions(delVersionsRequest); // Lihat hasil penghapusan. for (DeleteVersionsResult.DeletedVersion delVer : delVersionsResult.getDeletedVersions()) { String keyName = URLDecoder.decode(delVer.getKey(), "UTF-8"); String keyVersionId = delVer.getVersionId(); String keyDelMarkerId = delVer.getDeleteMarkerVersionId(); System.out.println("hapus key: " + keyName); System.out.println("hapus key versionId: " + keyVersionId); if(keyDelMarkerId != null && keyDelMarkerId.length() != 0){ System.out.println("hapus key del_marker versionId: " + keyDelMarkerId); } } } catch (OSSException oe) { System.out.println("Terjadi OSSException, yang berarti 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, yang berarti 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(); } } } }Penghapusan temporary
Kode berikut menunjukkan cara menghapus beberapa objek secara temporary tanpa menentukan ID versi masing-masing:
import com.aliyun.oss.*; import com.aliyun.oss.common.auth.*; import com.aliyun.oss.common.comm.SignVersion; import com.aliyun.oss.model.DeleteObjectsRequest; import com.aliyun.oss.model.DeleteObjectsResult; 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. Tentukan wilayah dan titik akhir Anda yang sebenarnya. String endpoint = "https://oss-cn-hangzhou.aliyuncs.com"; // Peroleh kredensial akses dari variabel lingkungan. Sebelum menjalankan kode ini, pastikan variabel lingkungan OSS_ACCESS_KEY_ID dan OSS_ACCESS_KEY_SECRET telah disetel. EnvironmentVariableCredentialsProvider credentialsProvider = CredentialsProviderFactory.newEnvironmentVariableCredentialsProvider(); // Tetapkan nama bucket, misalnya examplebucket. String bucketName = "examplebucket"; // Tetapkan path lengkap objek. Path lengkap tidak boleh mengandung nama bucket. String objectName = "exampledir/object"; String object2Name = "exampledir/object2"; // Tetapkan wilayah tempat bucket berada. Misalnya, jika bucket berada di wilayah China (Hangzhou), tetapkan wilayah menjadi cn-hangzhou. String region = "cn-hangzhou"; // Buat instans OSSClient. // Saat instans OSSClient tidak lagi diperlukan, panggil metode shutdown untuk melepas sumber dayanya. ClientBuilderConfiguration clientBuilderConfiguration = new ClientBuilderConfiguration(); clientBuilderConfiguration.setSignatureVersion(SignVersion.V4); OSS ossClient = OSSClientBuilder.create() .endpoint(endpoint) .credentialsProvider(credentialsProvider) .clientConfiguration(clientBuilderConfiguration) .region(region) .build(); try { // Hapus objek secara batch. List<String> KeysList = new ArrayList<String>(); KeysList.add(objectName); KeysList.add(object2Name); DeleteObjectsRequest request = new DeleteObjectsRequest(bucketName); request.setKeys(KeysList); // Kirim permintaan deleteObjects. DeleteObjectsResult delObjResult = ossClient.deleteObjects(request); // Lihat hasil penghapusan. for (String o : delObjResult.getDeletedObjects()) { String keyName = URLDecoder.decode(o, "UTF-8"); System.out.println("hapus nama key: " + keyName); } } catch (OSSException oe) { System.out.println("Terjadi OSSException, yang berarti 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, yang berarti 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(); } } } }
Hapus objek dengan awalan tertentu
Kode berikut menunjukkan cara menghapus objek yang memiliki awalan tertentu:
import com.aliyun.oss.*;
import com.aliyun.oss.common.auth.*;
import com.aliyun.oss.common.comm.SignVersion;
import com.aliyun.oss.model.*;
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. Tentukan wilayah dan titik akhir Anda yang sebenarnya.
String endpoint = "https://oss-cn-hangzhou.aliyuncs.com";
// Peroleh kredensial akses dari variabel lingkungan. Sebelum menjalankan kode ini, pastikan variabel lingkungan OSS_ACCESS_KEY_ID dan OSS_ACCESS_KEY_SECRET telah disetel.
EnvironmentVariableCredentialsProvider credentialsProvider = CredentialsProviderFactory.newEnvironmentVariableCredentialsProvider();
// Tetapkan nama bucket, misalnya examplebucket.
String bucketName = "examplebucket";
// Tentukan awalan.
String prefix = "yourkeyPrefix";
// Tetapkan wilayah tempat bucket berada. Misalnya, jika bucket berada di wilayah China (Hangzhou), tetapkan wilayah menjadi cn-hangzhou.
String region = "cn-hangzhou";
// Buat instans OSSClient.
// Saat instans OSSClient tidak lagi diperlukan, panggil metode shutdown untuk melepas sumber dayanya.
ClientBuilderConfiguration clientBuilderConfiguration = new ClientBuilderConfiguration();
clientBuilderConfiguration.setSignatureVersion(SignVersion.V4);
OSS ossClient = OSSClientBuilder.create()
.endpoint(endpoint)
.credentialsProvider(credentialsProvider)
.clientConfiguration(clientBuilderConfiguration)
.region(region)
.build();
try {
// Daftar semua versi file dengan awalan tertentu dan hapus semuanya.
String nextKeyMarker = null;
String nextVersionMarker = null;
VersionListing versionListing = null;
do {
ListVersionsRequest listVersionsRequest = new ListVersionsRequest()
.withBucketName(bucketName)
.withKeyMarker(nextKeyMarker)
.withVersionIdMarker(nextVersionMarker)
.withPrefix(prefix);
versionListing = ossClient.listVersions(listVersionsRequest);
if (versionListing.getVersionSummaries().size() > 0) {
List<DeleteVersionsRequest.KeyVersion> keyVersionsList = new ArrayList<DeleteVersionsRequest.KeyVersion>();
for (OSSVersionSummary ossVersion : versionListing.getVersionSummaries()) {
System.out.println("nama key: " + ossVersion.getKey());
System.out.println("versionid: " + ossVersion.getVersionId());
System.out.println("Apakah penanda hapus: " + ossVersion.isDeleteMarker());
keyVersionsList.add(new DeleteVersionsRequest.KeyVersion(ossVersion.getKey(), ossVersion.getVersionId()));
}
DeleteVersionsRequest delVersionsRequest = new DeleteVersionsRequest(bucketName).withKeys(keyVersionsList);
ossClient.deleteVersions(delVersionsRequest);
}
nextKeyMarker = versionListing.getNextKeyMarker();
nextVersionMarker = versionListing.getNextVersionIdMarker();
} while (versionListing.isTruncated());
} catch (OSSException oe) {
System.out.println("Terjadi OSSException, yang berarti 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, yang berarti 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();
}
}
}
}Referensi
Untuk informasi lebih lanjut tentang operasi API untuk menghapus satu objek, lihat DeleteObject.
Untuk informasi lebih lanjut tentang operasi API untuk menghapus beberapa objek, lihat DeleteMultipleObjects.