前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Spring MVC 4 使用常规的fileupload上传文件(带源码)

Spring MVC 4 使用常规的fileupload上传文件(带源码)

作者头像
明明如月学长
发布2021-08-27 15:27:43
8180
发布2021-08-27 15:27:43
举报

【本系列其他教程正在陆续翻译中,点击分类:spring 4 mvc 进行查看。源码下载地址在文章末尾。】

【翻译 by 明明如月 QQ 605283073】

上一篇:

Spring MVC 4 文件上传下载 Hibernate+MySQL例子 (带源码)

原文地址:http://websystique.com/springmvc/spring-mvc-4-file-upload-example-using-commons-fileupload/

本文将实现使用SpringMultipartResolver实现单个或者多文件上传.Spring提供内置multipart 支持用来处理web 应用中文件上传。

注意:multipart 是 enctype=”multipart/form-data”的内容.

简单预览

Spring使用MultiPartResolver接口实现文件上传.

  • 1. 使用Apache Commons . Spring CommonsMultipartResolver 使用Apache Commons FileUpload 实现 MultipartResolver  . 它需要apache 的commons-fileupload.jar 包. 虽然不针对Servlet 3但是Servlet 3.x容器中使用也没问题。
  • 2. 要想用Servlet 3.0 multipart 请求 需要配置[XML or JavaConfig]..
  •  XML 设置, 你需要在 web.xml的"multipart-config" 节点配置DispatcherServlet. 如果是Annoataion/JavaConfig配置, 在DispatcherServlet 注册javax.servlet.MultipartConfigElement  .或者使用 @MultipartConfig定义servlet.

本文主要用CommonsMultipartResolver . 下一篇文章使用Servlet 3.0 来实现文件上传.

步骤:

  • 创建一个CommonsMultipartResolver类型的bean , 指明和文件上传相关的配置文件
  • 在类路径包含 Apache Commons commons-fileupload.jar文件.
  • 表单中要含有[enctype=”multipart/form-data”]
  • 处理文件的input类型应该是 ‘file’

类似如下:

代码语言:javascript
复制
		....
			
		....

完整的例子

用到的技术和软件

  • Spring 4.2.0.RELEASE
  • Apache Commons fille-upload 1.3.1
  • validation-api 1.1.0.Final
  • Bootstrap v3.3.2
  • Maven 3
  • JDK 1.7
  • Tomcat 8.0.21
  • Eclipse JUNO Service Release 2

项目结构

在pom.xml文件中声明依赖

代码语言:javascript
复制
  4.0.0
  com.websystique.springmvc
  Spring4MVCFileUploadCommonsExample
  war
  1.0.0
  Spring4MVCFileUploadCommonsExample Maven Webapp
  http://maven.apache.org
  
  
    
		4.2.0.RELEASE
	

	
		
			org.springframework
			spring-webmvc
			${springframework.version}
		

		
			commons-fileupload
			commons-fileupload
			1.3.1
		

		
		
            javax.validation
            validation-api
            1.1.0.Final
        

		
		
			javax.servlet
			javax.servlet-api
			3.1.0
		
		
			javax.servlet
			jstl
			1.2
		
	


	
		
			
				
					org.apache.maven.plugins
					maven-compiler-plugin
					3.2
					
						1.7
						1.7
					
				
				
					org.apache.maven.plugins
					maven-war-plugin
					2.4
					
						src/main/webapp
						Spring4MVCFileUploadCommonsExample
						false
					
				
			
		

		Spring4MVCFileUploadCommonsExample

创建配置类

代码语言:javascript
复制
package com.websystique.springmvc.configuration;

import java.io.IOException;

import org.springframework.context.MessageSource;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.support.ResourceBundleMessageSource;
import org.springframework.web.multipart.commons.CommonsMultipartResolver;
import org.springframework.web.servlet.config.annotation.EnableWebMvc;
import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry;
import org.springframework.web.servlet.config.annotation.ViewResolverRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter;
import org.springframework.web.servlet.view.InternalResourceViewResolver;
import org.springframework.web.servlet.view.JstlView;

