Um serviço de upload de arquivos desenvolvido em Spring Boot que utiliza MinIO (S3-compatible) para armazenamento de arquivos.
- Java 25
- Spring Boot 3.5.6
- MinIO (S3-compatible storage)
- Maven (gerenciamento de dependências)
- Lombok (redução de boilerplate)
- Spring Dotenv (gerenciamento de variáveis de ambiente)
- Java 25 ou superior
- Maven 3.6+
- MinIO Server (local ou remoto)
- Docker (opcional, para executar MinIO via container)
O projeto utiliza um arquivo .env na raiz do projeto para configuração. Crie o arquivo .env com as seguintes variáveis:
# Configurações da Aplicação
APP_NAME=file-upload-service
MAX_FILE_SIZE=10MB
MAX_REQUEST_SIZE=10MB
# Configurações do MinIO
MINIO_ENDPOINT=http://localhost:9000
MINIO_ACCESS_KEY=minioadmin
MINIO_SECRET_KEY=minioadmin123
MINIO_BUCKET_NAME=images
MINIO_REGION=us-east-1# Navegar para o diretório docker
cd docker
# Executar MinIO via Docker Compose
docker-compose up -d- Baixe e instale o MinIO Server
- Execute o servidor MinIO:
minio server /data --console-address ":9001" - Acesse o console em
http://localhost:9001 - Crie um bucket chamado
images
git clone https://github.com/devsdofuturobr/files.git
cd filesCertifique-se de que o arquivo .env está configurado corretamente na raiz do projeto.
mvn clean compilemvn spring-boot:runA aplicação estará disponível em http://localhost:8080
POST /api/v1/files/upload
- Content-Type:
multipart/form-data - Parâmetro:
file(arquivo a ser enviado)
Exemplo de uso:
curl -X POST \
http://localhost:8080/api/v1/files/upload \
-H 'Content-Type: multipart/form-data' \
-F 'file=@/caminho/para/seu/arquivo.jpg'Resposta de sucesso:
{
"success": true,
"message": "Arquivo enviado com sucesso",
"fileName": "20231010_143022_abc123.jpg",
"fileUrl": "http://localhost:9000/images/20231010_143022_abc123.jpg",
"fileSize": 1024576,
"contentType": "image/jpeg"
}GET /api/v1/files/list
Exemplo de uso:
curl -X GET http://localhost:8080/api/v1/files/listResposta de sucesso:
{
"success": true,
"message": null,
"files": [
"20231010_143022_abc123.jpg",
"20231010_144530_def456.png"
],
"count": 2,
"error": null
}DELETE /api/v1/files/delete/{fileName}
Exemplo de uso:
curl -X DELETE http://localhost:8080/api/v1/files/delete/20231010_143022_abc123.jpgResposta de sucesso:
{
"success": true,
"message": "Arquivo deletado com sucesso",
"fileName": "20231010_143022_abc123.jpg"
}src/
├── main/
│ ├── java/
│ │ └── com/devsdofuturobr/file/
│ │ ├── config/ # Configurações (MinIO, etc.)
│ │ ├── controller/ # Controllers REST
│ │ ├── dto/ # Data Transfer Objects
│ │ ├── exception/ # Tratamento de exceções
│ │ ├── service/ # Interfaces de serviço
│ │ │ └── impl/ # Implementações dos serviços
│ │ └── FileApplication.java
│ └── resources/
│ └── application.yml # Configurações da aplicação
└── test/ # Testes unitários
- FileUploadController: Controller REST que expõe os endpoints da API
- FileUploadService: Interface que define os contratos do serviço
- FileUploadServiceImpl: Implementação do serviço de upload (localizada em service/impl/)
- GlobalExceptionHandler: Tratamento centralizado de exceções
- MinioConfig: Configuração do cliente MinIO
- DTOs: Objetos de transferência de dados (FileResponse, FileListResponse, FileDeleteResponse, HealthResponse)
Por padrão, o tamanho máximo de arquivo é 10MB. Para alterar:
- Modifique as variáveis no arquivo
.env:MAX_FILE_SIZE=50MB MAX_REQUEST_SIZE=50MB
O MinIO é compatível com a API do Amazon S3, permitindo o uso do AWS CLI para interagir com o servidor.
# macOS
brew install awscli
# Ubuntu/Debian
sudo apt-get install awscli
# Windows
# Baixe o instalador do site oficial da AWS# Configure o perfil para MinIO
aws configure --profile minioQuando solicitado, insira:
- AWS Access Key ID:
minioadmin - AWS Secret Access Key:
minioadmin123 - Default region name:
us-east-1 - Default output format:
json
aws --profile minio --endpoint-url http://localhost:9000 s3 lsaws --profile minio --endpoint-url http://localhost:9000 s3 mb s3://imagesaws --profile minio --endpoint-url http://localhost:9000 s3 ls s3://imagesaws --profile minio --endpoint-url http://localhost:9000 s3 cp arquivo.jpg s3://images/aws --profile minio --endpoint-url http://localhost:9000 s3 cp s3://images/arquivo.jpg ./aws --profile minio --endpoint-url http://localhost:9000 s3 rm s3://images/arquivo.jpg# Upload de diretório local para bucket
aws --profile minio --endpoint-url http://localhost:9000 s3 sync ./local-folder s3://images/
# Download de bucket para diretório local
aws --profile minio --endpoint-url http://localhost:9000 s3 sync s3://images/ ./local-folderPara evitar usar --profile e --endpoint-url em cada comando:
# Defina as variáveis de ambiente
export AWS_ACCESS_KEY_ID=minioadmin
export AWS_SECRET_ACCESS_KEY=minioadmin123
export AWS_DEFAULT_REGION=us-east-1
export AWS_ENDPOINT_URL=http://localhost:9000
# Agora você pode usar comandos mais simples
aws s3 ls
aws s3 ls s3://images
aws s3 cp arquivo.jpg s3://images/O projeto inclui um ambiente Docker completo na pasta docker/ com:
- MinIO Server
- MinIO Console
- Configurações de rede
mvn test-
Upload de arquivo:
curl -X POST -F "file=@test-image.png" http://localhost:8080/api/v1/files/upload -
Listar arquivos:
curl http://localhost:8080/api/v1/files/list
-
Deletar arquivo:
curl -X DELETE http://localhost:8080/api/v1/files/delete/nome-do-arquivo.png
O projeto inclui uma coleção do Postman (File_Upload_Service.postman_collection.json) com todos os endpoints configurados para facilitar os testes. A coleção contém:
- Upload de arquivo: Endpoint configurado para upload com exemplo de arquivo
- Listar arquivos: Endpoint para listar todos os arquivos no bucket
- Deletar arquivo: Endpoint para deletar arquivos específicos
- Variáveis de ambiente: Configurações pré-definidas para URL base e outros parâmetros
- Exemplos de resposta: Respostas de exemplo para cada endpoint
A coleção está localizada na raiz do projeto e pode ser importada diretamente no Postman.
A aplicação utiliza Log4j2 para logging. Os logs incluem:
- Informações de upload (nome do arquivo, tamanho, etc.)
- Erros de validação e exceções
- Operações de listagem e exclusão
A aplicação possui tratamento centralizado de exceções que retorna respostas padronizadas:
- 400 Bad Request: Arquivo inválido ou muito grande
- 404 Not Found: Arquivo não encontrado
- 500 Internal Server Error: Erros internos do servidor
- Faça um fork do projeto
- Crie uma branch para sua feature (
git checkout -b feature/AmazingFeature) - Commit suas mudanças (
git commit -m 'Add some AmazingFeature') - Push para a branch (
git push origin feature/AmazingFeature) - Abra um Pull Request
Este projeto está sob a licença MIT. Veja o arquivo LICENSE para mais detalhes.
Para suporte ou dúvidas, entre em contato através dos issues do GitHub.
Desenvolvido by devsdofuturobr usando Spring Boot e MinIO