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
enctypedo formulário deve ser definido comomultipart/form-data.
Utilizando Alibaba Cloud OSS
O processo para integrar o Alibaba Cloud Object Storage Service (OSS) envolve os seguintes passos:
- Registrar e fazer login na sua conta Alibaba Cloud.
- Ativar o serviço de Object Storage (OSS).
- Criar um bucket.
- Obter suas credenciais de Access Key (Access Key ID e Access Key Secret).
- Consultar a documentação oficial do SDK e desenvolver um exemplo básico.
Integração do OSS em Aplicações
- Após ativar o serviço, navegue até a console do OSS.
- Na seção "Lista de Buckets", crie um novo bucket.
- Encontre o guia de início rápido para o SDK e instale-o, adicionando as dependências necessárias.
- Implmeente a funcionalidade de upload de arquivos simples, substituindo as configurações de exemplo pelas suas próprias credenciais e informações do bucket.
- 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>