Upload de arquivo com o Spring MVC

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