Utilisation de Java V2
Le SDK IBM Cloud® Object Storage pour Java v2 fournit des fonctionnalités permettant de tirer le meilleur parti de IBM Cloud Object Storage.
Le SDK IBM Cloud Object Storage pour Java v2 est complet, avec de nombreuses fonctionnalités et capacités qui dépassent la portée et l'espace de ce guide. Pour une documentation détaillée des classes et des méthodes, voir la documentation de référence de l'API Java. Le code source se trouve dans le référentiel GitHub.
Quoi de neuf dans v2
Le SDK IBM Cloud Object Storage pour Java v2 est une version modernisée qui repose sur l'architecture du SDK AWS v2 et apporte des améliorations significatives :
- Constructeurs immuables: Tous les objets de demande et de réponse utilisent des modèles de construction immuables pour une meilleure sécurité des threads
- Structure moderne des paquets: Nouvel espace de noms
com.ibm.cos.v2.*avec une organisation plus propre - Support asynchrone amélioré: Introduction de
S3AsyncClientpour les opérations non bloquantes - Streaming amélioré: Meilleures API de diffusion en continu avec
RequestBodyetResponseTransformer - Gestion automatique des jetons IAM: Le SDK gère automatiquement le rafraîchissement des jetons IAM
- Sécurité des types: Vérification améliorée des types à la compilation avec les constructeurs
- Pile moderne HTTP: Prise en charge de Apache HTTP Client et Netty pour les opérations asynchrones
Pour les développeurs qui migrent de v1, voir le guide de migration.
Obtention du SDK
La manière la plus simple d'utiliser le IBM Cloud Object Storage Java SDK v2 est d'utiliser Maven pour gérer les dépendances. Si vous n'êtes pas familier avec Maven, vous pouvez vous lancer en utilisant le guide Maven en 5 minutes.
Maven utilise un fichier nommé pom.xml pour spécifier les bibliothèques (et leurs versions) nécessaires pour un projet Java. Voici un exemple de fichier pom.xml permettant d'utiliser le SDK IBM Cloud Object Storage
Java v2 pour se connecter à 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>
Références SDK
Classes centrales (core)
- S3Client- Client synchrone S3
- S3AsyncClient- Client asynchrone S3
- S3ClientBuilder- Constructeur pour le client S3
Données d'identification
- AwsCredentials- Interface d'identification de base
- BasicIBMOAuthCredentials- IBM Informations d'identification IAM
- AwsBasicCredentials- Informations d'identification HMAC
- StaticCredentialsProvider- Fournisseur d'identifiants statiques
- AwsCredentialsProvider- Interface du fournisseur d'informations d'identification
Configuration
- Région- AWS représentation de la région
- ClientOverrideConfiguration- Remplacement de la configuration du client
- S3Configuration- S3-specific configuration
Diffusion en flux
- RequestBody- Corps de la demande pour les téléchargements
- ResponseTransformer- Transformateur de réponse pour les téléchargements
- ResponseInputStream- Réponse au flux d'entrée
Exceptions
- S3Exception- Base S3 exception
- NoSuchBucketException- Bucket non trouvé
- NoSuchKeyException- Objet non trouvé
- SdkClientException- Exception côté client
Création d'un client et sourçage de données d'identification
Dans l'exemple ci-après, un client cos est créé et configuré en fournissant des données d'identification (clé d'API et ID d'instance de service). Ces valeurs peuvent aussi être automatiquement sourcées à partir d'un fichier de données
d'identification ou à partir de variables d'environnement.
Après avoir généré des données d'identification de service, le document JSON résultant peut être sauvegardé dans ~/.bluemix/cos_credentials.
Le SDK source automatiquement les données d'identification de ce fichier, sauf si d'autres données d'identification sont explicitement définies lors de la création du client. Si le fichier cos_credentials contient des clés HMAC,
le client s'authentifie à l'aide d'une signature, sinon, il utilise la clé d'API fournie pour s'authentifier à l'aide d'un jeton bearer.
Si vous effectuez une migration à partir de AWS S3, vous pouvez également sourcer des données d'identification à partir de ~/.aws/credentials au format suivant :
[default]
aws_access_key_id = {API_KEY}
aws_secret_access_key = {SERVICE_INSTANCE_ID}
Si ~/.bluemix/cos_credentials et ~/.aws/credentials existent tous les deux, cos_credentials est prioritaire.
Pour plus de détails sur la construction des clients, voir la documentation de référence de l'API Java.
Exemples de code
Commençons par un exemple complet de classe qui présente quelques fonctionnalités de base. Cette classe CosExample répertorie les objets d'un seau existant, crée un nouveau seau, puis répertorie tous les seaux de l'instance de service.
Collecte des informations requises
bucketNameetnewBucketNamesont des chaînes uniques et sécurisées DNS. Etant donné que les noms de compartiment sont uniques sur l'ensemble du système, ces valeurs devront être modifiées si cet exemple est exécuté plusieurs fois. Les noms sont réservés pendant 10 à 15 minutes après la suppression.apiKeyest la valeur trouvée dans le justificatif de service à l'adresseapikey.serviceInstanceIdest la valeur trouvée dans le justificatif de service à l'adresseresource_instance_id.endpointUrlest un point d'aboutissement du service URL, y compris le protocolehttps://. Il ne s'agit pas de la valeurendpointsqui est trouvée dans les données d'identification de service. Pour plus d'informations sur les noeuds finaux, voir Noeuds finaux et emplacements de stockage.locationdoit correspondre à la partie de l'adressestorageClass. Pourus-south-standard, il s'agira deus-south. Cette variable est utilisée uniquement pour le calcul des signatures HMAC, mais elle est requise pour tous les clients, dont cet exemple qui utilise une clé d'API IAM.
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());
}
}
}
Références clés
Détermination de noeud final
Pour plus d'informations sur les noeuds finaux, voir Noeuds finaux et emplacements de stockage.
Les points d'arrivée suivent ce modèle : https://s3.{region}.cloud-object-storage.appdomain.cloud
Exemples :
- États-Unis Sud :
https://s3.us-south.cloud-object-storage.appdomain.cloud - États-Unis Est :
https://s3.us-east.cloud-object-storage.appdomain.cloud - UE Grande-Bretagne :
https://s3.eu-gb.cloud-object-storage.appdomain.cloud
Création d'un nouveau compartiment
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!");
}
Référence de clé
Création d'un compartiment avec une classe de stockage différente
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!");
}
Les options de la classe de stockage comprennent :
us-south-standard/us-east-standard/eu-gb-standard- Stockage standardus-south-vault/us-east-vault/eu-gb-vault- Stockage en chambre forteus-south-cold/us-east-cold/eu-gb-cold- Stockage en chambre froideus-south-flex/us-east-flex/eu-gb-flex- Stockage flexible
Référence de clé
Création d'un nouveau fichier texte
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!");
}
Références clés
Envoi par téléchargement d'un objet à partir d'un fichier
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!");
}
Références clés
Envoi par téléchargement d'un objet à l'aide d'un flux
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!");
}
Références clés
Réception par téléchargement d'un objet dans un fichier
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);
}
Références clés
Réception par téléchargement d'un objet à l'aide d'un flux
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!");
}
Références clés
Copie d'objets
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!");
}
Références clés
Création de la liste des compartiments disponibles
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());
}
}
Références clés
Obtention du contenu de fichier d'un élément particulier
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());
}
}
Références clés
Suppression d'un élément d'un compartiment
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!");
}
Références clés
Suppression de plusieurs éléments d'un compartiment
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!");
}
Références clés
Suppression d'un compartiment
Le seau doit être vide avant d'être supprimé.
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!");
}
Références clés
Procédure permettant de vérifier si un objet est accessible en lecture par le public
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;
}
}
Références clés
Exécution d'un envoi par téléchargement en plusieurs parties
Lorsque vous gérez des objets volumineux, il est recommandé d'utiliser des opérations d'envoi par téléchargement en plusieurs parties pour écrire ces objets dans IBM Cloud Object Storage. L'envoi par téléchargement d'un objet peut être effectué sous la forme d'un ensemble de parties et ces parties peuvent être envoyées par téléchargement indépendamment dans n'importe quel ordre et en parallèle. Une fois l'exécution de l'envoi par téléchargement terminée, IBM Cloud Object Storage présente toutes les parties en tant qu'objet unique.
Les envois par téléchargement en plusieurs parties ne sont disponibles que pour les objets de plus de 5 Mo. Pour les objets de moins de 50 Go, il est recommandé d'utiliser une taille de partie comprise entre 20 Mo et 100 Mo afin d'optimiser les performances. Pour les objets plus volumineux, la taille des parties peut être augmentée sans que cela ait un impact significatif sur les performances.
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);
}
Références clés
Utilisation d'Immutable Object Storage
Les utilisateurs peuvent configurer les buckets avec une politique Immutable Object Storage pour empêcher les objets d'être modifiés ou supprimés pendant une période définie. La période de rétention peut être spécifiée pour chaque objet, ou les objets peuvent hériter d'une période de rétention par défaut définie sur le seau.
Ajout d'une configuration de protection à un seau
Cette implémentation de l'opération PUT utilise le paramètre de requête protection pour définir les paramètres de conservation d'un compartiment existant. Cette opération vous permet de définir ou modifier la période
de conservation minimale, par défaut et maximale. Cette opération vous permet également de modifier l'état de protection du compartiment.
Les objets écrits dans un compartiment protégé ne peuvent pas être supprimés tant que la période de protection n'est pas arrivée à expiration et que les conservations légales associées à l'objet n'ont pas toutes été retirées. La valeur de conservation par défaut du compartiment est attribuée à un objet, sauf si une valeur spécifique à l'objet est fournie lors de la création de l'objet. Les objets contenus dans les buckets protégés qui ne sont plus sous rétention (la période de rétention a expiré et l'objet n'a pas de rétention légale), lorsqu'ils sont écrasés, seront à nouveau sous rétention. La nouvelle durée de conservation peut être fournie dans la demande d'écrasement de l'objet ou bien la durée de conservation par défaut du compartiment est attribuée à l'objet.
Les valeurs minimales et maximales prises en charge pour les paramètres de la période de conservation MinimumRetention, DefaultRetention et MaximumRetention sont un minimum de 0 jour et un maximum de 365243
jours (1000 ans).
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!");
}
Obtenir la configuration de la protection d'un seau
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());
}
Téléchargement d'un objet protégé avec rétention
Les objets contenus dans les buckets protégés qui ne sont plus sous rétention (la période de rétention a expiré et l'objet n'a pas de rétention légale), lorsqu'ils sont écrasés, seront à nouveau sous rétention. La nouvelle durée de conservation peut être fournie dans la demande d'écrasement de l'objet ou bien la durée de conservation par défaut du compartiment est attribuée à l'objet.
Vous pouvez spécifier des paramètres de rétention lorsque vous téléchargez des objets dans des godets protégés en utilisant des en-têtes personnalisés :
| En-tête | Type | Description |
|---|---|---|
Retention-Period |
Nombre entier non négatif (secondes) | Durée de conservation, exprimée en secondes, pendant laquelle stocker l'objet. L'objet ne peut être ni écrasé, ni supprimé tant que la durée de conservation n'est pas écoulée. Si ce champ et Retention-Expiration-Date sont
spécifiés, une erreur 400 est renvoyée. Si aucune de ces deux zones n'est spécifiée, la durée de conservation par défaut du compartiment est utilisée. Zéro (0) est une valeur légale si la durée de conservation minimale du seau est également
de 0. |
Retention-Expiration-Date |
Date (format ISO 8601) | La date à laquelle il est légal de supprimer ou de modifier l'objet. Vous ne pouvez spécifier que cet en-tête ou l'en-tête Retention-Period. Si les deux sont spécifiés, une erreur 400 sera renvoyée. Si aucune de ces deux zones
n'est spécifiée, la durée de conservation par défaut du compartiment est utilisée. |
Retention-Legal-Hold-Id |
chaîne | Conservation légale unique à appliquer à l'objet. Un bloc juridique est une chaîne de caractères longue de Y caractères. L'objet ne peut être ni écrasé ni supprimé tant que les conservations légales associées à l'objet n'ont pas toutes été retirées. |
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");
}
Remarques importantes :
- Vous ne pouvez pas spécifier
Retention-PeriodetRetention-Expiration-Datedans la même demande. - Si aucun paramètre de rétention n'est spécifié, la période de rétention par défaut du seau est appliquée.
- Les détentions légales peuvent être combinées avec des périodes de conservation.
- Les objets conservés ou faisant l'objet d'une rétention légale ne peuvent être supprimés ou écrasés avant l'expiration de la rétention et la levée de toutes les retenues légales.
Références clés
Ajout d'une retenue légale à un objet protégé
L'objet peut prendre en charge 100 conservations légales :
Un identifiant de retenue légale est une chaîne de caractères d'une longueur maximale de 64 caractères et d'une longueur minimale de 1 caractère. Les caractères valables sont les lettres, les chiffres, !, _, .,
*, (, ), -, et '. Si la tentative d'ajout de la conservation légale spécifiée dépasse le seuil de 100 conservations légales affectées à l'objet, l'opération d'ajout échoue et
un code d'erreur 400 est renvoyé. Si un identifiant est trop long, il ne sera pas ajouté à l'objet et une erreur 400 sera renvoyée. Si un identificateur contient des caractères non valides, il n'est pas ajouté à l'objet
et un code d'erreur 400 est renvoyé. Si un identificateur est déjà en cours d'utilisation sur un objet, la conservation légale existante n'est pas modifiée et la réponse indique que l'identificateur était déjà utilisé et renvoie
un code d'erreur 409. Si un objet ne comporte pas de métadonnées de durée de conservation, un code d'erreur 400 est renvoyé et l'ajout ou le retrait d'une conservation légale ne sont pas autorisés. La présence d'un
en-tête de durée de conservation est obligatoire, sinon, une erreur 400 est renvoyée.
L'utilisateur qui effectue l'ajout ou la suppression d'une conservation légale doit disposer des droits d'accès Manager pour ce compartiment.
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!");
}
Prolongation de la durée de conservation d'un objet protégé
La durée de conservation d'un objet ne peut être que prolongée. La valeur actuellement configurée ne peut pas être diminuée.
La valeur de prolongement de la conservation est définie de l'une des trois façons suivantes :
- Temps supplémentaire à partir de la valeur actuelle (
additionalRetentionPeriodou méthode similaire) - Nouvelle période de prolongation en secondes (
extendRetentionFromCurrentTimeou méthode similaire) - Nouvelle date d'expiration de la conservation de l'objet (
newRetentionExpirationDateou méthode similaire)
La durée de conservation en cours qui est stockée dans les métadonnées de l'objet est soit augmentée de la durée prolongée indiquée, soit remplacée par la nouvelle valeur, en fonction du paramètre défini dans la demande extendRetention.
Dans tous les cas, le paramètre de conservation étendu est comparé au délai de conservation actuel et le paramètre étendu n'est accepté que si le délai de conservation actualisé est supérieur au délai de conservation actuel.
Les objets contenus dans les buckets protégés qui ne sont plus sous rétention (la période de rétention a expiré et l'objet n'a pas de rétention légale), lorsqu'ils sont écrasés, seront à nouveau sous rétention. La nouvelle durée de conservation peut être fournie dans la demande d'écrasement de l'objet ou bien la durée de conservation par défaut du compartiment est attribuée à l'objet.
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);
}
Références clés
Liste des retenues légales sur un objet protégé
Cette opération renvoie les éléments suivants :
- La date de création de l'objet
- La durée de conservation, exprimée en secondes
- Calcul de la date d'expiration de la rétention en fonction de la période et de la date de création
- La liste des conservations légales
- L'identificateur de conservation légale
- L'horodatage correspondant à l'application de la conservation légale
Remarques importantes :
- S'il n'y a pas de prise légale sur l'objet, une adresse
LegalHoldSetvide est renvoyée - Si aucun délai de conservation n'est spécifié pour l'objet, une erreur
404est renvoyée
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());
}
}
Suppression d'un lien juridique sur un objet protégé
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!");
}
Références clés
Utilisation de Key Protect
Key Protect peut être ajouté à un compartiment de stockage pour chiffrer les données sensibles qui sont au repos dans le cloud.
Création d'un seau avec 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!");
}
Téléchargement d'un objet dans un panier activé par Key Protect
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!");
}
Envoi par téléchargement d'objets plus volumineux à l'aide d'une classe TransferManager
Le gestionnaire de transfert fournit une API simple pour télécharger des objets vers et depuis 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();
}
}
Références clés
Mise à jour des métadonnées
Mise à jour des métadonnées d'un objet existant
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!");
}
Références clés
Utilisation du Transfert haut débit Aspera
Aspera l'intégration des transferts à grande vitesse est disponible sur le site IBM Aspera SDK. Reportez-vous à la documentation de Aspera pour plus de détails sur l'intégration avec IBM Cloud Object Storage.
Pour les applications Java, vous pouvez utiliser Aspera Transfer SDK avec le SDK IBM Cloud Object Storage v2 pour des transferts à grande vitesse de fichiers volumineux.
Utilisation du verrouillage d'objet
Object Lock vous permet de stocker des objets en utilisant un modèle WORM (write-once-read-many). Le verrouillage d'objet permet d'empêcher la suppression ou l'écrasement d'objets pendant une durée déterminée ou indéterminée.
Création d'un seau avec verrouillage d'objet activé
Le verrouillage d'objet doit être activé au moment de la création du seau et ne peut pas être ajouté à un seau existant.
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!");
}
Définition de la rétention du verrouillage d'un objet
Vous pouvez définir la rétention d'un objet afin d'éviter qu'il ne soit supprimé ou écrasé. Deux modes de rétention sont disponibles :
- CONFORMITÉ: L'objet ne peut être écrasé ou supprimé par aucun utilisateur, y compris l'utilisateur root.
- GOUVERNANCE: Les utilisateurs disposant d'autorisations spéciales peuvent modifier les paramètres de conservation ou supprimer l'objet.
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);
}
Obtenir des informations sur la conservation des verrous d'objets
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());
}
Paramétrage du verrouillage de l'objet maintien légal
La rétention légale offre la même protection qu'une période de conservation, mais n'a pas de date d'expiration. Les retenues légales restent en vigueur jusqu'à ce qu'elles soient explicitement levées.
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!");
}
Obtention de l'état de mise en attente légale du verrouillage d'objet
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());
}
Références clés
Utilisation de la configuration du cycle de vie des godets
La configuration du cycle de vie permet de définir les actions que IBM Cloud Object Storage applique à un groupe d'objets. Vous pouvez utiliser des règles de cycle de vie pour faire passer des objets dans différentes classes de stockage ou pour les faire expirer après une période donnée.
Définir une configuration de cycle de vie sur un seau
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!");
}
Obtenir la configuration du cycle de vie d'un seau
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());
}
}
}
}
Suppression de la configuration du cycle de vie d'un seau
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!");
}
Références clés
Utilisation du versionnage des godets
Le versionnage vous permet de conserver plusieurs versions d'un objet dans le même bac. Cela peut vous aider à récupérer les actions involontaires de l'utilisateur et les défaillances de l'application.
Activation du versioning sur un bucket
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!");
}
Obtenir l'état des versions des seaux
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());
}
Liste des versions d'objets
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();
}
}
Suppression d'une version d'objet spécifique
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!");
}
Références clés
- VersioningConfiguration constructeur
- PutBucketVersioningRequest constructeur
- ListObjectVersionsRequest constructeur
Utilisation d'une liste étendue de godets
IBM Cloud Object Storage fournit une API de listage étendue qui renvoie des métadonnées supplémentaires sur les godets, y compris des informations sur l'emplacement et la classe de stockage.
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());
}
}
}
Références clés
Utilisation du niveau d'archivage et de la restauration d'objets
IBM Cloud Object Storage fournit des classes de stockage d'archives (Glacier) pour la conservation des données à long terme à moindre coût. Les objets stockés dans les archives doivent être restaurés avant d'être accessibles.
Transition des objets vers le stockage d'archives
Vous pouvez utiliser des règles de cycle de vie pour transférer automatiquement des objets vers le stockage d'archives après une période donnée.
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!");
}
Restauration d'un objet archivé
Les objets stockés dans les archives doivent être restaurés avant de pouvoir être téléchargés. Vous pouvez spécifier le nombre de jours pendant lesquels la copie restaurée doit être disponible.
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.");
}
Vérification de l'état de la restauration
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");
}
}
Recherche accélérée d'archives
IBM Cloud Object Storage prend en charge la récupération accélérée des archives pour un accès plus rapide aux données archivées :
- Accéléré: délai de récupération de 2 heures
- Standard: 3-5 heures de temps de récupération (par défaut)
- En vrac: 5 à 12 heures de délai de récupération (coût le plus bas)
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)");
}
Références clés
Utilisation de CORS (Cross-Origin Resource Sharing)
CORS permet aux applications web fonctionnant dans un domaine d'accéder aux ressources de IBM Cloud Object Storage à partir d'un autre domaine.
Définition de la configuration de CORS sur un 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!");
}
Obtenir la configuration de CORS
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());
}
}
Suppression de la configuration de 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!");
}
Références clés
Utilisation de politiques de seaux
Les politiques relatives aux seaux permettent de gérer le contrôle d'accès aux seaux et aux objets. Elles sont écrites en JSON et peuvent accorder ou refuser des autorisations aux utilisateurs et aux services.
Mise en place d'une politique des seaux
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!");
}
Obtenir une police d'assurance seau
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());
}
Suppression d'une politique de seau
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!");
}
Références clés
Créer un site web statique hébergé
IBM Cloud Object Storage prend en charge l'hébergement de sites web statiques directement à partir d'une base de données. Vous pouvez configurer un seau pour qu'il serve du contenu statique en spécifiant un document d'index et un document d'erreur.
Cette opération nécessite la déclaration d'importation suivante :
import com.ibm.cos.v2.services.s3.model.BucketWebsiteConfiguration;
Configuration du site web du seau
Cette opération offre les possibilités suivantes après configuration et nécessite un client correctement configuré :
- Configuration des godets pour les suffixes (document d'index)
- Configuration du seau pour la clé (document d'erreur)
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!");
}
Obtenir la configuration du site web du seau
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());
}
Suppression de la configuration d'un site web à seaux
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!");
}
Références clés
Gestion des erreurs et bonnes pratiques
Gestion des exceptions du SDK
Le SDK v2 utilise des types d'exception spécifiques pour différents scénarios d'erreur.
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());
}
}
Meilleures pratiques pour v2 SDK
- Réutiliser les instances de S3Client: La création de clients est coûteuse. Réutilisez-les dans les différentes demandes.
// 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();
- Utiliser l'essai avec les ressources: Assurer un nettoyage correct des ressources.
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
-
Traiter les fichiers volumineux avec des téléchargements en plusieurs parties: Pour les fichiers de plus de 5 Mo, utilisez les téléchargements en plusieurs parties.
-
Utilisez le gestionnaire de transfert pour les transferts importants: Il fournit un téléchargement automatique en plusieurs parties, une logique de réessai et un suivi de la progression.
-
Définir des délais d'attente appropriés: Configurez les délais d'attente du client en fonction de votre cas d'utilisation.
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();
Références clés
Ressources complémentaires
Obtenir de l'aide
- Posez des questions sur Stack Overflow avec les tags
ibmetobject-storage - Ouvrir un ticket d'assistance avec IBM Cloud Support
- Signaler des bogues ou demander des fonctionnalités sur GitHub Issues
Cette documentation fournit la structure et les références SDK pour IBM Cloud Object Storage Java SDK v2. Pour obtenir des exemples complets de code de travail pour toutes les opérations, consultez le répertoire d'exemples et le guide de migration dans le référentiel GitHub.