前言
看标题好像很简单的样子, 但是针对使用 jar 包发布 SpringBoot 项目就不一样了.
当你使用 tomcat 发布项目的时候, 上传文件存放会变得非常简单, 因为你可以随意操作项目路径下的资源. 但是当你使用 SpringBoot 的 jar 包发布项目的时候, 你会发现, 你不能像以前一样操作文件了. 当你使用 File file = new File() 的时候根本不知道这个路径怎么办. 而且总不能很小的项目也给它构建一个文件服务器吧. 所以这次就来解决这样的问题.
不想知道细节的, 可以直接跳转到最后封装的部分, 里面有相应的实现.
原因
其实原因你也想的到, 你无法对 jar 包里面的资源进行操作, 而对于 springboot 项目来说, 你只能读取里面的文件, 只能使用 InputStream. 使用如下方式针对资源文件进行读取:
- ClassPathResource classPathResource = new ClassPathResource("static/a.txt");
- classPathResource.getInputStream();
其中, 这个 a.txt 存放在 resources/static 目录下
通过上述方式可以获取 a 中的内容
实现
因为我们无法操作 jar 包内容, 所以我们只能将文件存放在别的位置, 与 jar 包同级的目录是一个不错的选择.
首先获取根目录
- File path = new File(ResourceUtils.getURL("classpath:").getPath());
- if(!path.exists()) {
- path = new File("");
- }
然后获取需要的目录, 我们设定我们需要将文件存放在与 jar 包同级的 static 的 upload 目录下
- File upload = new File(path.getAbsolutePath(),"static/upload/");
- if(!upload.exists()) {
- upload.mkdirs();
- }
然后当我们要将上传的文件存储的时候, 按照下面的方式去新建文件, 然后使用你喜欢的方式进行存储就可以了.
- File upload = new File(path.getAbsolutePath(),"static/upload/test.jpg");
- FileUtils.copyInputStreamToFile(inputStream, uploadFile);
不要忘记
你需要在 application.YAML 配置中加入以下代码, 指定两个静态资源的目录, 这样你上传的文件就能被外部访问到了.
- spring:
- # 静态资源路径
- resources:
- static-locations: classpath:static/,file:static/
这样就能实现上传文件
最后的封装
工具类:
这个工具类依赖了
- compile group: 'commons-fileupload', name: 'commons-fileupload', version: '1.3.1'
- compile group: 'commons-io', name: 'commons-io', version: '2.4'
如何你不喜欢完全可以根据自己的喜欢改变
如何使用:
- /**
- * 测试文件上传
- */
- @RequestMapping("/upload")
- @ResponseBody
- public String upload(MultipartFile file) throws IOException {
- return "文件存放路径为" + FileHandleUtil.upload(file.getInputStream(), "image/", file.getOriginalFilename());
- }
最后效果

Follow up
这个工具类只是实现了如何上传文件, 入参也只有 InputStream, 后续如何你需要接入参数 File 或者加入文件名防重复等等, 就由你来完成了.
来源: https://www.cnblogs.com/linkstar/p/9938721.html