一、SpringMVC实现文件上传
1.1.项目结构
1.1.2 控制器方法
@RequestMapping("/upload1.do")
public ModelAndView upload1(@RequestParam("file1") MultipartFile f1) throws IOException {
//获取文件名称
String originalFilename = f1.getOriginalFilename();
String destFilePath = String.format("D:\\Study\\techCode\\SpringMVC\\mvc05-multifile\\src\\main\\webapp\\upfile\\%s", originalFilename);
File destFile = new File(destFilePath);
//调用transferTo将上传的文件保存到指定的地址
f1.transferTo(destFile);
ModelAndView modelAndView = new ModelAndView();
modelAndView.setViewName("/WEB-INF/view/result.jsp");
modelAndView.addObject("msg", destFile.getAbsolutePath());
return modelAndView;
}
①一开始控制器方法里面的destFile 是绝对路径,可以在webapp下的upfile文件夹找到传入的文件
②我把destFile改为"src\\main\\webapp\\upfile\\%s"后,发现在upfile文件夹下找不到了,返回的msg为下面这个,他不会去找项目下的upfile文件夹,而是在tomcat安装目录下自己创建一个新的文件夹,我属实没想到
③然后我又去查阅资料,好家伙,资料没找到,又有难题来了,下面这个输出的path是什么呢,我以为是上下文路径,结果呵呵,你自己看,原来是到target目录下了,毕竟这是编译后的代码,getRealPath("/")主打的就是一个真实,按理来说这才是正确的方法
String path = request.getSession().getServletContext().getRealPath("/");
D:\Study\techCode\SpringMVC\mvc05-multifile\target\mvc05-multifile\
④我想着应该有可以访问上下文路径的方法吧,果不其然找到了
String contextPath = request.getSession().getServletContext().getContextPath();
⑤那么我们回到②中的问题,找了资料后发现没有什么有用的信息,然后我就去debug源码,看了半天,似乎是会去找路径,没找到的话就会自己在tomcat下创建,比如我改成xxx\\main\\webapp\\upfile\\%s,结果就在tomcat目录下创建了一个xxx文件夹
⑥如果我改成"\\src\\main\\webapp\\upfile\\%s",就会发现在D盘创建一个src文件夹,这里的\\应该代表的是D盘根路径,tmd真复杂
大家看除了写成绝对路径,还有没有能够获取到webapp目录的方法,请在评论区发表,万分感谢!!!
1.1.3 前端
<form method="post" action="upload1.do" enctype="multipart/form-data">
文件:<input type="file" name="file1"><br/>
<input type="submit" value="提交">
</form>
二、SpringBoot实现文件上传
2.1 项目结构
2.2 控制器方法
@RequestMapping("/upload1.do")
public String upload1(@RequestParam("file1") MultipartFile f1, HttpServletRequest request) throws IOException {
String path = request.getSession().getServletContext().getRealPath("/file");
System.out.println("打印path:" + path);
File f = new File(path);
//判断路径若不存在则创建
if (!f.exists()) {
f.mkdirs();
}
//获取当前时间用于给新文件命名
Date date = new Date();
//给出时间格式
SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyyMMddHHmmss");
//以此来作为新文件名的一部分
String fileName = simpleDateFormat.format(date);
/*获取原始文件名带扩展名*/
String allName = f1.getOriginalFilename();
System.out.println("原始文件名allName:" + allName);
/*获取扩展名 例如.doc */
String extName = allName.substring(allName.lastIndexOf("."));
System.out.println("扩展名extName:" + extName);
//将传过来的file
f1.transferTo(new File(path + "/" + fileName + extName));
return f.getAbsolutePath();
}
①我就是想看看这里的路径输出和MVC有什么不同,结果又要我大跌眼镜
C:\Users\yzh\AppData\Local\Temp\tomcat-docbase.8100.6395956201871802635\file
为什么又到C盘下去了呢?
原因分析:transferTo()方法调用时,判断如果是相对路径,则使用temp目录为父目录,因此保存在tomcat的临时work目录
②接着我想着能不能像MVC那样输出到target目录下呢?->找资料->把上面的path改为下面两个之一:
String path=ClassUtils.getDefaultClassLoader().getResource("").getPath()+"static/upload";
String path = ResourceUtils.getURL("classpath:").getPath() + "static/upload";
然后你直接访问http://localhost:port/upload/xxxx.jpg就可以直接看到文件了,omg!!!
③那么我想上传到static目录下怎么办呢?也只能写绝对路径吗?请在评论区发表,万分感谢!!!
三、获取resources下文件的方法
下面这三种方法获取的路径都是
D:\Study\techCode\SpringBoot\Boot-09-UploadFile\target\classes\1.txt
3.1 使用ResourceLoader
接口
String path = resourceLoader.getResource("classpath:1.txt").getFile().getPath();
3.2 使用ClassPathResource
类
String path = new ClassPathResource("1.txt").getPath();
3.3 使用ResourceUtils.getFile()
方法
File file = ResourceUtils.getFile("classpath:1.txt");
String path = file.getPath();
String absolutePath = file.getAbsolutePath();
String canonicalPath = file.getCanonicalPath();