@Configuration
@EnableWebMvc
@ComponentScan(basePackages = "com.websystique.springmvc")
public class HelloWorldConfiguration extends WebMvcConfigurerAdapter{

	@Bean(name="multipartResolver") 
	public CommonsMultipartResolver getResolver() throws IOException{
		CommonsMultipartResolver resolver = new CommonsMultipartResolver();
		
		//Set the maximum allowed size (in bytes) for each individual file.
		resolver.setMaxUploadSizePerFile(5242880);//5MB
		
		//You may also set other available properties.
		
		return resolver;
	}

	@Override
    public void configureViewResolvers(ViewResolverRegistry registry) {
        InternalResourceViewResolver viewResolver = new InternalResourceViewResolver();
        viewResolver.setViewClass(JstlView.class);
        viewResolver.setPrefix("/WEB-INF/views/");
        viewResolver.setSuffix(".jsp");
        registry.viewResolver(viewResolver);
    }
    
	@Bean
    public MessageSource messageSource() {
        ResourceBundleMessageSource messageSource = new ResourceBundleMessageSource();
        messageSource.setBasename("messages");
        return messageSource;
    }
	
    @Override
    public void addResourceHandlers(ResourceHandlerRegistry registry) {
        registry.addResourceHandler("/static/**").addResourceLocations("/static/");
    }

}

配置里面最重要的是  CommonsMultipartResolver  Bean. 它是Apache Commons FileUpload里面的 MultipartResolver接口的实现。

你可以设置文件最大限制, headerEncoding 等,我们例子里只限制5M。

对应的XML配置形式:

代码语言:javascript
复制
            messages
        
    


    
        
            /WEB-INF/views/
        
        
            .jsp

创建模型类

Spring提供 org.springframework.web.multipart.MultipartFile  类代表上传的文件,提供getName(), getContentType(), getBytes(), getInputStream()等方法。

代码语言:javascript
复制
package com.websystique.springmvc.model;
 
import org.springframework.web.multipart.MultipartFile;
 
public class FileBucket {
 
    MultipartFile file;
     
    public MultipartFile getFile() {
        return file;
    }
 
    public void setFile(MultipartFile file) {
        this.file = file;
    }
}

包装类:

代码语言:javascript
复制
package com.websystique.springmvc.model;
 
import java.util.ArrayList;
import java.util.List;
 
public class MultiFileBucket {
 
    List files = new ArrayList();
     
    public MultiFileBucket(){
        files.add(new FileBucket());
        files.add(new FileBucket());
        files.add(new FileBucket());
    }
     
    public List getFiles() {
        return files;
    }
 
    public void setFiles(List files) {
        this.files = files;
    }
}

创建控制器类

代码语言:javascript
复制
package com.websystique.springmvc.controller;
 
import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
 
import javax.validation.Valid;
 
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.ModelMap;
import org.springframework.util.FileCopyUtils;
import org.springframework.validation.BindingResult;
import org.springframework.web.bind.WebDataBinder;
import org.springframework.web.bind.annotation.InitBinder;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.multipart.MultipartFile;
 
import com.websystique.springmvc.model.FileBucket;
import com.websystique.springmvc.model.MultiFileBucket;
import com.websystique.springmvc.util.FileValidator;
import com.websystique.springmvc.util.MultiFileValidator;
 
@Controller
public class FileUploadController {
 
    private static String UPLOAD_LOCATION="C:/mytemp/";
     
    @Autowired
    FileValidator fileValidator;
     
 
    @Autowired
    MultiFileValidator multiFileValidator;
 
     
    @InitBinder("fileBucket")
    protected void initBinderFileBucket(WebDataBinder binder) {
       binder.setValidator(fileValidator);
    }
 
 
    @InitBinder("multiFileBucket")
    protected void initBinderMultiFileBucket(WebDataBinder binder) {
       binder.setValidator(multiFileValidator);
    }
 
     
    @RequestMapping(value={"/","/welcome"}, method = RequestMethod.GET)
    public String getHomePage(ModelMap model) {
        return "welcome";
    }
 
