Upload de Arquivos com Alibaba Cloud OSS

Para realizar o upload de arquivos através de um frontend, é necessário atender a três requisitos fundmaentais:

  • O elemento do formulário deve ser do tipo file.
  • O método de submissão do formulário deve ser POST.
  • O atributo enctype do formulário deve ser definido como multipart/form-data.

Utilizando Alibaba Cloud OSS

O processo para integrar o Alibaba Cloud Object Storage Service (OSS) envolve os seguintes passos:

  1. Registrar e fazer login na sua conta Alibaba Cloud.
  2. Ativar o serviço de Object Storage (OSS).
  3. Criar um bucket.
  4. Obter suas credenciais de Access Key (Access Key ID e Access Key Secret).
  5. Consultar a documentação oficial do SDK e desenvolver um exemplo básico.

Integração do OSS em Aplicações

  1. Após ativar o serviço, navegue até a console do OSS.
  2. Na seção "Lista de Buckets", crie um novo bucket.
  3. Encontre o guia de início rápido para o SDK e instale-o, adicionando as dependências necessárias.
  4. Implmeente a funcionalidade de upload de arquivos simples, substituindo as configurações de exemplo pelas suas próprias credenciais e informações do bucket.
  5. Integre o código ao seu projeto, possivelmente encapsulando a lógica em uma classe utilitária como AliOssUtil.

Exemplo de Utilitário para Upload (Java)

A classe AliOssUtil gerencia a comunicação com o Alibaba Cloud OSS.


package com.smart.common.utils;

import com.aliyun.oss.ClientException;
import com.aliyun.oss.OSS;
import com.aliyun.oss.OSSClientBuilder;
import com.aliyun.oss.OSSException;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.extern.slf4j.Slf4j;

import java.io.ByteArrayInputStream;

@Data
@AllArgsConstructor
@Slf4j
public class AliOssUtil {
   private String endpoint;
   private String accessKeyId;
   private String accessKeySecret;
   private String bucketName;

   /**
    * Realiza o upload de um arquivo para o OSS.
    *
    * @param fileBytes   Os bytes do arquivo a ser enviado.
    * @param objectName  O nome desejado para o objeto no bucket.
    * @return A URL completa do arquivo no OSS.
    */
   public String upload(byte[] fileBytes, String objectName) {
       // Inicializa o cliente OSS.
       OSS ossClient = new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret);

       try {
           // Executa a operação de upload.
           ossClient.putObject(bucketName, objectName, new ByteArrayInputStream(fileBytes));
           log.info("Upload do objeto {} para o bucket {} concluído com sucesso.", objectName, bucketName);
       } catch (OSSException oe) {
           log.error("Erro de OSS durante o upload:", oe);
           log.error("Detalhes do erro: Código={}, Mensagem={}, ID da Requisição={}",
                   oe.getErrorCode(), oe.getErrorMessage(), oe.getRequestId());
       } catch (ClientException ce) {
           log.error("Erro do cliente durante a comunicação com o OSS:", ce);
       } finally {
           // Garante que o cliente seja encerrado.
           if (ossClient != null) {
               ossClient.shutdown();
           }
       }

       // Constrói a URL de acesso ao arquivo.
       // Formato: https://{bucketName}.{endpoint}/{objectName}
       StringBuilder urlBuilder = new StringBuilder("https://");
       urlBuilder.append(bucketName).append(".").append(endpoint).append("/").append(objectName);

       String fileUrl = urlBuilder.toString();
       log.info("URL de acesso ao arquivo: {}", fileUrl);
       return fileUrl;
   }
}
   

Configuração das Credenciais

As credenciais do Alibaba Cloud OSS devem ser configuradas em um arquivo de propriedades, por exemplo, application.yml:


alioss:
 endpoint: oss-cn-beijing.aliyuncs.com
 access-key-id: SUA_ACCESS_KEY_ID
 access-key-secret: SUA_ACCESS_KEY_SECRET
 bucket-name: nome-do-seu-bucket
   

