您的位置:首页 > 编程语言 > Java开发

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

2015-10-08 19:23 567 查看
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){

a936
if (file.getFile().getSize() == 0) {
errors.rejectValue("files["+index+"].file", "missing.file");
}
}
index++;
}

}


}

pom.xml 文件配置
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息