    @RequestMapping(value="/singleUpload", method = RequestMethod.GET)
    public String getSingleUploadPage(ModelMap model) {
        FileBucket fileModel = new FileBucket();
        model.addAttribute("fileBucket", fileModel);
        return "singleFileUploader";
    }
 
    @RequestMapping(value="/singleUpload", method = RequestMethod.POST)
    public String singleFileUpload(@Valid FileBucket fileBucket, BindingResult result, ModelMap model) throws IOException {
 
        if (result.hasErrors()) {
            System.out.println("validation errors");
            return "singleFileUploader";
        } else {            
            System.out.println("Fetching file");
            MultipartFile multipartFile = fileBucket.getFile();
 
            //Now do something with file...
            FileCopyUtils.copy(fileBucket.getFile().getBytes(), new File(UPLOAD_LOCATION + fileBucket.getFile().getOriginalFilename()));
             
            String fileName = multipartFile.getOriginalFilename();
            model.addAttribute("fileName", fileName);
            return "success";
        }
    }
 
     
    @RequestMapping(value="/multiUpload", method = RequestMethod.GET)
    public String getMultiUploadPage(ModelMap model) {
        MultiFileBucket filesModel = new MultiFileBucket();
        model.addAttribute("multiFileBucket", filesModel);
        return "multiFileUploader";
    }
 
    @RequestMapping(value="/multiUpload", method = RequestMethod.POST)
    public String multiFileUpload(@Valid MultiFileBucket multiFileBucket, BindingResult result, ModelMap model) throws IOException {
 
         
        if (result.hasErrors()) {
            System.out.println("validation errors in multi upload");
            return "multiFileUploader";
        } else {            
            System.out.println("Fetching files");
            List fileNames= new ArrayList();
             
            //Now do something with file...
            for(FileBucket bucket : multiFileBucket.getFiles()){
                FileCopyUtils.copy(bucket.getFile().getBytes(), new File(UPLOAD_LOCATION + bucket.getFile().getOriginalFilename()));
                fileNames.add(bucket.getFile().getOriginalFilename());
            }
             
            model.addAttribute("fileNames", fileNames);
            return "multiSuccess";
        }
    }
     
     
     
}

Spring  FileCopyUtils 工具类,可以将流从一个地方拷贝到目标文件夹。例子中目标目录是 C:/mytemp 所有文件将传到这里。

创建Validators类

代码语言:javascript
复制
package com.websystique.springmvc.util;
 
import org.springframework.stereotype.Component;
import org.springframework.validation.Errors;
import org.springframework.validation.Validator;
 
import com.websystique.springmvc.model.FileBucket;
 
@Component
public class FileValidator implements Validator {
     
    public boolean supports(Class clazz) {
        return FileBucket.class.isAssignableFrom(clazz);
    }
 
    public void validate(Object obj, Errors errors) {
        FileBucket file = (FileBucket) obj;
         
        if(file.getFile()!=null){
            if (file.getFile().getSize() == 0) {
                errors.rejectValue("file", "missing.file");
            }
        }
    }
}
代码语言:javascript
复制
package com.websystique.springmvc.util;
 
import org.springframework.stereotype.Component;
import org.springframework.validation.Errors;
import org.springframework.validation.Validator;
 
import com.websystique.springmvc.model.FileBucket;
import com.websystique.springmvc.model.MultiFileBucket;
 
@Component
public class MultiFileValidator implements Validator {
     
    public boolean supports(Class clazz) {
        return MultiFileBucket.class.isAssignableFrom(clazz);
    }
 
    public void validate(Object obj, Errors errors) {
        MultiFileBucket multiBucket = (MultiFileBucket) obj;
         
        int index=0;
         
        for(FileBucket file : multiBucket.getFiles()){
            if(file.getFile()!=null){
                if (file.getFile().getSize() == 0) {
                    errors.rejectValue("files["+index+"].file", "missing.file");
                }
            }
            index++;
        }
         
    }
}

messages.properties

代码语言:javascript
复制
missing.file= Please select a file.

创建视图

singleFileUploader.jsp

