Upload de arquivo com o Spring MVC
1. Visão geral
Em artigos anteriores, nósintroduced the basics de manipulação de formulário e exploramos oform tag library no Spring MVC.
Neste artigo, vamos nos concentrar no que o Spring oferece paramultipart (file upload) support em aplicativos da web.
O Spring nos permite habilitar este suporte multipartes com objetosMultipartResolver conectáveis. A estrutura fornece uma implementaçãoMultipartResolver para uso comCommons FileUploade outra para uso com análise de solicitação multiparteServlet 3.0.
Depois de configurar oMultipartResolver, veremos como enviar um único arquivo e vários arquivos.
Também abordaremosSpring Boot.
2. Commons FileUpload
Para usarCommonsMultipartResolver para lidar com o upload do arquivo, precisamos adicionar a seguinte dependência:
commons-fileupload
commons-fileupload
1.3.1
Agora podemos definir o beanCommonsMultipartResolver em nossa configuração Spring.
EsteMultipartResolver vem com uma série de métodosset para definir propriedades como o tamanho máximo para uploads:
@Bean(name = "multipartResolver")
public CommonsMultipartResolver multipartResolver() {
CommonsMultipartResolver multipartResolver = new CommonsMultipartResolver();
multipartResolver.setMaxUploadSize(100000);
return multipartResolver;
}
Aqui, precisamos controlar diferentes propriedades deCommonsMultipartResolver na própria definição do Bean.
3. With Servlet 3.0
Para usar a análise multipartesServlet 3.0, precisamos configurar algumas partes do aplicativo. First, we need to set a MultipartConfigElement in our DispatcherServlet registration:
public class MainWebAppInitializer implements WebApplicationInitializer {
private String TMP_FOLDER = "/tmp";
private int MAX_UPLOAD_SIZE = 5 * 1024 * 1024;
@Override
public void onStartup(ServletContext sc) throws ServletException {
ServletRegistration.Dynamic appServlet = sc.addServlet("mvc", new DispatcherServlet(
new GenericWebApplicationContext()));
appServlet.setLoadOnStartup(1);
MultipartConfigElement multipartConfigElement = new MultipartConfigElement(TMP_FOLDER,
MAX_UPLOAD_SIZE, MAX_UPLOAD_SIZE * 2, MAX_UPLOAD_SIZE / 2);
appServlet.setMultipartConfig(multipartConfigElement);
}
}
No objetoMultipartConfigElement, configuramos o local de armazenamento, o tamanho máximo do arquivo individual, o tamanho máximo da solicitação (no caso de vários arquivos em uma única solicitação) e o tamanho no qual o andamento do upload do arquivo é liberado para o local de armazenamento.
Essas configurações devem ser aplicadas no nível de registro do servlet, poisServlet 3.0 não permite que eles sejam registrados emMultipartResolver como é o caso comCommonsMultipartResolver.
Feito isso,we can add the StandardServletMultipartResolver to our Spring configuration:
@Bean
public StandardServletMultipartResolver multipartResolver() {
return new StandardServletMultipartResolver();
}
4. Uploading a File **
Para enviar nosso arquivo, podemos construir um formulário simples no qual usamos uma tag HTMLinput comtype='file'.
Independentemente da configuração de gerenciamento de upload, escolhemos, precisamos definir o atributo de codificação do formulário paramultipart/form-data.. Isso permite que o navegador saiba como codificar o formulário:
Select a file to upload
To store the uploaded file we can use a MultipartFile variable. Podemos recuperar essa variável do parâmetro de solicitação dentro do método de nosso controlador:
@RequestMapping(value = "/uploadFile", method = RequestMethod.POST)
public String submit(@RequestParam("file") MultipartFile file, ModelMap modelMap) {
modelMap.addAttribute("file", file);
return "fileUploadView";
}
The MultipartFile class provides access to details about the uploaded file, incluindo nome de arquivo, tipo de arquivo e assim por diante. Podemos usar uma página HTML simples para exibir essas informações:
Submitted File
OriginalFileName:
${file.originalFilename}
Type:
${file.contentType}
5. Enviando Múltiplos arquivos
Para fazer upload de vários arquivos em uma única solicitação, simplesmente colocamos vários campos de arquivos de entrada dentro do formulário:
Select a file to upload
Select a file to upload
Select a file to upload
Precisamos cuidar para que cada campo de entrada tenha o mesmo nome para que possa ser acessado como uma matriz deMultipartFile:
@RequestMapping(value = "/uploadMultiFile", method = RequestMethod.POST)
public String submit(@RequestParam("files") MultipartFile[] files, ModelMap modelMap) {
modelMap.addAttribute("files", files);
return "fileUploadView";
}
Agora, podemos simplesmente iterar sobre essa matriz para exibir informações de arquivos:
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
Spring MVC File Upload
Submitted Files
OriginalFileName:
${file.originalFilename}
Type:
${file.contentType}
6. Upload de arquivos com dados de formulário adicionais
Também podemos enviar informações adicionais ao servidor juntamente com o arquivo que está sendo carregado. Apenas precisamos incluir os campos obrigatórios no formulário:
Name
Email
Select a file to upload
No controlador, podemos obter todos os dados do formulário usando a anotação@RequestParam:
@PostMapping("/uploadFileWithAddtionalData")
public String submit(
@RequestParam MultipartFile file, @RequestParam String name,
@RequestParam String email, ModelMap modelMap) {
modelMap.addAttribute("name", name);
modelMap.addAttribute("email", email);
modelMap.addAttribute("file", file);
return "fileUploadView";
}
Semelhante às seções anteriores, podemos usar a página HTML com tagsJSTL para exibir as informações.
Também podemos encapsular todos os campos do formulário em uma classe de modelo e usar a anotação@ModelAttribute no controlador. Isso seria útil quando há muitos campos adicionais junto com o arquivo. Vamos ver o código:
public class FormDataWithFile {
private String name;
private String email;
private MultipartFile file;
// standard getters and setters
}
@PostMapping("/uploadFileModelAttribute")
public String submit(@ModelAttribute FormDataWithFile formDataWithFile, ModelMap modelMap) {
modelMap.addAttribute("formDataWithFile", formDataWithFile);
return "fileUploadView";
}
7. Spring Boot File Upload
[.hps] [result_box]#If we’re using Spring Boot, everything we’ve seen so far still applies. # #
No entanto, o Spring Boot torna ainda mais fácil configurar e iniciar tudo com pouco aborrecimento.
Em particular,it’s not necessary to configure any servlet, as Boot irá registrá-lo e configurá-lo para nós, desde que incluamos o módulo da web em nossas dependências:
org.springframework.boot
spring-boot-starter-web
2.1.8.RELEASE
Podemos encontrar a versão mais recente despring-boot-starter-web no Maven Central.
Se quisermos controlar o tamanho máximo de upload de arquivo, podemos editar nossoapplication.properties:
spring.servlet.multipart.max-file-size=128KB
spring.servlet.multipart.max-request-size=128KB
Também podemos controlar se o upload de arquivos está ativado e o local para upload de arquivos:
spring.servlet.multipart.enabled=true
spring.servlet.multipart.location=${java.io.tmpdir}
Observe que usamos$\{java.io.tmpdir} para definir o local de upload para que possamos usar o local temporário para diferentes sistemas operacionais.
8. Conclusão
[.hps] [result_box]#In this article, we looked at different ways to configure multipart support in Spring. Using these, we can support file uploads in our web applications. # #
A implementação deste tutorial pode ser encontrada em aGitHub project. Quando o projeto é executado localmente, o exemplo de formulário pode ser acessado emhttp://localhost:8080/spring-mvc-java/fileUpload