单⽂件上传
jsp
<form action="uploadFile" method="post" enctype="multipart/form-data">
<input type="file" name="file" />
<button type="submit"> 提交</button>
</form>
文件上传都是以post方式上传,然后把格式改成二进制的(multipart/form-data)。然后是controller处理接收到的数据,最后把文件写入到本地webapp下的upload文件中。
controller层
@Controller
//文件上传
public class FileController {
@RequestMapping("uploadFile")
public ModelAndView uploadFile(@RequestParam("file") MultipartFile file, ModelAndView mv, HttpServletRequest request) {
// 判断⽂件是否为空,如果不为空进⾏对应的⽂件上传操作
if (!file.isEmpty()) {
try {
// 获取项⽬的所在的路径 (绝对路径)
String path = request.getServletContext().getRealPath("/");
// 设置上传的⽂件存放的⽬录
File uploadFile = new File(path + "/upload");
// 判断⽂件⽬录是否存在,不存在则新建⽬录
if (!uploadFile.exists()) {
// 新建⽬录
uploadFile.mkdir();
}
// 获取上传⽂件的原⽂件名
String originalName = file.getOriginalFilename();
// 获取上传的⽂件的后缀
String suffix =
originalName.substring(originalName.lastIndexOf("."));
// 通过系统当前时间的毫秒数,⽣成随机⽂件名 (避免上传的⽂件名重复)
String fileName = System.currentTimeMillis() + suffix;
// 上传⽂件 (转存⽂件到指定⽬录)
file.transferTo(new File(uploadFile, fileName));
// 设置成功的域对象
mv.addObject("msg", "⽂件上传成功!");
} catch (IOException e) {
e.printStackTrace();
// 如果报错,设置的域对象
mv.addObject("msg", "⽂件上传失败!");
}
} else {
// 上传⽂件不存在,设置的域对象
mv.addObject("msg", "⽂件不存在,上传失败!");
}
mv.setViewName("file");
return mv;
}
多⽂件上传
jsp
<form action="uploadFiles" method="post" enctype="multipart/form-data">
<input type="file" name="files" />
<input type="file" name="files" />
<input type="file" name="files" />
<button type="submit"> 提交</button>
</form>
controller层
public ModelAndView saveFile(MultipartFile file, ModelAndView mv, HttpServletRequest request) throws IOException {
// 判断⽂件是否为空,如果不为空进⾏对应的⽂件上传操作
if (!file.isEmpty()) {
// 获取项⽬的所在的路径 (绝对路径)
String path = request.getServletContext().getRealPath("/");
// 设置上传的⽂件存放的⽬录
File uploadFile = new File(path + "/upload");
// 判断⽂件⽬录是否存在,不存在则新建⽬录
if (!uploadFile.exists()) {
// 新建⽬录
uploadFile.mkdir();
}
// 获取上传⽂件的原⽂件名
String originalName = file.getOriginalFilename();
// 获取上传的⽂件的后缀
String suffix = originalName.substring(originalName.lastIndexOf("."));
// 通过系统当前时间的毫秒数,⽣成随机⽂件名 (避免上传的⽂件名重复)
String fileName = System.currentTimeMillis() + suffix;
// 上传⽂件 (转存⽂件到指定⽬录)
file.transferTo(new File(uploadFile, fileName));
// 设置成功的域对象
mv.addObject("msg", "⽂件上传成功!");
}
return mv;
}
@RequestMapping("/uploadFiles")
public ModelAndView uploadFiles(@RequestParam("files") List<MultipartFile> files, ModelAndView mv,
HttpServletRequest request) {
// 判断⽂件集合是否为空
if (files != null && files.size() > 0) {
try {
// 循环上传
for (MultipartFile file : files) {
// 上传⽂件
mv = saveFile(file, mv, request);
}
mv.addObject("msg","⽂件上传成功!");
} catch (IOException e) {
e.printStackTrace();
mv.addObject("msg","⽂件上传失败!");
}
}else {
mv.addObject("msg","⽂件不存在,上传失败!");
}
mv.setViewName("file");
return mv;
}
这里采用的是封装上传单文件为一个方法,然后接收到files调用封装的方法逐个接收写入到本地中。