Usa minio para subir fotos y videos

PD: Debido a que encontré el uso de minio para cargar imágenes en mi negocio, registraré el uso.

  • MinIO es un servidor de almacenamiento de objetos de código abierto que se puede utilizar para almacenar y recuperar cualquier tipo de archivo, incluidas imágenes, vídeos, documentos, etc. MinIO está diseñado para proporcionar servicios de almacenamiento de objetos escalables, de alto rendimiento y alta disponibilidad sin dejar de ser fácil de usar y de bajo costo.

  • ¿Por qué utilizar un servidor de almacenamiento de objetos?

    La base de datos puede almacenar videos e imágenes, pero almacenar una gran cantidad de videos e imágenes ocupará mucho espacio de almacenamiento, lo que hará que la base de datos se vuelva grande y lenta. Además, el objetivo principal de una base de datos es almacenar y gestionar datos estructurados, mientras que los vídeos y las imágenes son datos no estructurados, por lo que almacenarlos puede requerir el uso de diferentes tecnologías y herramientas. Por lo tanto, a menudo se recomienda almacenar vídeos e imágenes en un sistema de archivos dedicado o almacenamiento en la nube, en lugar de hacerlo directamente en una base de datos.

  • Las características clave de MinIO incluyen:

    1. Alto rendimiento: MinIO está escrito en lenguaje Go y adopta algunas tecnologías de optimización, como concurrencia y E/S asíncrona, para lograr servicios de almacenamiento de objetos de alto rendimiento.

    2. Alta disponibilidad: MinIO admite mecanismos como la replicación de copias múltiples y la conmutación por error, que pueden garantizar la confiabilidad y disponibilidad de los datos.

    3. Escalabilidad: MinIO adopta una arquitectura distribuida y puede ampliar la capacidad de almacenamiento y el rendimiento agregando nuevos nodos.

    4. Simple y fácil de usar: MinIO proporciona API y herramientas de línea de comandos simples y fáciles de usar, que pueden facilitar la administración y operación del almacenamiento de objetos.

    5. Bajo costo: MinIO puede ejecutarse en dispositivos de hardware estándar y no requiere dispositivos de almacenamiento especiales, lo que puede reducir los costos de almacenamiento.

    MinIO admite múltiples API y protocolos, incluidos S3, NFS, HDFS, Azure Blob Storage, etc., y puede integrarse con varias aplicaciones y sistemas. Además, MinIO también proporciona algunas funciones avanzadas, como bloqueo de objetos, control de versiones, notificación de eventos, etc., para satisfacer diferentes necesidades comerciales.

    En resumen, MinIO es un servidor de almacenamiento de objetos potente, de alto rendimiento, fácil de usar y de bajo costo, adecuado para escenarios de aplicaciones de todos los tamaños. Alibaba Cloud y Tencent Cloud parecen cobrar por 10G oss, creo que se pueden utilizar y la operación no es difícil.

  • Cuando utilice el SDK de Java de MinIO, debe proporcionar los siguientes cuatro parámetros:

    1. ENDPOINT: La dirección del servidor MinIO, incluido el protocolo, el nombre de host y el número de puerto. Por ejemplo, http://localhost:9000representa un servidor MinIO que se ejecuta localmente.

    2. ACCESS_KEY: Clave de acceso, utilizada para la autenticación. En MinIO, cada usuario tiene una clave de acceso y una clave secreta que se utiliza para acceder y administrar depósitos y objetos.

    3. SECRET_KEY: Clave secreta, utilizada para la autenticación. Se utiliza con claves de acceso para acceder y administrar depósitos y objetos.

    4. BUCKET_NAME: el nombre del depósito utilizado para almacenar y administrar objetos. En MinIO, cada depósito tiene un nombre único.

  • ackage com.atguigu.gmall.product.controller;
    
    import com.atguigu.gmall.common.result.Result;
    import io.minio.BucketExistsArgs;
    import io.minio.MakeBucketArgs;
    import io.minio.MinioClient;
    import io.minio.PutObjectArgs;
    import org.springframework.beans.factory.annotation.Value;
    import org.springframework.web.bind.annotation.PostMapping;
    import org.springframework.web.bind.annotation.RequestMapping;
    import org.springframework.web.bind.annotation.RestController;
    import org.springframework.web.multipart.MultipartFile;
    
    import java.util.UUID;
    
    /**
     * @author 罗峰
     * @version 1.0
     * @description TODO
     * @date 2023-05-07 15:24
     */
    @RestController
    @RequestMapping("admin/product")
    public class FileUploadController {
    
        //  获取文件上传对应的地址
        @Value("${minio.endpointUrl}")
        public String endpointUrl;
    
        @Value("${minio.accessKey}")
        public String accessKey;
    
        @Value("${minio.secreKey}")
        public String secreKey;
    
        @Value("${minio.bucketName}")
        public String bucketName;
    
        //  文件上传控制器
        @PostMapping("fileUpload")
        public Result fileUpload(MultipartFile file) throws Exception{
            //  准备获取到上传的文件路径!
            String url = "";
    
            // 使用MinIO服务的URL,端口,Access key和Secret key创建一个MinioClient对象
            // MinioClient minioClient = new MinioClient("https://play.min.io", "Q3AM3UQ867SPQQA43P2F", "zuf+tfteSlswRu7BJ86wekitnifILbZam1KYY3TG");
            MinioClient minioClient =
                    MinioClient.builder()
                            .endpoint(endpointUrl)
                            .credentials(accessKey, secreKey)
                            .build();
            // 检查存储桶是否已经存在
            boolean isExist = minioClient.bucketExists(BucketExistsArgs.builder().bucket(bucketName).build());
            if(isExist) {
                System.out.println("Bucket already exists.");
            } else {
                // 创建一个名为asiatrip的存储桶,用于存储照片的zip文件。
                minioClient.makeBucket(MakeBucketArgs.builder()
                        .bucket(bucketName)
                        .build());
            }
            //  定义一个文件的名称 : 文件上传的时候,名称不能重复!
            String fileName = System.currentTimeMillis()+ UUID.randomUUID().toString();
            // 使用putObject上传一个文件到存储桶中。
            //  minioClient.putObject("asiatrip","asiaphotos.zip", "/home/user/Photos/asiaphotos.zip");
            minioClient.putObject(
                    PutObjectArgs.builder().bucket(bucketName).object(fileName).stream(
                                    file.getInputStream(), file.getSize(), -1)
                            .contentType(file.getContentType())
                            .build());
            //  System.out.println("/home/user/Photos/asiaphotos.zip is successfully uploaded as asiaphotos.zip to `asiatrip` bucket.");
            //  文件上传之后的路径: http://39.99.159.121:9000/gmall/xxxxxx
            url = endpointUrl+"/"+bucketName+"/"+fileName;
    
            System.out.println("url:\t"+url);
            //  将文件上传之后的路径返回给页面!
            return Result.ok(url);
        }
    }
    

    La imagen se transmite desde el front-end. Usamos el archivo MultipartFile para recibirla. Después de cargarla en minio, debemos pasar la ruta generada a la página del front-end para su visualización, pero la ruta también se pasa a la base de datos.

  • Transferir imágenes y vídeos es similar, pero si el vídeo implica reanudar la carga, será un poco complicado.

  • Resumir:

  • 1. Importar dependencias minio

  • 2. Escriba el archivo de configuración, cuatro parámetros e inyéctelos en la capa que maneja el negocio con la anotación @Value .

  • 3. Cree un objeto de cliente, pase los parámetros y luego determine si el depósito existe, si no, créelo.

  • 4. Llame al método putObject para cargar imágenes.

  • 5. Devuelva la ruta al front-end ps: se utiliza un dto grande en la base de datos. El objeto se guarda y el componente para cargar imágenes es solo una parte del formulario, pasamos el formulario completo.

Supongo que te gusta

Origin blog.csdn.net/weixin_65379795/article/details/130586959
Recomendado
Clasificación