Use o minio para fazer upload de fotos e vídeos

ps: Como encontrei o uso do minio para fazer upload de fotos no meu negócio, vou registrar o uso.

  • MinIO é um servidor de armazenamento de objetos de código aberto que pode ser usado para armazenar e recuperar qualquer tipo de arquivo, incluindo fotos, vídeos, documentos, etc. MinIO foi projetado para fornecer serviços de armazenamento de objetos escalonáveis, de alto desempenho e alta disponibilidade, ao mesmo tempo em que permanece simples de usar e de baixo custo.

  • Por que usar um servidor de armazenamento de objetos?

    O banco de dados pode armazenar vídeos e fotos, mas armazenar um grande número de vídeos e fotos ocupará muito espaço de armazenamento, fazendo com que o banco de dados fique grande e lento. Além disso, o principal objetivo de uma base de dados é armazenar e gerir dados estruturados, enquanto vídeos e imagens são dados não estruturados, pelo que o seu armazenamento pode exigir a utilização de diferentes tecnologias e ferramentas. Portanto, muitas vezes é recomendado armazenar vídeos e imagens em um sistema de arquivos dedicado ou armazenamento em nuvem, em vez de diretamente em um banco de dados.

  • Os principais recursos do MinIO incluem:

    1. Alto desempenho: MinIO é escrito em linguagem Go e adota algumas tecnologias de otimização, como simultaneidade e E/S assíncrona, para obter serviços de armazenamento de objetos de alto desempenho.

    2. Alta disponibilidade: MinIO suporta mecanismos como replicação multicópia e failover, que podem garantir a confiabilidade e disponibilidade dos dados.

    3. Escalabilidade: MinIO adota uma arquitetura distribuída e pode expandir a capacidade de armazenamento e o rendimento adicionando novos nós.

    4. Simples e fácil de usar: MinIO fornece API simples e fáceis de usar e ferramentas de linha de comando, que podem facilitar o gerenciamento e operação do armazenamento de objetos.

    5. Baixo custo: o MinIO pode ser executado em dispositivos de hardware padrão e não requer dispositivos de armazenamento especiais, o que pode reduzir os custos de armazenamento.

    MinIO oferece suporte a várias APIs e protocolos, incluindo S3, NFS, HDFS, Azure Blob Storage, etc., e pode ser integrado a vários aplicativos e sistemas. Além disso, o MinIO também oferece algumas funções avançadas, como bloqueio de objetos, controle de versão, notificação de eventos, etc., para atender a diferentes necessidades de negócios.

    Resumindo, o MinIO é um servidor de armazenamento de objetos poderoso, de alto desempenho, fácil de usar e de baixo custo, adequado para cenários de aplicativos de todos os tamanhos. Alibaba Cloud e Tencent Cloud parecem cobrar por 10G OS. Acho que podem ser usados ​​e a operação não é difícil.

  • Ao usar o Java SDK do MinIO, você precisa fornecer os quatro parâmetros a seguir:

    1. ENDPOINT: O endereço do servidor MinIO, incluindo protocolo, nome do host e número da porta. Por exemplo, http://localhost:9000representa um servidor MinIO em execução local.

    2. ACCESS_KEY: Chave de acesso, usada para autenticação. No MinIO, cada usuário possui uma chave de acesso e uma chave secreta usada para acessar e gerenciar buckets e objetos.

    3. SECRET_KEY: Chave secreta, usada para autenticação. Usado com chaves de acesso para acessar e gerenciar buckets e objetos.

    4. BUCKET_NAME: o nome do bucket usado para armazenar e gerenciar objetos. No MinIO, cada bucket possui um nome exclusivo.

  • 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);
        }
    }
    

    A imagem é passada do front end. Usamos o arquivo MultipartFile para recebê-la. Após carregá-la no minio, precisamos passar o caminho gerado para a página do front end para exibição, mas o caminho também é passado para o banco de dados.

  • A transferência de fotos e vídeos é semelhante, mas se o vídeo envolver a retomada do upload, será um pouco complicado.

  • Resumir:

  • 1. Importe dependências minio

  • 2. Escreva o arquivo de configuração, quatro parâmetros, e injete-os na camada que trata do negócio com a anotação @Value .

  • 3. Crie um objeto cliente, passe os parâmetros e determine se o bucket existe. Caso contrário, crie-o.

  • 4. Chame o método putObject para fazer upload de imagens

  • 5. Retorne o caminho para o front-end ps: um dto grande é usado no banco de dados. O objeto é salvo e o componente de upload de imagens é apenas uma parte do formulário, passamos o formulário inteiro.

Acho que você gosta

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