当前位置: 首页 > 编程笔记 >

SpringBoot上传文件到本服务器 目录与jar包同级问题

张鹏鹍
2023-03-14
本文向大家介绍SpringBoot上传文件到本服务器 目录与jar包同级问题,包括了SpringBoot上传文件到本服务器 目录与jar包同级问题的使用技巧和注意事项,需要的朋友参考一下

前言

看标题好像很简单的样子,但是针对使用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.yml配置中加入以下代码,指定两个静态资源的目录,这样你上传的文件就能被外部访问到了。

spring:
# 静态资源路径
resources:
static-locations: classpath:static/,file:static/

这样就能实现上传文件

最后的封装

工具类:

https://github.com/LinkinStars/springBootTemplate/blob/master/src/main/java/com/linkinstars/springBootTemplate/util/FileHandleUtil.java

这个工具类依赖了

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或者加入文件名防重复等等,就由你来完成了。

总结

以上所述是小编给大家介绍的SpringBoot上传文件到本服务器 目录与jar包同级问题,希望对大家有所帮助,如果大家有任何疑问欢迎给我留言,小编会及时回复大家的!

 类似资料:
  • 本文向大家介绍Java如何实现上传文件到服务器指定目录,包括了Java如何实现上传文件到服务器指定目录的使用技巧和注意事项,需要的朋友参考一下 前言需求 使用freemarker生成的静态文件,统一存储在某个服务器上。本来一开始打算使用ftp实现的,奈何老连接不上,改用jsch。毕竟有现成的就很舒服,在此介绍给大家。 具体实现 引入的pom 建立实体类 建立文件上传工具类 @Configurati

  • 是否可以使用server1将文件上传到server2? 访客请访问:我的网站。com(server1) 然后他将一个文件上传到server1,server1会自动将该文件上传到server2?? 或者简单地说,用户可以使用server1作为代理将文件上传到server2,因为server2只能从server1访问 会有帮助吗,还是有其他更好的解决方案?

  • 问题内容: 我正在使用Apache Commons FTP上传文件。上传之前,我想检查服务器上是否已存在该文件,并将其备份到同一服务器上的备份目录中。 有谁知道如何将文件从FTP服务器复制到同一服务器上的备份目录? 编辑代码: 仍然存在问题,当我备份zip文件时,备份的文件已损坏。 有人知道原因吗? 问题答案: 如果您使用的是apache commons net ,则有一种直接方法将文件从一个位置

  • 本文向大家介绍解决springboot项目上传文件出现临时文件目录为空的问题,包括了解决springboot项目上传文件出现临时文件目录为空的问题的使用技巧和注意事项,需要的朋友参考一下 最近写文件上传到服务器读取的代码,前端使用FormData上传,服务端用MultipartFile接收,自己测试了下MultipartFile对象有什么东西,结果一般属性都能出来,测试getInputStrea(

  • 我试图将我的Laravel项目上传到我的网络服务器,但我过去的两次尝试都没有成功。我相信我没有上传文件到正确的位置。 我说我需要将我所有的laravel文件上传到public_html中,对吗? 这是我的Laravel项目的目录: 编辑:我现在已经将所有文件添加到根文件夹中,并将public添加到public_html中,但是我的路由似乎都不起作用。(它们在本地主机上工作得非常好)。所有东西都会抛

  • 我想将文件上载到ftps服务器。下面的代码适用于10KB这样的小文件。但我需要上传5-10 MB的文件。错误出现在下面的错误行中。有人能帮我吗?下面是我尝试的代码。有没有更好的方法? 错误行 代码 错误消息 org.apache.commons.net.io.CopyStreamException: IOException在复制时捕获。在org.apache.commons.net.io.Util