代码语言:javascript
复制
<%@ page language="java" contentType="text/html; charset=ISO-8859-1" pageEncoding="ISO-8859-1"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<%@ taglib prefix="form" uri="http://www.springframework.org/tags/form"%>

 

    
    Spring 4 MVC File Upload Example
    
    

 
 
    
        Spring 4 MVC File Upload Example 
        
         
            
                
                    Upload a file
                    
                        
                        
                            
                        
                    
                
            
     
            
                
                    
                
            
        
        Home

success.jsp

代码语言:javascript
复制
<%@ page language="java" contentType="text/html; charset=ISO-8859-1" pageEncoding="ISO-8859-1"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>


    
    File Upload Success
    
    


    
        File  ${fileName} uploaded successfully.
        


        Home 

multiFileUploader.jsp

代码语言:javascript
复制
<%@ page language="java" contentType="text/html; charset=ISO-8859-1" pageEncoding="ISO-8859-1"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<%@ taglib prefix="form" uri="http://www.springframework.org/tags/form"%>

 

    
    Spring 4 MVC File Multi Upload Example
    
    

 
 
    
        Spring 4 MVC Multi File Upload Example 
        
         
            
                
                
                    
                
            
            

            
                
                    
                
            
        
         
        

        Home

multiSuccess.jsp

代码语言:javascript
复制
<%@ page language="java" contentType="text/html; charset=ISO-8859-1" pageEncoding="ISO-8859-1"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>


    
    File Upload Success
    
    


    
            
                File  ${fileName} uploaded successfully

            
            

        Home

welcome.jsp

代码语言:javascript
复制
<%@ taglib prefix="form" uri="http://www.springframework.org/tags/form"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>

 

    
    Spring 4 MVC File Upload Example
    
    


    
        Welcome to FileUploader Example
         
        Click on below links to see FileUpload in action.


         
        Single File Upload  OR  Multi File Upload

创建初始化类

代码语言:javascript
复制
package com.websystique.springmvc.configuration;
 
import org.springframework.web.servlet.support.AbstractAnnotationConfigDispatcherServletInitializer;
 
public class HelloWorldInitializer extends AbstractAnnotationConfigDispatcherServletInitializer {
  
 
    @Override
    protected Class[] getRootConfigClasses() {
        return new Class[] { HelloWorldConfiguration.class };
    }
   
    @Override
    protected Class[] getServletConfigClasses() {
        return null;
    }
   
    @Override
    protected String[] getServletMappings() {
        return new String[] { "/" };
    }
  
 }

构建部署和运行应用

在tomcat里面发布

访问 http://localhost:8080/Spring4MVCFileUploadCommonsExample/

点击 单文件上传链接:

如果没有选择文件直接点击“upload”

提示:请选择一个文件

选择文件

你可以去C:/mytemp 文件夹看看,文件是否传上去了

现在返回  选择  multi upload(多文件)上传链接

如果没有选择文件 直接点击上传也会有验证失败的提示:

选择文件:

查看上传的文件:

本文结束。下一篇将讲述 使用Spring 3.0指定api实现文件上传》

项目下载地址:http://websystique.com/?smd_process_download=1&download_id=1741

网盘链接: https://pan.baidu.com/s/1mqUczr0i4goBSNAehPd42A 密码: 5w3k

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2016/05/07 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • Spring MVC 4 文件上传下载 Hibernate+MySQL例子 (带源码)
    • 简单预览
      • 完整的例子
        • 项目结构
        • 在pom.xml文件中声明依赖
        • 创建配置类
        • 创建模型类
        • 创建控制器类
        • 创建Validators类
        • 创建视图
        • 创建初始化类
        • 构建部署和运行应用
    相关产品与服务
    云数据库 MySQL
    腾讯云数据库 MySQL(TencentDB for MySQL)为用户提供安全可靠,性能卓越、易于维护的企业级云数据库服务。其具备6大企业级特性,包括企业级定制内核、企业级高可用、企业级高可靠、企业级安全、企业级扩展以及企业级智能运维。通过使用腾讯云数据库 MySQL,可实现分钟级别的数据库部署、弹性扩展以及全自动化的运维管理,不仅经济实惠,而且稳定可靠,易于运维。
    领券
    问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档