springboot 上传文件保存
File
注意:File对象其本质只是表示一个路径
构造函数:File(String pathname),该参数pathname可以是绝对路径也可以是相对路径(如果是相对路径的话会默认表示成在该项目之下,建议使用绝对路径更容易把控)
public boolean exists();测试改文件或目录是否存在
public boolean mkdirs();创建此抽象路径名指定的目录,包括创建必需但不存在的父目录(注意,这个方法只能创建目录而不能创建文件)
public boolean mkdir();创建此抽象路径名指定的单个目录(注意,这个方法只能创建目录而不能创建文件)
boolean createNewFile();创建单个文件,作用与mkdir()相似都不能创建必需但不存在的父目录,区别是mkdir()创建的是目录,createNewFile()创建的是文件
MultipartFile
multipartfile是spring提供的类,专门用于获取"multipart/form"提交的文件
String getOriginalFilename();获取原文件名
void transferTo(File dest);将文件转移到目标文件中
transferTo()方法很强大,不仅仅是将文件输入输出进行了封装,提高了开发效率,更重要的是其可以将文件夹直接变为文件
(即:multipartfile.transferTo(file)中,当file代表的是一个目录时,正常情况文件是无法输入的,而transferTo()方法会将该目录直接变为文件并输入数据)
ClassUtilsClassUtils是spring提供的类
最常用的方法是ClassUtils.getDefaultClassLoader().getResource("").getPath():可以获取classes目录绝对路径,获取当前项目的classes绝对路径。
ClassUtils来自spring框架,getDefaultClassLoader()返回类加载器(ClassLoader类)
注意:getResource("")中的参数为空字符串
URLDecoder
是Java自带的类,里面只有一个方法:URLDecoder.decode(String s, String enc),用于解决URL的编码问题
例如在springboot需要获取项目的classes路径时,若路径上包含有空格,取得的字符串就需要用 URLDecoder.decode(string,"utf-8") 才能将空格显示出来
案例
@RestController
public class Test18 {
/*
* 接收文件
* 更改文件名并存放文件
* 返回json
* */
@PostMapping("test18")
public String Test18(HttpServletRequest request, @RequestParam("file") MultipartFile file) throws UnsupportedEncodingException {
String filename = file.getOriginalFilename();
String filetype = filename.substring(filename.lastIndexOf("."));
String newfile = UUID.randomUUID()+filetype;
String classespath = ClassUtils.getDefaultClassLoader().getResource("").getPath();
/*解决文件路径中的空格问题*/
String decodeClassespath = URLDecoder.decode(classespath,"utf-8");
System.out.println(decodeClassespath);
/**/
File file1 = new File(decodeClassespath+"/image"+"/test"+"/"+newfile);
if(!file1.exists()){
file1.mkdirs();
}
try {
file.transferTo(file1);
return "上传成功";
} catch (IOException e) {
e.printStackTrace();
}
return "上传失败";
}
}