Spring MVC 全注解的方式实现单个和多个文件上传

来源:互联网 发布:威纶通触摸屏编程手册 编辑:程序博客网 时间:2024/05/22 17:43

Spring MVC 全注解的方式实现单个和多个文件上传,文件上传限定文件的类型,spring mvc中 @InitBinder 对文件进行绑定,确定是单文件还是多文件上传。
message 的实体类,在HelloWorldConfiguration中自动装配,
CommonsMultipartResolver 限制文件上传的大小。

单文件model

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;}

}

多文件model 放到list集合当中

package com.websystique.springmvc.model;

import java.util.ArrayList;
import java.util.List;

public class MultiFileBucket {

List<FileBucket> files = new ArrayList<FileBucket>();public MultiFileBucket(){    files.add(new FileBucket());    files.add(new FileBucket());    files.add(new FileBucket());}public List<FileBucket> getFiles() {    return files;}public void setFiles(List<FileBucket> files) {    this.files = files;}

}

文件上传的controller

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="E:/study/Test_Workspace/Spring4MVCFileUploadCommonsExample/src/main/webapp/upload/";@AutowiredFileValidator fileValidator;@AutowiredMultiFileValidator 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<String> fileNames= new ArrayList<String>();        //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 mvc 的web-severlet 的配置(注解)

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;}@Overridepublic void configureViewResolvers(ViewResolverRegistry registry) {    InternalResourceViewResolver viewResolver = new InternalResourceViewResolver();    viewResolver.setViewClass(JstlView.class);    viewResolver.setPrefix("/WEB-INF/views/");    viewResolver.setSuffix(".jsp");    registry.viewResolver(viewResolver);}@Beanpublic MessageSource messageSource() {    ResourceBundleMessageSource messageSource = new ResourceBundleMessageSource();    messageSource.setBasename("messages");    return messageSource;}@Overridepublic void addResourceHandlers(ResourceHandlerRegistry registry) {    registry.addResourceHandler("/static/**").addResourceLocations("/static/");}

}

Spring MVC 配置(注解)

package com.websystique.springmvc.configuration;

import org.springframework.web.servlet.support.AbstractAnnotationConfigDispatcherServletInitializer;

public class HelloWorldInitializer extends AbstractAnnotationConfigDispatcherServletInitializer {

@Overrideprotected Class<?>[] getRootConfigClasses() {    return new Class[] { HelloWorldConfiguration.class };}@Overrideprotected Class<?>[] getServletConfigClasses() {    return null;}@Overrideprotected String[] getServletMappings() {    return new String[] { "/" };}

}

工具类 单文件验证 fileUtil

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");        }    }}

}

多文件验证

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++;    }}

}

pom.xml 文件配置

0 0
原创粉丝点击