最近写项目遇到一个需求就是要使用springboot上传文件,但有个问题,因为springboot内置tomcat,然后上传的文件就别放到了临时目录下面,这样文件很不安全也不符合业务应有的情况。
一般情况springboot直接打包成jar运行,我们上传的文件有不能放到jar包里面吧。
看了好多博客,终于尝试成功,现在记录一下:
在springboot中默认的静态资源路径有:classpath:/META-INF/resources/,classpath:/resources/,classpath:/static/,classpath:/public/
(都带有classpath,也就是在项目路径下的几个文件夹)
上传文件最好的方式是文件 和 项目分离,将静态资源文件放到磁盘的某个目录下面:
划重点,开始配置了
第一步:在application.properties
中增加配置项,如下:
# 自定义配置项
web.upload-path=/home/file
spring.mvc.static-path-pattern=/**
spring.resources.static-locations=classpath:/META-INF/resources/,classpath:/resources/,\
classpath:/static/,classpath:/public/,file:${web.upload-path}
web.upload-path这个属于自定义的属性,指定了一个路径,注意要以/结尾;
spring.mvc.static-path-pattern=/**表示所有的访问都经过静态资源路径;
spring.resources.static-locations在这里配置静态资源路径,前面说了这里的配置是覆盖默认配置,所以需要将默认的也加上,否则static、public等这些路径将不能被当作静态资源路径,在这里的最末尾加上file:${web.upload-path}。之所以要加file:是因为要在这里指定一个具体的硬盘路径,其他的使用classpath指定的是系统环境变量;
第二步: 在上传文件的时候,代码中写文件的位置的时候指定为咱配置的路径
例如:下面上传文件的代码中我指定了问价存储路径为配置中的/home/file
@RequestMapping(value = "/upload",method = RequestMethod.POST)
public ResponseBean upload(@RequestParam("file") MultipartFile file, HttpServletRequest request){
try {
if (file.isEmpty()){
System.out.println("文件为空...");
}
// 获取文件名称
String fileName = file.getOriginalFilename();
System.out.println("上传的文件名称为:" + fileName);
//获取文件名称的后缀
String suffixName = fileName.substring(fileName.lastIndexOf("."));
System.out.println("文件的后缀为:" + suffixName);
//设置文件存储路径
String filePath = "/home/file/";
String path = filePath + fileName;
System.out.println(path);
File dest = new File(path);
//检测目录是否存在
if (!dest.getParentFile().exists()){
dest.getParentFile().mkdirs();
}
file.transferTo(dest);
System.out.println("文件上传成功!");
} catch (IOException e) {
e.printStackTrace();
}
return null;
}
配置好了
接下来 你通过代码上传一个文件,例如上传了图片 a.jpg
然后在浏览器中访问一下试试:
http://localhost:端口号/a.jpg