springMVC和SpringBoot使用MultipartFile上传单文件和多个文件非常的容易,springMVC是在Apache Commens FileUpload的技术上实现了一个MultipartResolver实现类,用到了MultipartFile类来接收参数。于是springMVC上传要Apache Commens FileUpload的组件,及它的jar包。
对于SpringBoot来说不用任何配置,只要在pom文件中添加依赖Apache Commens FileUpload的组件的就行。但是spring-boot也自带了org.springframework.web.multipart.MultipartFile,而且我们可以在application. properties配置文件限制上传文件的大小:
application. properties文件
# 上传文件总的最大值
spring.servlet.multipart.max-request-size=10MB
# 单个文件的最大值
spring.servlet.multipart.max-file-size=10MB
当然我们可以用java配置来配置MultipartResolver
@Bean
public MultipartResolver multipartResolver{
commonsMultipartResolver multipartResolver=new commonsMultipartResolver();
multipartResolver.setMaxUploadSize(100000);//设置上传最大
return multipartResolver;
}
因为不是SpringBoot,所以SpringMVC上下文中并没有默认装配MultipartResolver,所以我们要在MVC的配置文件中添加以下配置:
springmvc-config.xml文件
class="org.springframework.web.multipart.commons.CommonsMultipartResolver" id="multipartResolver">
-
name="maxUploadSize"> 10485760
name="defaultEncoding"> UTF-8
注意:记得添加commons-fileupload的jar包放到类路径下,也可以放在lib目录中。
1.普通上传,SpringMVc上传实列:
form表单
文件描述:
type="text" name="description">
请选择文件:
type="file" name="file">
type="submit" value="上传">
控制层接收
@Controller
public class FileUploadController{
// 上传文件会自动绑定到MultipartFile中
@RequestMapping(value="/upload",method=RequestMethod.POST)
public String upload(HttpServletRequest request,
@RequestParam("description") String description,
@RequestParam("file") MultipartFile file) throws Exception{
System.out.println(description);
// 如果文件不为空,写入上传路径
if(!file.isEmpty()){
// 上传文件路径
String path = request.getServletContext().getRealPath(
"/images/");
// 上传文件名
String filename = file.getOriginalFilename();
File filepath = new File(path,filename);
// 判断路径是否存在,如果不存在就创建一个
if (!filepath.getParentFile().exists()) {
filepath.getParentFile().mkdirs();
}
// 将上传文件保存到一个目标文件当中
file.transferTo(new File(path+File.separator+ filename));
return "success";
}else{
return "error";
}
}
}
SpringMVC会将上传的文件绑定在MultipartFile的对象中,而MultipartFile对象提供各种方法操作文件,还可以用transferTo()方法将文件存在磁盘中。常用的方法:
byte[] getBytes()获取文件数据
String getContentType() 获取mime信息,如image/jpeg
InputStream getInputStream 获取文件流
String getName()获取文件名
String getOriginalFilename() 获取文件原名
transferTo(File to) 将文件保存到目标文件中
注意:表单的method设置为post,enctype为multipart/form-data
2.当然我们也可以用对象来保存,这样更方便:
// 域对象,实现序列化接口
public class User implements Serializable{
private String description;
private MultipartFile file;
//setting方法和getting方法
}
@Controller
public class FileUploadController{
@RequestMapping(value="/upload")
public String register(HttpServletRequest request,
@ModelAttribute User user,
Model model)throws Exception{
System.out.println(user.getDescription());
}
}
这样我们就可以把附件和描述保存在User对象中了。
3.多文件上传接收
单文件的话只需要一个变量即,多文件上传的话就将MultipartFile改为数组,然后分别上传保存即可
type="file" name="file">
type="file" name="file">
type="file" name="file">
type="submit" value="提交">
@RequestMapping(value="/multiUpload", method=RequestMethod.POST )
public @ResponseBody String multipleSave(@RequestParam("file") MultipartFile[] files){
String fileName = null;
String msg = "";
if (files != null && files.length >0) {
for(int i =0 ;i< files.length; i++){
try {
fileName = files[i].getOriginalFilename();
byte[] bytes = files[i].getBytes();
BufferedOutputStream buffStream =
new BufferedOutputStream(new FileOutputStream(new File("/tmp/" + fileName)));
buffStream.write(bytes);
buffStream.close();
msg += "You have successfully uploaded " + fileName";
} catch (Exception e) {
return "You failed to upload " + fileName + ": " + e.getMessage();
}
}
return msg;
} else {
return "Unable to upload. File is empty.";
}
}
}
原创来源:滴一盘技术