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

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/";

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

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

}

Spring MVC 配置(注解)

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[] { "/" };
}

}

工具类 单文件验证 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 文件配置

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值