Classe de Propriedades para Leitura da Configuração

Uma classe anotada com @ConfigurationProperties lê as configurações do arquivo.


package com.sky.properties;

import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;

@Component
@ConfigurationProperties(prefix = "alioss") // Prefixo correspondente no application.yml
@Data
public class AliOssProperties {
   private String endpoint;
   private String accessKeyId;
   private String accessKeySecret;
   private String bucketName;
}
   

Classe de Configuração do Bean do OSS

Esta classe registra o utilitário AliOssUtil como um bean no Spring context.


 package com.sky.config;

import com.sky.properties.AliOssProperties;
import com.smart.common.utils.AliOssUtil; // Ajuste o pacote conforme necessário
import lombok.extern.slf4j.Slf4j;
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

 @Slf4j
 @Configuration
 public class OssConfiguration {

     @Bean
     // Garante que o bean só seja criado se ainda não existir
     @ConditionalOnMissingBean
     public AliOssUtil aliOssUtil(AliOssProperties aliOssProperties){
         log.info("Configurando o bean AliOssUtil com as propriedades do OSS.");
         return new AliOssUtil(
                 aliOssProperties.getEndpoint(),
                 aliOssProperties.getAccessKeyId(),
                 aliOssProperties.getAccessKeySecret(),
                 aliOssProperties.getBucketName()
         );
     }
 }
   

Exemplo de Controlaodr para Invocar o Upload

Um controlador REST pode expor um endpoint para receber arquivos e usar o AliOssUtil para o upload.


package com.sky.controller.admin;

import com.sky.constant.MessageConstant; // Assumindo que esta classe contém mensagens de erro
import com.sky.result.Result; // Assumindo uma classe genérica de resultado
import com.smart.common.utils.AliOssUtil; // Ajuste o pacote conforme necessário
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
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.io.IOException;
import java.util.UUID;

@Slf4j
@Api(tags = "Interface de Upload")
@RestController
@RequestMapping("/admin/common")
public class CommonController {

   private final AliOssUtil aliOssUtil;

   @Autowired
   public CommonController(AliOssUtil aliOssUtil) {
       this.aliOssUtil = aliOssUtil;
   }

   @ApiOperation("Upload de Arquivo")
   @PostMapping("/upload")
   public Result<string> upload(MultipartFile file) {
       if (file == null || file.isEmpty()) {
           log.warn("Tentativa de upload de arquivo vazio.");
           return Result.error("Nenhum arquivo selecionado."); // Adapte a mensagem conforme necessário
       }

       try {
           // Obtém os bytes do arquivo.
           byte[] fileBytes = file.getBytes();

           // Gera um nome de arquivo único.
           String originalFilename = file.getOriginalFilename();
           String fileExtension = "";
           if (originalFilename != null && originalFilename.contains(".")) {
               fileExtension = originalFilename.substring(originalFilename.lastIndexOf("."));
           }
           String uniqueObjectName = UUID.randomUUID().toString() + fileExtension;

           // Realiza o upload usando o utilitário OSS.
           String url = aliOssUtil.upload(fileBytes, uniqueObjectName);

           // Retorna a URL do arquivo.
           return Result.success(url);
       } catch (IOException e) {
           log.error("Erro de I/O durante o upload do arquivo: {}", originalFilename, e);
           // Use uma constante de mensagem apropriada, se disponível
           return Result.error(MessageConstant.UPLOAD_FAILED != null ? MessageConstant.UPLOAD_FAILED : "Falha no upload do arquivo.");
       } catch (Exception e) {
           log.error("Erro inesperado durante o upload do arquivo: {}", originalFilename, e);
           return Result.error(MessageConstant.UPLOAD_FAILED != null ? MessageConstant.UPLOAD_FAILED : "Ocorreu um erro inesperado.");
       }
   }
}
   </string>

Tags: Alibaba Cloud OSS upload de arquivos java Spring Boot

Publicado em 7-8 01:28