Implémentation en code du service de stockage Alibaba Cloud OSS

Dépendances et configuration

Pour intégrer Alibaba Cloud Object Storage Service (OSS) dans une appplication Java, commencez par ajouter les dépendances Maven nécessaires :


<dependencies>
    <dependency>
        <groupId>com.aliyun.oss</groupId>
        <artifactId>aliyun-sdk-oss</artifactId>
        <version>3.17.4</version>
    </dependency>
    <dependency>
        <groupId>commons-io</groupId>
        <artifactId>commons-io</artifactId>
        <version>2.11.0</version>
    </dependency>
    <dependency>
        <groupId>commons-fileupload</groupId>
        <artifactId>commons-fileupload</artifactId>
        <version>1.4</version>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
</dependencies>
<repositories>
    <repository>
        <id>aliyun</id>
        <name>Aliyun Maven Repository</name>
        <url>https://maven.aliyun.com/repository/public</url>
    </repository>
</repositories>

Créez un fichier de configuration sous resources/config.properties avec les paramètres suivants :


oss.endpoint = https://oss-eu-central-1.aliyuncs.com
oss.bucket = mon-bucket-stockage
oss.key.id = votre-id-cle-acces
oss.key.secret = votre-secret-cle-acces
oss.prefix = donnees/

Gestion de la configuration

Chargez la configuration à l'aide d'une classe utilitaire :


import java.io.IOException;
import java.io.InputStream;
import java.util.Properties;

public class ConfigPropertiesLoader {
    private static final String FICHIER_CONFIG = "config.properties";
    private static final Properties proprietes = new Properties();

    static {
        try (InputStream flux = Thread.currentThread().getContextClassLoader().getResourceAsStream(FICHIER_CONFIG)) {
            if (flux != null) {
                proprietes.load(flux);
            }
        } catch (IOException e) {
            throw new RuntimeException("Erreur lors du chargement de la configuration", e);
        }
    }

    public static String obtenir(String cle) {
        return proprietes.getProperty(cle);
    }
}

Classe utilitaier pour les opérations OSS

Voici une classe réorganisée pour gérer les téléchargements et suppressions de fichiers :


import com.aliyun.oss.OSS;
import com.aliyun.oss.OSSClientBuilder;
import com.aliyun.oss.model.DeleteObjectsRequest;
import com.aliyun.oss.model.ObjectMetadata;
import com.aliyun.oss.model.PutObjectRequest;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.util.ArrayList;
import java.util.List;
import java.util.UUID;

public class GestionnaireStockageOSS {
    private final String pointAcces;
    private final String cleId;
    private final String cleSecrete;
    private final String nomBucket;
    private final String prefixeFichier;

    public GestionnaireStockageOSS() {
        this.pointAcces = ConfigPropertiesLoader.obtenir("oss.endpoint");
        this.cleId = ConfigPropertiesLoader.obtenir("oss.key.id");
        this.cleSecrete = ConfigPropertiesLoader.obtenir("oss.key.secret");
        this.nomBucket = ConfigPropertiesLoader.obtenir("oss.bucket");
        this.prefixeFichier = ConfigPropertiesLoader.obtenir("oss.prefix");
    }

    public String uploaderFichier(File fichier, String typeContenu) {
        String cleObjet = prefixeFichier + UUID.randomUUID().toString() + "." + typeContenu;
        try (OSS clientOSS = new OSSClientBuilder().build(pointAcces, cleId, cleSecrete)) {
            ObjectMetadata metadonnees = new ObjectMetadata();
            metadonnees.setContentType(determinerTypeContenu(typeContenu));
            try (FileInputStream fluxEntree = new FileInputStream(fichier)) {
                PutObjectRequest requete = new PutObjectRequest(nomBucket, cleObjet, fluxEntree, metadonnees);
                clientOSS.putObject(requete);
            }
        } catch (FileNotFoundException e) {
            throw new RuntimeException("Fichier non trouvé", e);
        } catch (Exception e) {
            throw new RuntimeException("Échec de l'upload", e);
        }
        return construireUrl(cleObjet);
    }

    public boolean supprimerFichier(String urlFichier) {
        String cleObjet = extraireCleDepuisUrl(urlFichier);
        try (OSS clientOSS = new OSSClientBuilder().build(pointAcces, cleId, cleSecrete)) {
            clientOSS.deleteObject(nomBucket, cleObjet);
            return true;
        } catch (Exception e) {
            e.printStackTrace();
            return false;
        }
    }

    public int supprimerMultiplesFichiers(List<String> urlsFichiers) {
        List<String> clesObjets = new ArrayList<>();
        for (String url : urlsFichiers) {
            clesObjets.add(extraireCleDepuisUrl(url));
        }
        try (OSS clientOSS = new OSSClientBuilder().build(pointAcces, cleId, cleSecrete)) {
            DeleteObjectsRequest requete = new DeleteObjectsRequest(nomBucket).withKeys(clesObjets);
            clientOSS.deleteObjects(requete);
            return clesObjets.size();
        } catch (Exception e) {
            throw new RuntimeException("Erreur lors de la suppression multiple", e);
        }
    }

    private String construireUrl(String cleObjet) {
        String domaineBase = pointAcces.replaceFirst("https://", "");
        return "https://" + nomBucket + "." + domaineBase + "/" + cleObjet;
    }

    private String extraireCleDepuisUrl(String url) {
        String prefixe = "https://" + nomBucket + "." + pointAcces.replaceFirst("https://", "") + "/";
        if (url.startsWith(prefixe)) {
            return url.substring(prefixe.length());
        }
        throw new IllegalArgumentException("URL non conforme");
    }

    private String determinerTypeContenu(String extension) {
        switch (extension.toLowerCase()) {
            case "jpeg":
            case "jpg":
                return "image/jpeg";
            case "png":
                return "image/png";
            case "gif":
                return "image/gif";
            case "mp4":
                return "video/mp4";
            case "pdf":
                return "application/pdf";
            default:
                return "application/octet-stream";
        }
    }
}

Exemple d'utilisation

Instanciez la classe et effectuez des opérations :


public class ApplicationStockage {
    public static void main(String[] args) {
        GestionnaireStockageOSS gestionnaire = new GestionnaireStockageOSS();
        File fichier = new File("chemin/image.png");
        String lien = gestionnaire.uploaderFichier(fichier, "png");
        System.out.println("Lien généré : " + lien);

        // Suppression simple
        boolean resultat = gestionnaire.supprimerFichier(lien);
        System.out.println("Suppression effectuée : " + resultat);
    }
}

Étiquettes: Alibaba Cloud OSS Java Spring Boot Cloud Storage File Management

Publié le 6 juin à 01h57