MultipartFile文件的上传
这篇文章中说道:
文件保存路径 :String filePath = request.getSession().getServletContext().getRealPath("/")
+ “upload/” + file.getOriginalFilename();
上传文件原名:file.getOriginalFilename();
转存文件 :file.transferTo(new File(filePath));
下面是我学习过程中看到的两个写法:
1.
@Controller
public class UploadController {
@RequestMapping("/uploadImage")
public ModelAndView upload(HttpServletRequest request, UploadedImageFile image) throws IOException {
String name= RandomStringUtils.randomAlphanumeric(10);
String newFileName=name+".jpg";
File file=new File(request.getServletContext().getRealPath("/image"),newFileName);
file.getParentFile().mkdirs();
image.getImage().transferTo(file);
ModelAndView modelAndView=new ModelAndView("showUploadedFile");
modelAndView.addObject("imageName",newFileName);
return modelAndView;
}
}
@RequestMapping(value = "upload",method = RequestMethod.POST)
public String upload(HttpServletRequest req, @RequestParam("file") MultipartFile file, Model m) {
try {
String filename=System.currentTimeMillis()+file.getOriginalFilename();
String destFileName=req.getServletContext().getRealPath("")+"uploaded"+ File.separator+filename;
System.out.println("req.getServletPath() = " + req.getServletContext());
System.out.println("req.getServletContext().getRealPath() = " + req.getServletContext().getRealPath(""));
File destFile=new File(destFileName);
destFile.getParentFile().mkdirs();
file.transferTo(destFile);
m.addAttribute("filename",filename);
}catch (FileNotFoundException e){
e.printStackTrace();
return "上传失败,"+e.getMessage();
}catch (IOException e){
e.printStackTrace();
return "上传失败,"+e.getMessage();
}
return "showImg";
}
这是第二种写法的输出:
可以总结:
获取文件的真是路径:request.getServletContext().getRealPath("")
上面三种写法虽然都大同小异,对比如下:
File file=new File(request.getServletContext().getRealPath("/image"),newFileName);
String destFileName=req.getServletContext().getRealPath("")+"uploaded"+ File.separator+filename;
可以看到getRealPath("")后面跟内容的话可以直接写+“uploaded"或者”/uploaded"或者这届写getRealPath("/uploaded")
获取真实路径后就可以先将其父目录生成,比如上面的upload目录
此时就用:
file.getParentFile().mkdirs();生成存文件的父目录
然后用spring提供的transferTo将上传的文件复制到那个目录
File file=new File(request.getServletContext().getRealPath("/image"),newFileName);
file.getParentFile().mkdirs();
image.getImage().transferTo(file);
这里上面(就我学习的两个项目)出现了两种写法:一个是这种将父路径与子路径分开写:
String name= RandomStringUtils.randomAlphanumeric(10);
String newFileName=name+".jpg";
File file=new File(request.getServletContext().getRealPath("/image"),newFileName);
一个是这种写在一起:
String filename=System.currentTimeMillis()+file.getOriginalFilename();
String destFileName=req.getServletContext().getRealPath("")+"/uploaded"+ File.separator+filename;
System.out.println("req.getServletContext().getRealPath() = " + req.getServletContext().getRealPath(""));
File destFile=new File(destFileName);
我估计是有这个File.separator分隔符的作用,然后可以识别这个路径的父目录,从而创建。
我觉得以后写的话还是将父目录与子目录分开写,不容易出错,于是我按照这种风格改了下,测试也没有错:
/* 注释的部分是springboot上面的,下面的是我按照之前在springmvc教程中的样子改的,经测试无问题*/
/*String filename=System.currentTimeMillis()+file.getOriginalFilename();
String destFileName=req.getServletContext().getRealPath("")+"/uploaded"+ File.separator+filename;
System.out.println("req.getServletContext().getRealPath() = " + req.getServletContext().getRealPath(""));
File destFile=new File(destFileName);
destFile.getParentFile().mkdirs();
file.transferTo(destFile);
m.addAttribute("filename",filename);*/
String filename=System.currentTimeMillis()+file.getOriginalFilename();
String directroy=req.getServletContext().getRealPath("/uploaded");
File destFile=new File(directroy,filename);
destFile.getParentFile().mkdirs();
file.transferTo(destFile);
m.addAttribute("filename",filename);