spring mvc的文件上传模块是可插拔的,默认没有启用,只要在 spring mvc 容器中实例化 MultipartResolver 接口的实现类即可,spring mvc 为我们提供了整合了 commons-fileupload 的 CommonsMultipartResolver 解析器,只需实例化该类即可。
配置文件
解析器id必须是multipartResolver,否则spring将在上传超过3m文件时会报错!!!
jsp
Insert title here
java后台
@RequestMapping(value="/file")
@Controller
public class FileController {
@RequestMapping(value="/init")
public String init(){
return "file";
}
@RequestMapping(value="/upLoad")
@ResponseBody
public void upLoad(HttpServletRequest request) throws Exception{
//创建一个多分解的容器
CommonsMultipartResolver cmr = new CommonsMultipartResolver(request.getSession().getServletContext());
//设置编码
cmr.setDefaultEncoding("utf-8");
//判断是否有文件上传
if(cmr.isMultipart(request)){
//将request转换成多分解请求
MultipartHttpServletRequest mhs = cmr.resolveMultipart(request);
//根据input中存在的name来获取是否存在上传文件
MultipartFile mf = mhs.getFile("file");#这里可以用getFiles("file")的方式来处理多个文件。返回的是一个list.然后一个一个处理就可以了
//创建文件保存名
File file = new File(mf.getOriginalFilename());
//上传文件
mf.transferTo(file);
}
}
}
使用MultipartFile类的相关API完成文件上传
@Controller
public class FileUploadController {
private static final String UPLOAD_DIR = "/srv/www/upload/";
private static final long MAX_FILE_SISE = 1000000;
@RequestMapping("/upload")
public void uploadFile(@RequestParam("file") MultipartFile file) {
if(!file.isEmpty()) {
//获取文件类型
String contentType = file.getContentType();
if(!contentType.equals("")) {
//可以对文件类型进行检查
}
//获取input域的name属性
String name = file.getName();
//获取文件名,带扩展名
String originFileName = file.getOriginalFilename();
//获取文件扩展名
String extension = originFileName.substring(originFileName.lastIndexOf("."));
System.out.println(extension);
//获取文件大小,单位字节
long site = file.getSize();
if(site > MAX_FILE_SISE) {
//可以对文件大小进行检查
}
//构造文件上传后的文件绝对路径,这里取系统时间戳+文件名作为文件名
//不推荐这么写,这里只是举例子,这么写会有并发问题
//应该采用一定的算法生成独一无二的的文件名
String fileName = UPLOAD_DIR + String.valueOf(System.currentTimeMillis()) + extension;
try {
file.transferTo(new File(fileName));
} catch (Exception e) {
e.printStackTrace();
}
}
}
}