Verwendung von Java V2
Das IBM Cloud® Object Storage SDK für Java v2 bietet Funktionen, um das Beste aus IBM Cloud Object Storage herauszuholen.
Das IBM Cloud Object Storage SDK für Java v2 ist umfassend und bietet viele Funktionen und Möglichkeiten, die den Rahmen dieses Handbuchs sprengen würden. Eine ausführliche Dokumentation der Klassen und Methoden finden Sie in der API-Referenzdokumentation Java. Den Quellcode finden Sie im GitHub-Repository.
Was ist neu in v2
Das IBM Cloud Object Storage SDK für Java v2 ist eine modernisierte Version, die auf der AWS SDK v2 Architektur aufbaut und erhebliche Verbesserungen mit sich bringt:
- Unveränderliche Builder: Alle Anfrage- und Antwortobjekte verwenden unveränderliche Builder-Muster für eine bessere Thread-Sicherheit
- Moderne Paketstruktur: Neuer Namespace
com.ibm.cos.v2.*mit sauberer Organisation - Verbesserte Async-Unterstützung: Einführung von
S3AsyncClientfür nicht blockierende Operationen - Verbessertes Streaming: Verbesserte Streaming-APIs mit
RequestBodyundResponseTransformer - Automatische IAM-Token-Verwaltung: SDK verwaltet die Aktualisierung von IAM-Tokens automatisch
- Typsicherheit: Verbesserte Kompilierzeit-Typüberprüfung mit Buildern
- Moderner HTTP Stack: Unterstützung für Apache HTTP Client und Netty für asynchrone Operationen
Für Entwickler, die von v1 migrieren, siehe die Migrationsanleitung.
SDK abrufen
Der einfachste Weg, das IBM Cloud Object Storage Java SDK v2 zu nutzen, ist die Verwendung von Maven zur Verwaltung von Abhängigkeiten. Wenn Sie mit Maven nicht vertraut sind, können Sie mit Hilfe des Leitfadens Maven in 5-Minutes " sofort loslegen.
Maven verwendet eine Datei mit dem Namen pom.xml, um die Bibliotheken (und deren Versionen) anzugeben, die für ein Java-Projekt erforderlich sind. Hier ist eine Beispiel pom.xml Datei für die Verwendung des IBM Cloud
Object Storage Java SDK v2 zur Verbindung mit Object Storage.
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.cos</groupId>
<artifactId>docs</artifactId>
<packaging>jar</packaging>
<version>2.0-SNAPSHOT</version>
<name>docs</name>
<url>http://maven.apache.org</url>
<dependencies>
<dependency>
<groupId>com.ibm.cos.v2</groupId>
<artifactId>cos-java-sdk</artifactId>
<version>1.0.1</version>
</dependency>
</dependencies>
</project>
SDK-Referenzen
Kernklassen
- S3Client- Synchroner S3 Client
- S3AsyncClient- Asynchroner S3 Client
- S3ClientBuilder- Builder für S3 client
Berechtigungsnachweise
- AwsCredentials- Schnittstelle für Basisanmeldeinformationen
- BasicIBMOAuthCredentials- IBM IAM-Berechtigungsnachweise
- AwsBasicCredentials- HMAC-Berechtigungsnachweise
- StaticCredentialsProvider- Anbieter statischer Anmeldeinformationen
- AwsCredentialsProvider- Schnittstelle zum Anbieter von Berechtigungsnachweisen
Konfiguration
- Region- AWS Vertretung der Region
- ClientOverrideConfiguration- Client-Konfiguration übersteuert
- S3Configuration- S3-specific konfiguration
Streaming
- RequestBody- Antragstext für Uploads
- ResponseTransformer- Antworttransformator für Downloads
- ResponseInputStream- Reaktion des Eingangsstroms
Ausnahmen
- S3Exception- Basis S3 Ausnahme
- NoSuchBucketException- Eimer nicht gefunden
- NoSuchKeyException- Objekt nicht gefunden
- SdkClientException- Client-seitige Ausnahme
Client erstellen und Berechtigungsnachweise ableiten
Im folgenden Beispiel wird der Client cos erstellt und durch Bereitstellen der Berechtigungsnachweisinformationen (API-Schlüssel und Serviceinstanz-ID) konfiguriert. Diese Werte können auch automatisch aus einer Berechtigungsnachweisdatei
oder aus Umgebungsvariablen abgeleitet werden.
Nach dem Generieren eines Serviceberechtigungsnachweises kann das daraus resultierende JSON-Dokument unter ~/.bluemix/cos_credentials gespeichert werden. Vom SDK wird diese Datei automatisch als Quelle für die Berechtigungsnachweise verwendet, sofern während der Clienterstellung nicht explizit andere Berechtigungsnachweise festgelegt werden. Wenn die Datei cos_credentials HMAC-Schlüssel enthält, wird die Authentifizierung vom Client mithilfe einer Signatur durchgeführt; andernfalls wird vom Client für die Authentifizierung der bereitgestellte API-Schlüssel mit einem Bearer-Token verwendet.
Falls Sie eine Migration von AWS S3 durchführen, können Sie die Daten für die Berechtigungsnachweise aus ~/.aws/credentials im folgenden Format verwenden:
[default]
aws_access_key_id = {API_KEY}
aws_secret_access_key = {SERVICE_INSTANCE_ID}
Wenn sowohl ~/.bluemix/cos_credentials als auch ~/.aws/credentials vorhanden ist, genießt cos_credentials Vorrang.
Weitere Details zur Client-Konstruktion finden Sie in der Java API-Referenzdokumentation.
Codebeispiele
Beginnen wir mit einer vollständigen Beispielklasse, die einige grundlegende Funktionen durchläuft. Diese Klasse CosExample listet Objekte in einem vorhandenen Bereich auf, erstellt einen neuen Bereich und listet dann alle Bereiche
in der Serviceinstanz auf.
Erforderliche Informationen erfassen
bucketNameundnewBucketNamesind eindeutige und DNS-sichere Zeichenfolgen. Da Bucketnamen im gesamten System eindeutig sind, müssen diese Werte geändert werden, wenn dieses Beispiel mehrfach ausgeführt wird. Die Namen sind nach dem Löschen für 10 - 15 Minuten reserviert.apiKeyist der Wert, der in der Dienstberechtigung unterapikeyzu finden ist.serviceInstanceIdist der Wert, der in der Dienstberechtigung unterresource_instance_idzu finden ist.endpointUrlist ein Dienst-Endpunkt URL, einschließlich des Protokollshttps://. Dies ist nicht der Wert fürendpoints, der im Serviceberechtigungsnachweis gefunden wurde. Weitere Informationen zu Endpunkten enthält Endpunkte und Speicherpositionen.locationmuss auf den Standortteil derstorageClassgesetzt werden. Fürus-south-standardist diesus-south. Diese Variable wird nur für die Berechnung von HMAC-Signaturenverwendet, ist aber für jeden Client erforderlich (auch in diesem Beispiel), von dem ein IAM-API-Schlüssel verwendet wird.
package com.cos;
import java.net.URI;
import java.util.List;
import com.ibm.cos.v2.auth.credentials.AwsCredentials;
import com.ibm.cos.v2.auth.credentials.StaticCredentialsProvider;
import com.ibm.cos.v2.auth.credentials.ibmOAuth.BasicIBMOAuthCredentials;
import com.ibm.cos.v2.regions.Region;
import com.ibm.cos.v2.services.s3.S3Client;
import com.ibm.cos.v2.services.s3.model.*;
public class CosExample {
private static String COS_ENDPOINT = "<endpoint>";
private static String COS_API_KEY_ID = "<api-key>";
private static String COS_SERVICE_INSTANCE_ID = "<service-instance-id>";
private static String COS_LOCATION = "<location>";
public static void main(String[] args) {
System.out.println("Current time: " + new java.util.Date());
// Create IBM COS credentials using API key
AwsCredentials credentials = new BasicIBMOAuthCredentials(COS_API_KEY_ID, COS_SERVICE_INSTANCE_ID);
// Create the S3 client
S3Client cosClient = S3Client.builder()
.endpointOverride(URI.create(COS_ENDPOINT))
.credentialsProvider(StaticCredentialsProvider.create(credentials))
.region(Region.of(COS_LOCATION))
.build();
listObjects("my-bucket", cosClient);
createBucket("my-new-bucket", cosClient);
listBuckets(cosClient);
cosClient.close();
}
public static void listObjects(String bucketName, S3Client cosClient) {
System.out.println("Listing objects in bucket: " + bucketName);
ListObjectsV2Request request = ListObjectsV2Request.builder()
.bucket(bucketName)
.build();
ListObjectsV2Response response = cosClient.listObjectsV2(request);
List<S3Object> objects = response.contents();
for (S3Object object : objects) {
System.out.println("Item: " + object.key() + " (" + object.size() + " bytes)");
}
}
public static void createBucket(String bucketName, S3Client cosClient) {
System.out.println("Creating bucket: " + bucketName);
CreateBucketRequest request = CreateBucketRequest.builder()
.bucket(bucketName)
.build();
cosClient.createBucket(request);
System.out.println("Bucket created: " + bucketName);
}
public static void listBuckets(S3Client cosClient) {
System.out.println("Listing buckets:");
ListBucketsResponse response = cosClient.listBuckets();
List<Bucket> buckets = response.buckets();
for (Bucket bucket : buckets) {
System.out.println("Bucket Name: " + bucket.name());
}
}
}
Wichtige Referenzen
Endpunkt bestimmen
Weitere Informationen zu Endpunkten enthält Endpunkte und Speicherpositionen.
Die Endpunkte folgen diesem Muster: https://s3.{region}.cloud-object-storage.appdomain.cloud
Beispiele:
- Vereinigte Staaten (Süden):
https://s3.us-south.cloud-object-storage.appdomain.cloud - Vereinigte Staaten (Osten):
https://s3.us-east.cloud-object-storage.appdomain.cloud - EU-Großbritannien:
https://s3.eu-gb.cloud-object-storage.appdomain.cloud
Neues Bucket erstellen
public static void createBucket(String bucketName, S3Client cosClient) {
System.out.println("Creating new bucket: " + bucketName);
CreateBucketRequest request = CreateBucketRequest.builder()
.bucket(bucketName)
.build();
cosClient.createBucket(request);
System.out.println("Bucket: " + bucketName + " created!");
}
Schlüsselverweis
Bucket mit anderer Speicherklasse erstellen
public static void createBucketWithStorageClass(String bucketName, String storageClass, String location, S3Client cosClient) {
System.out.println("Creating bucket: " + bucketName + " with storage class: " + storageClass);
CreateBucketRequest request = CreateBucketRequest.builder()
.bucket(bucketName)
.ibmServiceInstanceId(COS_SERVICE_INSTANCE_ID)
.build();
cosClient.createBucket(request);
System.out.println("Bucket: " + bucketName + " created with " + storageClass + " class storage!");
}
Die Optionen der Speicherklasse umfassen:
us-south-standard/us-east-standard/eu-gb-standard- Standardspeicherus-south-vault/us-east-vault/eu-gb-vault- Tresorraumus-south-cold/us-east-cold/eu-gb-cold- Lagerung im Kühlturmus-south-flex/us-east-flex/eu-gb-flex- Flex-Storage
Schlüsselverweis
Neue Textdatei erstellen
public static void createTextFile(String bucketName, String itemName, String fileText, S3Client cosClient) {
System.out.println("Creating new item: " + itemName);
PutObjectRequest request = PutObjectRequest.builder()
.bucket(bucketName)
.key(itemName)
.build();
cosClient.putObject(request, RequestBody.fromString(fileText));
System.out.println("Item: " + itemName + " created!");
}
Wichtige Referenzen
Objekt aus Datei hochladen
public static void putObject(String bucketName, String itemName, String filePath, S3Client cosClient) {
System.out.println("Creating new item: " + itemName);
PutObjectRequest request = PutObjectRequest.builder()
.bucket(bucketName)
.key(itemName)
.build();
cosClient.putObject(request, RequestBody.fromFile(new File(filePath)));
System.out.println("Item: " + itemName + " created!");
}
Wichtige Referenzen
Objekt per Streaming hochladen
public static void putObjectStream(String bucketName, String itemName, InputStream inputStream, long contentLength, S3Client cosClient) {
System.out.println("Creating new item: " + itemName + " from input stream");
PutObjectRequest request = PutObjectRequest.builder()
.bucket(bucketName)
.key(itemName)
.contentLength(contentLength)
.build();
cosClient.putObject(request, RequestBody.fromInputStream(inputStream, contentLength));
System.out.println("Item: " + itemName + " created!");
}
Wichtige Referenzen
Objekt in Datei herunterladen
public static void getObject(String bucketName, String itemName, String filePath, S3Client cosClient) {
System.out.println("Retrieving item: " + itemName);
GetObjectRequest request = GetObjectRequest.builder()
.bucket(bucketName)
.key(itemName)
.build();
cosClient.getObject(request, ResponseTransformer.toFile(new File(filePath)));
System.out.println("Item: " + itemName + " downloaded to: " + filePath);
}
Wichtige Referenzen
Objekt per Streaming herunterladen
public static void getObjectStream(String bucketName, String itemName, S3Client cosClient) {
System.out.println("Retrieving item: " + itemName + " as stream");
GetObjectRequest request = GetObjectRequest.builder()
.bucket(bucketName)
.key(itemName)
.build();
ResponseInputStream<GetObjectResponse> response = cosClient.getObject(request);
try (InputStream inputStream = response) {
// Process the input stream
byte[] buffer = new byte[1024];
int bytesRead;
while ((bytesRead = inputStream.read(buffer)) != -1) {
// Process bytes
System.out.write(buffer, 0, bytesRead);
}
} catch (IOException e) {
System.err.println("Error reading object: " + e.getMessage());
}
System.out.println("\nItem: " + itemName + " retrieved!");
}
Wichtige Referenzen
Objekte kopieren
public static void copyObject(String sourceBucketName, String sourceKey, String destinationBucketName, String destinationKey, S3Client cosClient) {
System.out.println("Copying item: " + sourceKey + " from bucket: " + sourceBucketName +
" to: " + destinationKey + " in bucket: " + destinationBucketName);
CopyObjectRequest request = CopyObjectRequest.builder()
.sourceBucket(sourceBucketName)
.sourceKey(sourceKey)
.destinationBucket(destinationBucketName)
.destinationKey(destinationKey)
.build();
cosClient.copyObject(request);
System.out.println("Item: " + sourceKey + " copied!");
}
Wichtige Referenzen
Verfügbare Buckets auflisten
public static void listBuckets(S3Client cosClient) {
System.out.println("Listing buckets:");
ListBucketsResponse response = cosClient.listBuckets();
List<Bucket> buckets = response.buckets();
for (Bucket bucket : buckets) {
System.out.println("Bucket Name: " + bucket.name());
}
}
Wichtige Referenzen
Dateiinhalt eines bestimmten Elements abrufen
public static void getItem(String bucketName, String itemName, S3Client cosClient) {
System.out.println("Retrieving item: " + itemName);
GetObjectRequest request = GetObjectRequest.builder()
.bucket(bucketName)
.key(itemName)
.build();
ResponseInputStream<GetObjectResponse> response = cosClient.getObject(request);
try {
String content = new String(response.readAllBytes(), StandardCharsets.UTF_8);
System.out.println("File Contents:\n" + content);
} catch (IOException e) {
System.err.println("Error reading object: " + e.getMessage());
}
}
Wichtige Referenzen
Element in Bucket löschen
public static void deleteItem(String bucketName, String itemName, S3Client cosClient) {
System.out.println("Deleting item: " + itemName);
DeleteObjectRequest request = DeleteObjectRequest.builder()
.bucket(bucketName)
.key(itemName)
.build();
cosClient.deleteObject(request);
System.out.println("Item: " + itemName + " deleted!");
}
Wichtige Referenzen
Mehrere Elemente in Bucket löschen
public static void deleteMultipleItems(String bucketName, List<String> itemNames, S3Client cosClient) {
System.out.println("Deleting multiple items from bucket: " + bucketName);
List<ObjectIdentifier> objectsToDelete = itemNames.stream()
.map(key -> ObjectIdentifier.builder().key(key).build())
.collect(Collectors.toList());
Delete delete = Delete.builder()
.objects(objectsToDelete)
.build();
DeleteObjectsRequest request = DeleteObjectsRequest.builder()
.bucket(bucketName)
.delete(delete)
.build();
DeleteObjectsResponse response = cosClient.deleteObjects(request);
System.out.println("Deleted " + response.deleted().size() + " items!");
}
Wichtige Referenzen
Bucket löschen
Der Eimer muss leer sein, bevor er gelöscht werden kann.
public static void deleteBucket(String bucketName, S3Client cosClient) {
System.out.println("Deleting bucket: " + bucketName);
DeleteBucketRequest request = DeleteBucketRequest.builder()
.bucket(bucketName)
.build();
cosClient.deleteBucket(request);
System.out.println("Bucket: " + bucketName + " deleted!");
}
Wichtige Referenzen
Öffentliche Lesbarkeit eines Objekts überprüfen
public static boolean isObjectPubliclyReadable(String bucketName, String objectKey, S3Client cosClient) {
System.out.println("Checking if object is publicly readable: " + objectKey);
try {
GetObjectAclRequest request = GetObjectAclRequest.builder()
.bucket(bucketName)
.key(objectKey)
.build();
GetObjectAclResponse response = cosClient.getObjectAcl(request);
for (Grant grant : response.grants()) {
if (grant.grantee().type() == Type.GROUP &&
grant.grantee().uri() != null &&
grant.grantee().uri().contains("AllUsers") &&
grant.permission() == Permission.READ) {
System.out.println("Object is publicly readable");
return true;
}
}
System.out.println("Object is not publicly readable");
return false;
} catch (S3Exception e) {
System.err.println("Error checking object ACL: " + e.getMessage());
return false;
}
}
Wichtige Referenzen
Mehrteiligen Upload ausführen
Beim Arbeiten mit größeren Objekten werden Operationen mit mehrteiligen Uploads empfohlen, um Objekte in IBM Cloud Object Storage zu schreiben. Der Upload eines einzelnen Objekts kann als Gruppe einzelner Teile ausgeführt werden. Diese Teile können unabhängig voneinander in beliebiger Reihenfolge und auch parallel hochgeladen werden. Nach Abschluss des Uploads stellt IBM Cloud Object Storage alle Teile als ein einziges Objekt dar.
Mehrteilige Uploads sind nur für Objekte mit einer Größe von mehr als 5 MB verfügbar. Bei Objekten, die kleiner als 50 GB sind, wird eine Größe der einzelnen Teile zwischen 20 MB und 100 MB empfohlen, um eine optimale Leistung zu erzielen. Bei größeren Objekten kann die Größe der Teile vergrößert werden, ohne dass hierdurch die Leistung wesentlich beeinträchtigt wird.
public static void multipartUpload(String bucketName, String itemName, String filePath, S3Client cosClient) {
System.out.println("Starting multipart upload for: " + itemName);
// Step 1: Initiate multipart upload
CreateMultipartUploadRequest initiateRequest = CreateMultipartUploadRequest.builder()
.bucket(bucketName)
.key(itemName)
.build();
CreateMultipartUploadResponse initiateResponse = cosClient.createMultipartUpload(initiateRequest);
String uploadId = initiateResponse.uploadId();
System.out.println("Upload ID: " + uploadId);
// Step 2: Upload parts
int partNumber = 1;
List<CompletedPart> completedParts = new ArrayList<>();
ByteBuffer buffer = ByteBuffer.allocate(5 * 1024 * 1024); // 5 MB parts
try (RandomAccessFile file = new RandomAccessFile(filePath, "r")) {
long fileSize = file.length();
long position = 0;
while (position < fileSize) {
file.seek(position);
long bytesRead = file.getChannel().read(buffer);
buffer.flip();
UploadPartRequest uploadPartRequest = UploadPartRequest.builder()
.bucket(bucketName)
.key(itemName)
.uploadId(uploadId)
.partNumber(partNumber)
.build();
UploadPartResponse partResponse = cosClient.uploadPart(
uploadPartRequest,
RequestBody.fromByteBuffer(buffer)
);
CompletedPart part = CompletedPart.builder()
.partNumber(partNumber)
.eTag(partResponse.eTag())
.build();
completedParts.add(part);
System.out.println("Uploaded part " + partNumber);
buffer.clear();
position += bytesRead;
partNumber++;
}
} catch (IOException e) {
System.err.println("Error during multipart upload: " + e.getMessage());
// Abort the multipart upload on error
AbortMultipartUploadRequest abortRequest = AbortMultipartUploadRequest.builder()
.bucket(bucketName)
.key(itemName)
.uploadId(uploadId)
.build();
cosClient.abortMultipartUpload(abortRequest);
return;
}
// Step 3: Complete multipart upload
CompletedMultipartUpload completedUpload = CompletedMultipartUpload.builder()
.parts(completedParts)
.build();
CompleteMultipartUploadRequest completeRequest = CompleteMultipartUploadRequest.builder()
.bucket(bucketName)
.key(itemName)
.uploadId(uploadId)
.multipartUpload(completedUpload)
.build();
cosClient.completeMultipartUpload(completeRequest);
System.out.println("Multipart upload completed for: " + itemName);
}
Wichtige Referenzen
Immutable Object Storage (IOS) verwenden
Benutzer können Buckets mit der Richtlinie Unveränderlich Object Storage konfigurieren, um zu verhindern, dass Objekte für einen bestimmten Zeitraum geändert oder gelöscht werden. Die Aufbewahrungsfrist kann für jedes Objekt einzeln festgelegt werden, oder die Objekte können eine für den Bereich festgelegte Standardaufbewahrungsfrist übernehmen.
Hinzufügen einer Schutzkonfiguration zu einem Bucket
Bei dieser Implementierung der PUT-Operation wird der Abfrageparameter protection verwendet, um die Aufbewahrungsparameter für ein vorhandenes Bucket festzulegen. Diese Operation ermöglicht Ihnen das Festlegen der Werte
für die mindestens erforderliche, maximal zulässige und standardmäßige Aufbewahrungsdauer. Mit dieser Operation können Sie auch den Schutzstatus des Buckets ändern.
Objekte, die in ein geschütztes Bucket geschrieben wurden, können erst gelöscht werden, nachdem die Schutzfrist abgelaufen ist und alle Beweissicherungsvermerke für das Objekt entfernt wurden. Einem Objekt wird der Standardaufbewahrungswert des Buckets zugewiesen, es sei denn, bei der Erstellung des Objekts wird ein objektspezifischer Wert angegeben. Objekte in geschützten Bereichen, die nicht mehr der Aufbewahrung unterliegen (die Aufbewahrungsfrist ist abgelaufen und das Objekt ist nicht mehr rechtlich geschützt), werden beim Überschreiben wieder der Aufbewahrung unterstellt. Die neue Aufbewahrungsdauer kann als Teil der Objektüberschreibungsanforderung angegeben werden oder dem Objekt wird der Standardaufbewahrungszeitraum des Buckets zugeordnet.
Die unterstützten Mindest- und Höchstwerte für die Einstellungen der Aufbewahrungsfrist MinimumRetention, DefaultRetention und MaximumRetention betragen mindestens 0 Tage und höchstens 365243 Tage (1000
Jahre).
public static void addProtectionConfigurationToBucket(String bucketName, S3Client cosClient) {
System.out.println("Adding protection configuration to bucket: " + bucketName);
BucketProtectionConfiguration protectionConfig = BucketProtectionConfiguration.builder()
.status(BucketProtectionStatus.RETENTION)
.minimumRetention(BucketProtectionMinimumRetention.builder()
.days(10)
.build())
.defaultRetention(BucketProtectionDefaultRetention.builder()
.days(100)
.build())
.maximumRetention(BucketProtectionMaximumRetention.builder()
.days(1000)
.build())
.build();
PutBucketProtectionConfigurationRequest request = PutBucketProtectionConfigurationRequest.builder()
.bucket(bucketName)
.protectionConfiguration(protectionConfig)
.build();
cosClient.putBucketProtectionConfiguration(request);
System.out.println("Protection configuration added!");
}
Abrufen der Schutzkonfiguration eines Eimers
public static void getProtectionConfigurationOnBucket(String bucketName, S3Client cosClient) {
System.out.println("Retrieving protection configuration for bucket: " + bucketName);
GetBucketProtectionConfigurationRequest request = GetBucketProtectionConfigurationRequest.builder()
.bucket(bucketName)
.build();
GetBucketProtectionConfigurationResponse response = cosClient.getBucketProtectionConfiguration(request);
System.out.println("Status: " + response.status());
System.out.println("Minimum Retention (days): " + response.minimumRetention().days());
System.out.println("Default Retention (days): " + response.defaultRetention().days());
System.out.println("Maximum Retention (days): " + response.maximumRetention().days());
}
Hochladen eines geschützten Objekts mit Speicherung
Objekte in geschützten Bereichen, die nicht mehr der Aufbewahrung unterliegen (die Aufbewahrungsfrist ist abgelaufen und das Objekt ist nicht mehr rechtlich geschützt), werden beim Überschreiben wieder der Aufbewahrung unterstellt. Die neue Aufbewahrungsdauer kann als Teil der Objektüberschreibungsanforderung angegeben werden oder dem Objekt wird der Standardaufbewahrungszeitraum des Buckets zugeordnet.
Sie können beim Hochladen von Objekten in geschützte Buckets mithilfe von benutzerdefinierten Kopfzeilen Parameter für die Aufbewahrung angeben:
| Überschrift | Typ | Beschreibung |
|---|---|---|
Retention-Period |
Nichtnegative ganze Zahl (Sekunden) | Die Aufbewahrungsdauer des Objekts in Sekunden. Das Objekt kann vor Ablauf der Aufbewahrungsdauer weder überschrieben noch gelöscht werden. Wenn dieses Feld und Retention-Expiration-Date angegeben sind, wird ein 400-Fehler
zurückgegeben. Wird keiner dieser Werte angegeben, dann wird der Wert für 'DefaultRetention' des Buckets verwendet. Null (0) ist ein zulässiger Wert, wenn die Mindestaufbewahrungsfrist des Bereichs ebenfalls 0 beträgt. |
Retention-Expiration-Date |
Datum (ISO 8601-Format) | Das Datum, an dem die Löschung oder Änderung des Objekts rechtmäßig ist. Sie können nur diese oder die Kopfzeile Retention-Period angeben. Wenn beides angegeben ist, wird ein 400-Fehler zurückgegeben. Wird keiner dieser Werte
angegeben, dann wird der Wert für 'DefaultRetention' des Buckets verwendet. |
Retention-Legal-Hold-Id |
Zeichenfolge | Ein einzelner Beweissicherungsvermerk, der auf das Objekt angewendet wird. Ein legaler Halt ist eine Y-Zeichen lange Zeichenfolge. Das Objekt kann erst überschrieben oder gelöscht werden, nachdem alle dem Objekt zugeordneten Beweissicherungsvermerke entfernt wurden. |
public static void uploadProtectedObject(String bucketName, String objectKey, String filePath, S3Client cosClient) {
System.out.println("Uploading protected object with retention: " + objectKey);
// Option 1: Upload with retention period (in seconds)
PutObjectRequest requestWithPeriod = PutObjectRequest.builder()
.bucket(bucketName)
.key(objectKey)
.retentionPeriod(2592000L) // 30 days in seconds
.build();
cosClient.putObject(requestWithPeriod, RequestBody.fromFile(new File(filePath)));
System.out.println("Object uploaded with 30-day retention period");
}
public static void uploadProtectedObjectWithExpirationDate(String bucketName, String objectKey, String filePath, S3Client cosClient) {
System.out.println("Uploading protected object with expiration date: " + objectKey);
// Option 2: Upload with retention expiration date
Instant expirationDate = Instant.now().plus(90, ChronoUnit.DAYS);
PutObjectRequest requestWithDate = PutObjectRequest.builder()
.bucket(bucketName)
.key(objectKey)
.retentionExpirationDate(expirationDate)
.build();
cosClient.putObject(requestWithDate, RequestBody.fromFile(new File(filePath)));
System.out.println("Object uploaded with expiration date: " + expirationDate);
}
public static void uploadProtectedObjectWithLegalHold(String bucketName, String objectKey, String filePath, String legalHoldId, S3Client cosClient) {
System.out.println("Uploading protected object with legal hold: " + objectKey);
// Option 3: Upload with legal hold
PutObjectRequest requestWithLegalHold = PutObjectRequest.builder()
.bucket(bucketName)
.key(objectKey)
.retentionLegalHoldId(legalHoldId)
.build();
cosClient.putObject(requestWithLegalHold, RequestBody.fromFile(new File(filePath)));
System.out.println("Object uploaded with legal hold: " + legalHoldId);
}
public static void uploadProtectedObjectWithMultipleRetentionOptions(String bucketName, String objectKey, String filePath, String legalHoldId, S3Client cosClient) {
System.out.println("Uploading protected object with retention period and legal hold: " + objectKey);
// Option 4: Combine retention period with legal hold
PutObjectRequest request = PutObjectRequest.builder()
.bucket(bucketName)
.key(objectKey)
.retentionPeriod(2592000L) // 30 days
.retentionLegalHoldId(legalHoldId)
.build();
cosClient.putObject(request, RequestBody.fromFile(new File(filePath)));
System.out.println("Object uploaded with retention and legal hold");
}
Wichtige Hinweise:
- Sie können nicht sowohl
Retention-Periodals auchRetention-Expiration-Datein derselben Anfrage angeben. - Wenn keiner der beiden Aufbewahrungsparameter angegeben ist, wird die Standardaufbewahrungszeit des Bereichs angewendet.
- Gesetzliche Sperrfristen können mit Aufbewahrungsfristen kombiniert werden.
- Objekte, für die eine Aufbewahrungsfrist gilt oder die mit einer rechtlichen Sperre versehen sind, können nicht gelöscht oder überschrieben werden, bevor die Aufbewahrungsfrist abgelaufen ist und alle rechtlichen Sperren aufgehoben wurden.
Wichtige Referenzen
Hinzufügen eines legalen Zugriffs auf ein geschütztes Objekt
Das Objekt kann bis zu 100 Beweissicherungsvermerke unterstützen:
Ein legaler Hold Identifier ist eine Zeichenkette mit einer maximalen Länge von 64 Zeichen und einer Mindestlänge von 1 Zeichen. Gültige Zeichen sind Buchstaben, Zahlen, !, _, ., *, (,
), - und '. Wenn durch das Hinzufügen des angegebenen Beweissicherungsvermerks der Grenzwert von insgesamt 100 Beweissicherungsvermerken für das Objekt überschritten wird, dann wird der neue Beweissicherungsvermerk
nicht hinzugefügt und das System gibt den Fehler 400 aus. Wenn ein Bezeichner zu lang ist, wird er dem Objekt nicht hinzugefügt und ein 400 Fehler wird zurückgegeben. Wenn eine Kennung ungültige Zeichen enthält, dann
wird sie nicht zum Objekt hinzugefügt und das System gibt den Fehler 400 zurück. Wenn eine Kennung für ein Objekt bereits verwendet wird, dann wird der vorhandene Beweissicherungsvermerk nicht geändert und in der Antwort wird
angegeben, dass die Kennung bereits belegt ist (Fehler 409). Wenn ein Objekt keine Metadaten für die Aufbewahrungsdauer aufweist, wird der Fehler 400 zurückgegeben und das Hinzufügen oder Entfernen eines Beweissicherungsvermerks
ist nicht zulässig. Das Vorhandensein eines Headers für die Aufbewahrungsdauer ist erforderlich, da andernfalls der Fehler 400 zurückgegeben wird.
Der Benutzer, der einen Beweissicherungsvermerk hinzufügt oder entfernt, muss über die Berechtigungen für Manager für dieses Bucket verfügen.
public static void addLegalHoldToObject(String bucketName, String objectKey, String legalHoldId, S3Client cosClient) {
System.out.println("Adding legal hold to object: " + objectKey);
AddLegalHoldRequest request = AddLegalHoldRequest.builder()
.bucket(bucketName)
.key(objectKey)
.legalHoldId(legalHoldId)
.build();
cosClient.addLegalHold(request);
System.out.println("Legal hold added!");
}
Verlängerung der Aufbewahrungsfrist für ein geschütztes Objekt
Die Aufbewahrungsdauer eines Objekts kann nur verlängert werden. Sie kann gegenüber dem momentan konfigurierten Wert nicht verkürzt werden.
Der Wert für die Verlängerung der Aufbewahrungsdauer kann auf die folgenden drei Arten festgelegt werden:
- Zusätzliche Zeit ab dem aktuellen Wert (
additionalRetentionPeriododer ähnliche Methode) - Neuer Verlängerungszeitraum in Sekunden (
extendRetentionFromCurrentTimeoder ähnliche Methode) - Neues Ablaufdatum für die Aufbewahrung des Objekts (
newRetentionExpirationDateoder ähnliche Methode)
Die in den Objektmetadaten momentan gespeicherte Aufbewahrungsdauer wird entweder um die angegebene zusätzliche Zeitdauer verlängert oder durch den neuen Wert ersetzt. Welche Methode verwendet wird, hängt von dem Parameter ab, der in der Anforderung
für extendRetention festgelegt wird. In allen Fällen wird der erweiterte Parameter für die Aufbewahrung mit der aktuellen Aufbewahrungsfrist verglichen, und der erweiterte Parameter wird nur akzeptiert, wenn die aktualisierte
Aufbewahrungsfrist größer ist als die aktuelle Aufbewahrungsfrist.
Objekte in geschützten Bereichen, die nicht mehr der Aufbewahrung unterliegen (die Aufbewahrungsfrist ist abgelaufen und das Objekt ist nicht mehr rechtlich geschützt), werden beim Überschreiben wieder der Aufbewahrung unterstellt. Die neue Aufbewahrungsdauer kann als Teil der Objektüberschreibungsanforderung angegeben werden oder dem Objekt wird der Standardaufbewahrungszeitraum des Buckets zugeordnet.
public static void extendRetentionPeriodOnObject(String bucketName, String objectName, Long additionalSeconds, S3Client cosClient) {
System.out.printf("Extending the retention period on %s in bucket %s by %s seconds.%n", objectName, bucketName, additionalSeconds);
ExtendObjectRetentionRequest request = ExtendObjectRetentionRequest.builder()
.bucket(bucketName)
.key(objectName)
.additionalRetentionPeriod(additionalSeconds)
.build();
cosClient.extendObjectRetention(request);
System.out.printf("Retention period extended on %s by %s seconds%n", objectName, additionalSeconds);
}
Wichtige Referenzen
Auflistung legaler Zugriffe auf ein geschütztes Objekt
Nach dem Ausführen dieser Operation wird Folgendes zurückgegeben:
- Objekterstellungsdatum
- Aufbewahrungsdauer des Objekts in Sekunden
- Berechnetes Ablaufdatum der Aufbewahrung basierend auf dem Zeitraum und dem Erstellungsdatum
- Liste der Beweissicherungsvermerke
- Kennung des Beweissicherungsvermerks
- Zeitmarke für Anwendung des Beweissicherungsvermerks
Wichtige Hinweise:
- Wenn das Objekt nicht legal gehalten wird, wird ein leeres
LegalHoldSetzurückgegeben - Wenn für das Objekt keine Aufbewahrungsfrist angegeben ist, wird ein Fehler
404zurückgegeben
public static void listLegalHoldsOnObject(String bucketName, String objectKey, S3Client cosClient) {
System.out.println("Listing legal holds for object: " + objectKey);
ListLegalHoldsRequest request = ListLegalHoldsRequest.builder()
.bucket(bucketName)
.key(objectKey)
.build();
ListLegalHoldsResponse response = cosClient.listLegalHolds(request);
for (LegalHold hold : response.legalHolds()) {
System.out.println("Legal Hold ID: " + hold.id());
System.out.println("Date: " + hold.date());
}
}
Löschen eines rechtlichen Zugriffs auf ein geschütztes Objekt
public static void deleteLegalHoldFromObject(String bucketName, String objectKey, String legalHoldId, S3Client cosClient) {
System.out.println("Deleting legal hold from object: " + objectKey);
DeleteLegalHoldRequest request = DeleteLegalHoldRequest.builder()
.bucket(bucketName)
.key(objectKey)
.legalHoldId(legalHoldId)
.build();
cosClient.deleteLegalHold(request);
System.out.println("Legal hold deleted!");
}
Wichtige Referenzen
Key Protect verwenden
Key Protect kann zu einem Speicherbucket hinzugefügt werden, um sensible ruhende Daten in der Cloud zu verschlüsseln.
Erstellen eines Eimers mit Key Protect
public static void createBucketWithKeyProtect(String bucketName, String kpRootKeyCrn, S3Client cosClient) {
System.out.println("Creating bucket with Key Protect: " + bucketName);
CreateBucketRequest request = CreateBucketRequest.builder()
.bucket(bucketName)
.ibmSSEKPEncryptionAlgorithm("AES256")
.ibmSSEKPCustomerRootKeyCrn(kpRootKeyCrn)
.build();
cosClient.createBucket(request);
System.out.println("Bucket created with Key Protect encryption!");
}
Hochladen eines Objekts in einen Key Protect aktivierten Bucket
public static void putObjectToKPBucket(String bucketName, String objectKey, String filePath, S3Client cosClient) {
System.out.println("Uploading object to Key Protect enabled bucket");
PutObjectRequest request = PutObjectRequest.builder()
.bucket(bucketName)
.key(objectKey)
.build();
cosClient.putObject(request, RequestBody.fromFile(new File(filePath)));
System.out.println("Object uploaded with Key Protect encryption!");
}
Größere Objekte mit einem Übertragungsmanager hochladen
Der Transfer Manager bietet eine einfache API zum Hoch- und Herunterladen von Objekten auf und von IBM Cloud Object Storage.
import com.ibm.cos.v2.transfer.s3.S3TransferManager;
import com.ibm.cos.v2.transfer.s3.model.*;
public static void uploadWithTransferManager(String bucketName, String objectKey, String filePath, S3Client cosClient) {
System.out.println("Uploading with Transfer Manager: " + objectKey);
// Create Transfer Manager
S3TransferManager transferManager = S3TransferManager.builder()
.s3Client(cosClient)
.build();
try {
// Upload file
UploadFileRequest uploadRequest = UploadFileRequest.builder()
.putObjectRequest(req -> req.bucket(bucketName).key(objectKey))
.source(Paths.get(filePath))
.build();
FileUpload upload = transferManager.uploadFile(uploadRequest);
// Wait for upload to complete
CompletedFileUpload completedUpload = upload.completionFuture().join();
System.out.println("Upload completed: " + completedUpload.response().eTag());
} finally {
transferManager.close();
}
}
Wichtige Referenzen
Metadaten aktualisieren
Aktualisierung von Metadaten zu einem bestehenden Objekt
public static void updateObjectMetadata(String bucketName, String objectKey, S3Client cosClient) {
System.out.println("Updating metadata for object: " + objectKey);
// Create new metadata
Map<String, String> newMetadata = new HashMap<>();
newMetadata.put("updated-by", "admin");
newMetadata.put("update-date", LocalDate.now().toString());
// Copy object to itself with new metadata
CopyObjectRequest request = CopyObjectRequest.builder()
.sourceBucket(bucketName)
.sourceKey(objectKey)
.destinationBucket(bucketName)
.destinationKey(objectKey)
.metadata(newMetadata)
.metadataDirective(MetadataDirective.REPLACE)
.build();
cosClient.copyObject(request);
System.out.println("Metadata updated!");
}
Wichtige Referenzen
Aspera-Hochgeschwindigkeitsübertragung verwenden
Aspera die Integration von Hochgeschwindigkeitsübertragungen ist über die Website IBM Aspera SDK möglich. Einzelheiten zur Integration mit IBM Cloud Object Storage finden Sie in der Dokumentation Aspera.
Für Java Anwendungen können Sie Aspera Transfer SDK zusammen mit dem IBM Cloud Object Storage SDK v2 für Hochgeschwindigkeitsübertragungen von großen Dateien verwenden.
Objektsperre verwenden
Mit der Objektsperre können Sie Objekte nach dem WORM-Modell (write-once-read-many) speichern. Mit der Objektsperre können Sie verhindern, dass Objekte für eine bestimmte Zeit oder auf unbestimmte Zeit gelöscht oder überschrieben werden.
Erstellen eines Buckets mit aktivierter Objektsperre
Die Objektsperre muss bei der Erstellung des Bereichs aktiviert werden und kann nicht zu einem bestehenden Bereich hinzugefügt werden.
public static void createBucketWithObjectLock(String bucketName, S3Client cosClient) {
System.out.println("Creating bucket with Object Lock: " + bucketName);
CreateBucketRequest request = CreateBucketRequest.builder()
.bucket(bucketName)
.objectLockEnabledForBucket(true)
.build();
cosClient.createBucket(request);
System.out.println("Bucket created with Object Lock enabled!");
}
Einstellen der Objektsperrenspeicherung für ein Objekt
Sie können für ein Objekt eine Aufbewahrungsfrist festlegen, um zu verhindern, dass es gelöscht oder überschrieben wird. Es stehen zwei Aufbewahrungsmodi zur Verfügung:
- COMPLIANCE: Das Objekt kann von keinem Benutzer, auch nicht vom Root-Benutzer, überschrieben oder gelöscht werden.
- GOVERNANCE: Benutzer mit besonderen Rechten können die Einstellungen für die Aufbewahrung ändern oder das Objekt löschen.
public static void putObjectRetention(String bucketName, String objectKey, S3Client cosClient) {
System.out.println("Setting object retention for: " + objectKey);
// Create retention period of 90 days
Instant retainUntil = Instant.now().plus(90, ChronoUnit.DAYS);
// Create object lock retention with COMPLIANCE mode
ObjectLockRetention retention = ObjectLockRetention.builder()
.mode(ObjectLockRetentionMode.COMPLIANCE)
.retainUntilDate(retainUntil)
.build();
// Apply retention to object
PutObjectRetentionRequest request = PutObjectRetentionRequest.builder()
.bucket(bucketName)
.key(objectKey)
.retention(retention)
.build();
cosClient.putObjectRetention(request);
System.out.println("Object retention set until: " + retainUntil);
}
Abrufen von Informationen zur Aufbewahrung von Objektsperren
public static void getObjectRetention(String bucketName, String objectKey, S3Client cosClient) {
System.out.println("Getting object retention for: " + objectKey);
GetObjectRetentionRequest request = GetObjectRetentionRequest.builder()
.bucket(bucketName)
.key(objectKey)
.build();
GetObjectRetentionResponse response = cosClient.getObjectRetention(request);
System.out.println("Retention Mode: " + response.retention().mode());
System.out.println("Retain Until: " + response.retention().retainUntilDate());
}
Einstellung Objektsperre legal halten
Ein rechtlicher Sperrvermerk bietet den gleichen Schutz wie eine Aufbewahrungsfrist, hat aber kein Verfallsdatum. Gesetzliche Sperrfristen bleiben in Kraft, bis sie ausdrücklich aufgehoben werden.
public static void putObjectLegalHold(String bucketName, String objectKey, S3Client cosClient) {
System.out.println("Setting legal hold on: " + objectKey);
ObjectLockLegalHold legalHold = ObjectLockLegalHold.builder()
.status(ObjectLockLegalHoldStatus.ON)
.build();
PutObjectLegalHoldRequest request = PutObjectLegalHoldRequest.builder()
.bucket(bucketName)
.key(objectKey)
.legalHold(legalHold)
.build();
cosClient.putObjectLegalHold(request);
System.out.println("Legal hold applied!");
}
Abrufen des Status der Objektsperre (legal hold)
public static void getObjectLegalHold(String bucketName, String objectKey, S3Client cosClient) {
System.out.println("Getting legal hold status for: " + objectKey);
GetObjectLegalHoldRequest request = GetObjectLegalHoldRequest.builder()
.bucket(bucketName)
.key(objectKey)
.build();
GetObjectLegalHoldResponse response = cosClient.getObjectLegalHold(request);
System.out.println("Legal Hold Status: " + response.legalHold().status());
}
Wichtige Referenzen
Eimer-Lebenszyklus-Konfiguration verwenden
Die Lebenszykluskonfiguration ermöglicht es Ihnen, Aktionen zu definieren, die IBM Cloud Object Storage auf eine Gruppe von Objekten anwendet. Sie können Lebenszyklusrichtlinien verwenden, um Objekte in verschiedene Speicherklassen zu überführen oder Objekte nach einer bestimmten Zeitspanne auslaufen zu lassen.
Einstellen einer Lebenszykluskonfiguration für einen Bucket
public static void putBucketLifecycle(String bucketName, S3Client cosClient) {
System.out.println("Setting lifecycle configuration on bucket: " + bucketName);
// Create a transition to move objects to GLACIER after 30 days
Transition transition = Transition.builder()
.days(30)
.storageClass(StorageClass.GLACIER)
.build();
// Create lifecycle rule filter
LifecycleRuleFilter ruleFilter = LifecycleRuleFilter.builder()
.prefix("archive/") // Apply to objects with this prefix
.build();
// Create lifecycle rule
LifecycleRule rule = LifecycleRule.builder()
.id("archive-old-objects")
.filter(ruleFilter)
.transitions(transition)
.status(ExpirationStatus.ENABLED)
.build();
// Create lifecycle configuration
BucketLifecycleConfiguration lifecycleConfig = BucketLifecycleConfiguration.builder()
.rules(rule)
.build();
// Apply lifecycle configuration to bucket
PutBucketLifecycleConfigurationRequest request = PutBucketLifecycleConfigurationRequest.builder()
.bucket(bucketName)
.lifecycleConfiguration(lifecycleConfig)
.build();
cosClient.putBucketLifecycleConfiguration(request);
System.out.println("Lifecycle configuration applied!");
}
Abrufen der Lebenszykluskonfiguration eines Eimers
public static void getBucketLifecycle(String bucketName, S3Client cosClient) {
System.out.println("Getting lifecycle configuration for bucket: " + bucketName);
GetBucketLifecycleConfigurationRequest request = GetBucketLifecycleConfigurationRequest.builder()
.bucket(bucketName)
.build();
GetBucketLifecycleConfigurationResponse response = cosClient.getBucketLifecycleConfiguration(request);
System.out.println("Found " + response.rules().size() + " lifecycle rules:");
for (LifecycleRule rule : response.rules()) {
System.out.println(" Rule ID: " + rule.id());
System.out.println(" Status: " + rule.status());
if (rule.hasTransitions()) {
for (Transition t : rule.transitions()) {
System.out.println(" Transition after " + t.days() + " days to " + t.storageClass());
}
}
}
}
Löschen der Lebenszykluskonfiguration eines Buckets
public static void deleteBucketLifecycle(String bucketName, S3Client cosClient) {
System.out.println("Deleting lifecycle configuration from bucket: " + bucketName);
DeleteBucketLifecycleRequest request = DeleteBucketLifecycleRequest.builder()
.bucket(bucketName)
.build();
cosClient.deleteBucketLifecycle(request);
System.out.println("Lifecycle configuration deleted!");
}
Wichtige Referenzen
Versionierung von Eimern verwenden
Die Versionierung ermöglicht es Ihnen, mehrere Versionen eines Objekts im selben Bucket zu speichern. Dies kann Ihnen helfen, unbeabsichtigte Benutzeraktionen und Anwendungsfehler zu beheben.
Versionierung für einen Bucket aktivieren
public static void enableBucketVersioning(String bucketName, S3Client cosClient) {
System.out.println("Enabling versioning on bucket: " + bucketName);
VersioningConfiguration versioningConfig = VersioningConfiguration.builder()
.status(BucketVersioningStatus.ENABLED)
.build();
PutBucketVersioningRequest request = PutBucketVersioningRequest.builder()
.bucket(bucketName)
.versioningConfiguration(versioningConfig)
.build();
cosClient.putBucketVersioning(request);
System.out.println("Versioning enabled!");
}
Status der Bucketversionierung abrufen
public static void getBucketVersioning(String bucketName, S3Client cosClient) {
System.out.println("Getting versioning status for bucket: " + bucketName);
GetBucketVersioningRequest request = GetBucketVersioningRequest.builder()
.bucket(bucketName)
.build();
GetBucketVersioningResponse response = cosClient.getBucketVersioning(request);
System.out.println("Versioning Status: " + response.status());
}
Auflistung der Objektversionen
public static void listObjectVersions(String bucketName, S3Client cosClient) {
System.out.println("Listing object versions in bucket: " + bucketName);
ListObjectVersionsRequest request = ListObjectVersionsRequest.builder()
.bucket(bucketName)
.build();
ListObjectVersionsResponse response = cosClient.listObjectVersions(request);
System.out.println("Versions:");
for (ObjectVersion version : response.versions()) {
System.out.println(" Key: " + version.key());
System.out.println(" Version ID: " + version.versionId());
System.out.println(" Is Latest: " + version.isLatest());
System.out.println(" Last Modified: " + version.lastModified());
System.out.println();
}
}
Löschung einer bestimmten Objektversion
public static void deleteObjectVersion(String bucketName, String objectKey, String versionId, S3Client cosClient) {
System.out.println("Deleting version " + versionId + " of object: " + objectKey);
DeleteObjectRequest request = DeleteObjectRequest.builder()
.bucket(bucketName)
.key(objectKey)
.versionId(versionId)
.build();
cosClient.deleteObject(request);
System.out.println("Object version deleted!");
}
Wichtige Referenzen
- VersioningConfiguration.builder
- PutBucketVersioningRequest.builder
- ListObjectVersionsRequest.builder
Erweitertes Bucket Listing verwenden
IBM Cloud Object Storage bietet eine erweiterte Auflistungs-API, die zusätzliche Metadaten über Buckets zurückgibt, einschließlich Informationen zu Standort und Speicherklasse.
public static void listBucketsExtended(S3Client cosClient) {
System.out.println("Listing buckets with extended information:");
ListBucketsExtendedRequest request = ListBucketsExtendedRequest.builder().build();
ListBucketsExtendedResponse response = cosClient.listBucketsExtended(request);
for (Bucket bucket : response.buckets()) {
System.out.println("Bucket Name: " + bucket.name());
System.out.println(" Creation Date: " + bucket.creationDate());
// Extended metadata (IBM-specific)
if (bucket.locationConstraint() != null) {
System.out.println(" Location: " + bucket.locationConstraint());
}
}
}
Wichtige Referenzen
Verwendung von Archive Tier und Object Restoration
IBM Cloud Object Storage bietet Archivspeicherklassen (Glacier) für die langfristige Datenspeicherung zu geringeren Kosten. Objekte im Archivspeicher müssen wiederhergestellt werden, bevor auf sie zugegriffen werden kann.
Überführung von Objekten in den Archivspeicher
Sie können Lebenszyklusrichtlinien verwenden, um Objekte nach einer bestimmten Zeitspanne automatisch in den Archivspeicher zu überführen.
public static void setArchiveRule(String bucketName, S3Client cosClient) {
System.out.println("Setting archive rule on bucket: " + bucketName);
// Create transition to Glacier after 30 days
Transition transition = Transition.builder()
.days(30)
.storageClass(StorageClass.GLACIER)
.build();
// Create lifecycle rule
LifecycleRuleFilter filter = LifecycleRuleFilter.builder()
.prefix("archive/")
.build();
LifecycleRule rule = LifecycleRule.builder()
.id("archive-rule")
.filter(filter)
.transitions(transition)
.status(ExpirationStatus.ENABLED)
.build();
// Apply lifecycle configuration
BucketLifecycleConfiguration config = BucketLifecycleConfiguration.builder()
.rules(rule)
.build();
PutBucketLifecycleConfigurationRequest request = PutBucketLifecycleConfigurationRequest.builder()
.bucket(bucketName)
.lifecycleConfiguration(config)
.build();
cosClient.putBucketLifecycleConfiguration(request);
System.out.println("Archive rule configured!");
}
Wiederherstellung eines archivierten Objekts
Objekte im Archivspeicher müssen wiederhergestellt werden, bevor sie heruntergeladen werden können. Sie können die Anzahl der Tage angeben, die die wiederhergestellte Kopie verfügbar sein muss.
public static void restoreArchivedObject(String bucketName, String objectKey, int days, S3Client cosClient) {
System.out.println("Restoring archived object: " + objectKey);
// Create restore request with duration
RestoreRequest restoreRequest = RestoreRequest.builder()
.days(days)
.glacierJobParameters(GlacierJobParameters.builder()
.tier(Tier.STANDARD) // Options: STANDARD (12 hours), EXPEDITED (2 hours), BULK (5-12 hours)
.build())
.build();
RestoreObjectRequest request = RestoreObjectRequest.builder()
.bucket(bucketName)
.key(objectKey)
.restoreRequest(restoreRequest)
.build();
cosClient.restoreObject(request);
System.out.println("Restore initiated. Object will be available for " + days + " days once restored.");
}
Überprüfung des Wiederherstellungsstatus
public static void checkRestoreStatus(String bucketName, String objectKey, S3Client cosClient) {
System.out.println("Checking restore status for: " + objectKey);
HeadObjectRequest request = HeadObjectRequest.builder()
.bucket(bucketName)
.key(objectKey)
.build();
HeadObjectResponse response = cosClient.headObject(request);
if (response.restore() != null) {
System.out.println("Restore Status: " + response.restore());
// Parse restore status
String restoreStatus = response.restore();
if (restoreStatus.contains("ongoing-request=\"true\"")) {
System.out.println("Restoration in progress...");
} else if (restoreStatus.contains("ongoing-request=\"false\"")) {
System.out.println("Object has been restored and is available for download");
}
} else {
System.out.println("Object is not archived or no restore in progress");
}
}
Beschleunigte Archivrecherche
IBM Cloud Object Storage unterstützt den beschleunigten Archivabruf für einen schnelleren Zugriff auf archivierte Daten:
- Expedited: 2 Stunden Abrufzeit
- Standard: 3-5 Stunden Abrufzeit (Standard)
- Bulk: 5-12 Stunden Abrufzeit (niedrigste Kosten)
public static void restoreWithExpeditedRetrieval(String bucketName, String objectKey, S3Client cosClient) {
System.out.println("Restoring with expedited retrieval: " + objectKey);
RestoreRequest restoreRequest = RestoreRequest.builder()
.days(1)
.glacierJobParameters(GlacierJobParameters.builder()
.tier(Tier.EXPEDITED) // 2-hour retrieval
.build())
.build();
RestoreObjectRequest request = RestoreObjectRequest.builder()
.bucket(bucketName)
.key(objectKey)
.restoreRequest(restoreRequest)
.build();
cosClient.restoreObject(request);
System.out.println("Expedited restore initiated (2-hour retrieval)");
}
Wichtige Referenzen
Verwendung von CORS (Ursprungsübergreifende Ressourcennutzung)
CORS konfiguration ermöglicht es Webanwendungen, die in einer Domäne laufen, auf Ressourcen in IBM Cloud Object Storage aus einer anderen Domäne zuzugreifen.
Einstellen der CORS Konfiguration für einen Bucket
public static void setCorsConfiguration(String bucketName, S3Client cosClient) {
System.out.println("Setting CORS configuration on bucket: " + bucketName);
// Create CORS rule
CORSRule corsRule = CORSRule.builder()
.allowedMethods("GET", "PUT", "POST", "DELETE")
.allowedOrigins("https://example.com")
.allowedHeaders("*")
.maxAgeSeconds(3000)
.exposeHeaders("ETag", "x-amz-request-id")
.build();
// Create CORS configuration
CORSConfiguration corsConfig = CORSConfiguration.builder()
.corsRules(corsRule)
.build();
PutBucketCorsRequest request = PutBucketCorsRequest.builder()
.bucket(bucketName)
.corsConfiguration(corsConfig)
.build();
cosClient.putBucketCors(request);
System.out.println("CORS configuration applied!");
}
Abrufen der CORS Konfiguration
public static void getCorsConfiguration(String bucketName, S3Client cosClient) {
System.out.println("Getting CORS configuration for bucket: " + bucketName);
GetBucketCorsRequest request = GetBucketCorsRequest.builder()
.bucket(bucketName)
.build();
GetBucketCorsResponse response = cosClient.getBucketCors(request);
System.out.println("CORS Rules:");
for (CORSRule rule : response.corsRules()) {
System.out.println(" Allowed Methods: " + rule.allowedMethods());
System.out.println(" Allowed Origins: " + rule.allowedOrigins());
System.out.println(" Allowed Headers: " + rule.allowedHeaders());
System.out.println(" Max Age: " + rule.maxAgeSeconds());
}
}
Löschen der Konfiguration von CORS
public static void deleteCorsConfiguration(String bucketName, S3Client cosClient) {
System.out.println("Deleting CORS configuration from bucket: " + bucketName);
DeleteBucketCorsRequest request = DeleteBucketCorsRequest.builder()
.bucket(bucketName)
.build();
cosClient.deleteBucketCors(request);
System.out.println("CORS configuration deleted!");
}
Wichtige Referenzen
Verwendung von Bucket Policies
Bereichsrichtlinien ermöglichen die Verwaltung der Zugriffskontrolle für Bereiche und Objekte. Sie sind in JSON geschrieben und können Benutzern und Diensten Berechtigungen erteilen oder verweigern.
Festlegen einer Schaufelpolitik
public static void setBucketPolicy(String bucketName, S3Client cosClient) {
System.out.println("Setting bucket policy on: " + bucketName);
// Create policy document (JSON format)
String policyText = "{"
+ "\"Version\": \"2012-10-17\","
+ "\"Statement\": [{"
+ " \"Effect\": \"Allow\","
+ " \"Principal\": {\"AWS\": \"*\"},"
+ " \"Action\": \"s3:GetObject\","
+ " \"Resource\": \"arn:aws:s3:::" + bucketName + "/*\""
+ "}]"
+ "}";
PutBucketPolicyRequest request = PutBucketPolicyRequest.builder()
.bucket(bucketName)
.policy(policyText)
.build();
cosClient.putBucketPolicy(request);
System.out.println("Bucket policy applied!");
}
Abschluss einer Eimerpolice
public static void getBucketPolicy(String bucketName, S3Client cosClient) {
System.out.println("Getting bucket policy for: " + bucketName);
GetBucketPolicyRequest request = GetBucketPolicyRequest.builder()
.bucket(bucketName)
.build();
GetBucketPolicyResponse response = cosClient.getBucketPolicy(request);
System.out.println("Policy: " + response.policy());
}
Löschen einer Bucket-Policy
public static void deleteBucketPolicy(String bucketName, S3Client cosClient) {
System.out.println("Deleting bucket policy from: " + bucketName);
DeleteBucketPolicyRequest request = DeleteBucketPolicyRequest.builder()
.bucket(bucketName)
.build();
cosClient.deleteBucketPolicy(request);
System.out.println("Bucket policy deleted!");
}
Wichtige Referenzen
Erstellen einer gehosteten statischen Website
IBM Cloud Object Storage unterstützt das Hosting statischer Websites direkt aus Buckets. Sie können einen Bucket für die Bereitstellung statischer Inhalte konfigurieren, indem Sie ein Indexdokument und ein Fehlerdokument angeben.
Dieser Vorgang erfordert die folgende Importanweisung:
import com.ibm.cos.v2.services.s3.model.BucketWebsiteConfiguration;
Konfiguration der Bucket-Website
Dieser Vorgang bietet nach der Konfiguration die folgenden Möglichkeiten und erfordert einen korrekt konfigurierten Client:
- Bucket-Konfiguration für Suffix (Indexdokument)
- Eimerkonfiguration für Schlüssel (Fehlerdokument)
public static void setBucketWebsiteConfiguration(String bucketName, S3Client cosClient) {
System.out.println("Setting website configuration for bucket: " + bucketName);
// Create website configuration with index and error documents
IndexDocument indexDocument = IndexDocument.builder()
.suffix("index.html")
.build();
ErrorDocument errorDocument = ErrorDocument.builder()
.key("error.html")
.build();
WebsiteConfiguration websiteConfig = WebsiteConfiguration.builder()
.indexDocument(indexDocument)
.errorDocument(errorDocument)
.build();
PutBucketWebsiteRequest request = PutBucketWebsiteRequest.builder()
.bucket(bucketName)
.websiteConfiguration(websiteConfig)
.build();
cosClient.putBucketWebsite(request);
System.out.println("Website configuration set successfully!");
}
Konfiguration der Bucket-Website
public static void getBucketWebsiteConfiguration(String bucketName, S3Client cosClient) {
System.out.println("Getting website configuration for bucket: " + bucketName);
GetBucketWebsiteRequest request = GetBucketWebsiteRequest.builder()
.bucket(bucketName)
.build();
GetBucketWebsiteResponse response = cosClient.getBucketWebsite(request);
System.out.println("Index Document: " + response.indexDocument().suffix());
System.out.println("Error Document: " + response.errorDocument().key());
}
Löschen der Bucket-Website-Konfiguration
public static void deleteBucketWebsiteConfiguration(String bucketName, S3Client cosClient) {
System.out.println("Deleting website configuration from bucket: " + bucketName);
DeleteBucketWebsiteRequest request = DeleteBucketWebsiteRequest.builder()
.bucket(bucketName)
.build();
cosClient.deleteBucketWebsite(request);
System.out.println("Website configuration deleted!");
}
Wichtige Referenzen
Fehlerbehandlung und bewährte Praktiken
Behandlung von SDK-Ausnahmen
Das v2 SDK verwendet spezifische Ausnahmetypen für verschiedene Fehlerszenarien.
import com.ibm.cos.v2.services.s3.model.S3Exception;
import com.ibm.cos.v2.services.s3.model.NoSuchBucketException;
import com.ibm.cos.v2.services.s3.model.NoSuchKeyException;
public static void handleExceptions(String bucketName, String objectKey, S3Client cosClient) {
try {
GetObjectRequest request = GetObjectRequest.builder()
.bucket(bucketName)
.key(objectKey)
.build();
cosClient.getObject(request, ResponseTransformer.toBytes());
} catch (NoSuchBucketException e) {
System.err.println("Bucket does not exist: " + bucketName);
System.err.println("Error Code: " + e.awsErrorDetails().errorCode());
} catch (NoSuchKeyException e) {
System.err.println("Object does not exist: " + objectKey);
System.err.println("Error Code: " + e.awsErrorDetails().errorCode());
} catch (S3Exception e) {
System.err.println("S3 Error: " + e.awsErrorDetails().errorMessage());
System.err.println("Error Code: " + e.awsErrorDetails().errorCode());
System.err.println("Status Code: " + e.statusCode());
} catch (Exception e) {
System.err.println("Unexpected error: " + e.getMessage());
}
}
Bewährte Verfahren für v2 SDK
- Wiederverwendung von S3Client Instanzen: Das Erstellen von Clients ist teuer. Verwenden Sie sie für mehrere Anfragen.
// Good: Create once, reuse
S3Client client = S3Client.builder()
.endpointOverride(URI.create(endpoint))
.credentialsProvider(StaticCredentialsProvider.create(credentials))
.region(Region.of(region))
.build();
// Use client for multiple operations
client.listBuckets();
client.putObject(...);
client.getObject(...);
// Close when done
client.close();
- Verwenden Sie try-with-resources: Stellen Sie sicher, dass die Ressourcen ordnungsgemäß bereinigt werden.
try (S3Client client = S3Client.builder()
.endpointOverride(URI.create(endpoint))
.credentialsProvider(StaticCredentialsProvider.create(credentials))
.region(Region.of(region))
.build()) {
// Perform operations
client.listBuckets();
} // Client automatically closed
-
Verarbeiten Sie große Dateien mit mehrteiligen Uploads: Verwenden Sie für Dateien über 5 MB mehrteilige Uploads.
-
Verwenden Sie Transfer Manager für große Übertragungen: Bietet einen automatischen Upload mit mehreren Teilen, Wiederholungslogik und Fortschrittsverfolgung.
-
Legen Sie geeignete Timeouts fest: Konfigurieren Sie Client-Zeitüberschreitungen für Ihren Anwendungsfall.
S3Client client = S3Client.builder()
.endpointOverride(URI.create(endpoint))
.credentialsProvider(StaticCredentialsProvider.create(credentials))
.region(Region.of(region))
.overrideConfiguration(ClientOverrideConfiguration.builder()
.apiCallTimeout(Duration.ofMinutes(5))
.apiCallAttemptTimeout(Duration.ofMinutes(2))
.build())
.build();
Wichtige Referenzen
Zusätzliche Ressourcen
Hilfe anfordern
- Stellen Sie Fragen auf Stack Overflow mit den Tags
ibmundobject-storage - Eröffnen Sie ein Support-Ticket bei IBM Cloud Support
- Berichten Sie Fehler oder beantragen Sie Funktionen auf GitHub Issues
Diese Dokumentation enthält die Struktur und SDK-Referenzen für IBM Cloud Object Storage Java SDK v2. Vollständige, funktionierende Code-Beispiele für alle Vorgänge finden Sie im Verzeichnis examples und im Migration Guide im Repository GitHub.