Como realizar upload de arquivos em uma aplicação Java web?
O upload de arquivos é um recurso essencial em muitas aplicações web, seja para armazenar imagens, documentos ou vídeos. No Spring Boot, isso pode ser feito facilmente com a interface MultipartFile
.
1. Adicionando Configuração para Uploads
No application.properties
, ative o suporte para arquivos grandes:
spring.servlet.multipart.enabled=true
spring.servlet.multipart.max-file-size=5MB
spring.servlet.multipart.max-request-size=10MB
Explicação:
- Habilita suporte para uploads de arquivos.
- Define um limite de 5MB por arquivo e 10MB por requisição.
2. Criando o Controller para Upload
Crie um Controller que recebe arquivos e os salva localmente:
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;
import java.io.File;
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
@RestController
@RequestMapping("/upload")
public class UploadController {
private static final String UPLOAD_DIR = "uploads/";
@PostMapping("/arquivo")
public String uploadArquivo(@RequestParam("file") MultipartFile file) {
try {
Path caminho = Paths.get(UPLOAD_DIR + file.getOriginalFilename());
Files.write(caminho, file.getBytes());
return "Arquivo enviado com sucesso: " + file.getOriginalFilename();
} catch (IOException e) {
return "Erro ao enviar o arquivo: " + e.getMessage();
}
}
}
Explicação:
@PostMapping("/arquivo")
recebe arquivos via POST.MultipartFile file
contém o arquivo enviado.- O arquivo é salvo no diretório
uploads/
.
3. Criando um Serviço para Uploads no Banco de Dados
Caso queira salvar arquivos no banco de dados, crie uma entidade JPA:
import jakarta.persistence.*;
import java.util.Arrays;
@Entity
@Table(name = "arquivos")
public class Arquivo {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String nome;
@Lob
private byte[] dados;
// Getters e Setters
public Long getId() { return id; }
public void setId(Long id) { this.id = id; }
public String getNome() { return nome; }
public void setNome(String nome) { this.nome = nome; }
public byte[] getDados() { return dados; }
public void setDados(byte[] dados) { this.dados = dados; }
}
Agora, crie um repositório para manipular os arquivos:
import org.springframework.data.jpa.repository.JpaRepository;
public interface ArquivoRepository extends JpaRepository<Arquivo, Long> {
}
E um serviço para salvar arquivos no banco:
import org.springframework.stereotype.Service;
import org.springframework.web.multipart.MultipartFile;
import java.io.IOException;
@Service
public class ArquivoService {
private final ArquivoRepository arquivoRepository;
public ArquivoService(ArquivoRepository arquivoRepository) {
this.arquivoRepository = arquivoRepository;
}
public String salvarArquivo(MultipartFile file) throws IOException {
Arquivo arquivo = new Arquivo();
arquivo.setNome(file.getOriginalFilename());
arquivo.setDados(file.getBytes());
arquivoRepository.save(arquivo);
return "Arquivo salvo no banco de dados: " + file.getOriginalFilename();
}
}
4. Criando um Endpoint para Enviar e Recuperar Arquivos
Agora, altere o Controller para suportar uploads para o banco de dados:
@RestController
@RequestMapping("/upload")
public class UploadController {
private final ArquivoService arquivoService;
public UploadController(ArquivoService arquivoService) {
this.arquivoService = arquivoService;
}
@PostMapping("/banco")
public String uploadParaBanco(@RequestParam("file") MultipartFile file) {
try {
return arquivoService.salvarArquivo(file);
} catch (IOException e) {
return "Erro ao salvar o arquivo: " + e.getMessage();
}
}
}
5. Testando o Upload de Arquivos
-
Enviar um arquivo via Postman:
- Método: POST
- URL:
http://localhost:8080/upload/arquivo
- Aba "Body" → Selecione form-data
- Adicione um campo
file
e envie um arquivo
-
Enviar um arquivo para o banco de dados:
- Mesma configuração, alterando a URL para
http://localhost:8080/upload/banco
- Mesma configuração, alterando a URL para
Conclusão
O upload de arquivos em Spring Boot pode ser feito de forma simples:
- Salvar no sistema de arquivos usando
MultipartFile
. - Armazenar no banco de dados usando JPA e
@Lob
. - Definir limites de tamanho no
application.properties
.
Escolha a abordagem que melhor se adapta ao seu projeto!
Quais são as melhores práticas para upload de arquivos em Java?
Com a crescente necessidade de armazenar arquivos em aplicações web, é essencial compreender como gerenciar uploads de forma eficiente. O Spring Boot oferece suporte integrado para MultipartFile
, permitindo salvar arquivos no sistema de arquivos ou banco de dados. Além disso, o uso de serviços como AWS S3 pode ser uma alternativa escalável para armazenar grandes volumes de dados sem sobrecarregar o servidor da aplicação.
Algumas aplicações:
- Upload de imagens de perfil em sistemas web
- Armazenamento de documentos em bancos de dados
- Integração com serviços de armazenamento na nuvem
- Gerenciamento de arquivos em sistemas corporativos
Dicas para quem está começando
- Defina um limite de tamanho para os arquivos
- Evite armazenar arquivos grandes diretamente no banco de dados
- Use serviços como AWS S3 para escalabilidade
- Valide o tipo de arquivo antes de armazená-lo
Contribuições de Rodrigo Farias