MaxUploadSizeExceededException no Spring
1. Visão geral
Na estrutura Spring, umMaxUploadSizeExceededException é lançado quando um aplicativo tenta fazer upload de um arquivo cujo tamanho excede um certo limite, conforme especificado na configuração.
Neste tutorial, veremos como especificar um tamanho máximo de upload. Em seguida, mostraremos um controlador de upload de arquivo simples e discutiremos diferentes métodos para lidar com essa exceção.
2. Definir um tamanho máximo de upload
Por padrão, não há limite para o tamanho dos arquivos que podem ser carregados. Para definir um tamanho máximo de upload, você deve declarar um bean do tipoMultipartResolver.
Vejamos um exemplo que limita o tamanho do arquivo a 5 MB:
@Bean
public MultipartResolver multipartResolver() {
CommonsMultipartResolver multipartResolver
= new CommonsMultipartResolver();
multipartResolver.setMaxUploadSize(5242880);
return multipartResolver;
}
3. Controlador de upload de arquivo
A seguir, vamos definir um método de controlador que lida com o upload e salvamento de um arquivo no servidor:
@RequestMapping(value = "/uploadFile", method = RequestMethod.POST)
public ModelAndView uploadFile(MultipartFile file) throws IOException {
ModelAndView modelAndView = new ModelAndView("file");
InputStream in = file.getInputStream();
File currDir = new File(".");
String path = currDir.getAbsolutePath();
FileOutputStream f = new FileOutputStream(
path.substring(0, path.length()-1)+ file.getOriginalFilename());
int ch = 0;
while ((ch = in.read()) != -1) {
f.write(ch);
}
f.flush();
f.close();
modelAndView.getModel().put("message", "File uploaded successfully!");
return modelAndView;
}
Se o usuário tentar fazer upload de um arquivo com tamanho superior a 5 MB, o aplicativo lançará uma exceção do tipoMaxUploadSizeExceededException.
4. Lidando comMaxUploadSizeExceededException
Para lidar com essa exceção, podemos fazer com que nosso controlador implemente a interfaceHandlerExceptionResolver, ou podemos criar uma classe anotada@ControllerAdvice.
4.1. ImplementandoHandlerExceptionResolver
A interfaceHandlerExceptionResolver declara um método chamadoresolveException(), onde exceções de diferentes tipos podem ser tratadas.
Vamos substituir o métodoresolveException() para exibir uma mensagem caso a exceção capturada seja do tipoMaxUploadSizeExceededException:
@Override
public ModelAndView resolveException(
HttpServletRequest request,
HttpServletResponse response,
Object object,
Exception exc) {
ModelAndView modelAndView = new ModelAndView("file");
if (exc instanceof MaxUploadSizeExceededException) {
modelAndView.getModel().put("message", "File size exceeds limit!");
}
return modelAndView;
}
4.2. Criando um Interceptador de Aconselhamento do Controlador
Existem algumas vantagens em lidar com a exceção por meio de um interceptador, e não no próprio controlador. Uma é que podemos aplicar a mesma lógica de manipulação de exceção a vários controladores.
Outra é que podemos criar um método que visa apenas a exceção que queremos tratar, permitindo que o framework delegue o tratamento da exceção sem termos que usarinstanceof para verificar que tipo de exceção foi lançada:
@ControllerAdvice
public class FileUploadExceptionAdvice {
@ExceptionHandler(MaxUploadSizeExceededException.class)
public ModelAndView handleMaxSizeException(
MaxUploadSizeExceededException exc,
HttpServletRequest request,
HttpServletResponse response) {
ModelAndView modelAndView = new ModelAndView("file");
modelAndView.getModel().put("message", "File too large!");
return modelAndView;
}
}
5. Configuração do Tomcat
Se você estiver implantando no servidor Tomcat versão 7 e superior, há uma propriedade de configuração chamadamaxSwallowSize que pode ser necessária para definir ou alterar.
Essa propriedade especifica o número máximo de bytes que o Tomcat “engolirá” para um upload do cliente quando souber que o servidor ignorará o arquivo.
O valor padrão da propriedade é 2097152 (2 MB). Se deixado inalterado ou definido abaixo do limite de 5 MB que definimos em nossoMultipartResolver, o Tomcat rejeitará qualquer tentativa de fazer upload de um arquivo com mais de 2 MB e nosso tratamento de exceção personalizado nunca será invocado.
Para que a solicitação seja bem-sucedida e para que a mensagem de erro do aplicativo seja exibida, você precisa definir a propriedademaxSwallowSize com um valor negativo. Isso instrui o Tomcat a engolir todos os uploads com falha, independentemente do tamanho do arquivo.
Isso é feito no arquivoTOMCAT_HOME/conf/server.xml:
6. Conclusão
Neste artigo, demonstramos como configurar um tamanho máximo de upload de arquivo no Spring e como lidar comMaxUploadSizeExceededException que resulta quando um cliente tenta fazer upload de um arquivo que excede esse limite de tamanho.
O código-fonte completo deste artigo pode ser encontrado emGitHub project.