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

原文地址:https://www.cnblogs.com/linkstar/p/9938721.html

时间: 2025-01-10 07:50:26

SpringBoot上传文件到本服务器 目录与jar包同级的相关文章

SpringBoot 上传文件到linux服务器 异常java.io.FileNotFoundException: /tmp/tomcat.50898……解决方案

SpringBoot 上传文件到linux服务器报错java.io.FileNotFoundException: /tmp/tomcat.50898-- 报错原因: 解决方法 java.io.IOException: java.io.FileNotFoundException: /tmp/tomcat.5089835798184465073.8081/work/Tomcat/localhost/ROOT/www/server/apache-tomcat-8.5.32/webapps/jxmsto

C# 上传文件至远程服务器

C# 上传文件至远程服务器(适用于桌面程序及web程序) 2009-12-30 19:21:28|  分类: C#|举报|字号 订阅 最近几天在玩桌面程序,在这里跟大家共享下如何将本地文件上传到远程服务器上面. 注意,我在这里使用的是WebClient而不是ftp 首先,我们先来定义一个类UpLoadFile,这个类就是文件上传类.代码如下: public void UpLoadFile(string fileNamePath, string uriString, bool IsAutoRena

putty windows上传文件到linux服务器 & 从linux服务器 下载文件到 windows

从putty官网下载putty软件:putty.exepscp.exepsftp.exe等软件 也可以自己下windows安装包putty-0.63-installer.exe 本人直接下载putty-0.63-installer.exe安装包了,然后直接安装 使用pscp方式从windows上传文件到linux服务器 在CMD命令行中进入到putty安装目录 输入pscp 回车 pscp 跟我们平时使用的linux scp命令操作的都是类似的 现在我直接从windows本地上传一个文件到lin

git 上传文件到远程服务器

当你想要上传文件到git服务器上,需要做一下流程: 一开始走的流程是:1.本地初始化一个git库2.关联远程库 1.本地初始化一个git库 在你要上传的文件夹中打开命令窗口:git init:然后他会自动生成.git文件 2.关联远程库:命令行:git remote add origin xxxxx 3.进入克隆下来的文件夹:cd test2(这里一定要进入文件夹,不然会报很多错误,等下下面有报错的问题) 4.先提交文件 git add .   (这里的  .  是指提交全部文件) 5.ls (

安卓上传文件至PHP服务器

前两个月有幸参加一次免费培训,开发了一款小软件.发现AsyncHttpClient还真是好用. 直奔主题,安卓上传文件至PHP服务器: 1.PHP端服务器: <?php //链接数据库 include ("config/db.php"); //获取用户id $userid = $_POST['userid']; //处理上传文件 $base_path = "upload/"; $fileName=$_FILES['file']['name']; $name=e

Android端上传文件到Web服务器

本文中主要就Android端上传文件到Web服务器,做出的一个简单的Demo 1.Tomcat上部署的服务端的实现 2.Android端的代码实现 1.Tomcat服务器上面项目的部署与实现 创建一个Web Project 创建FileUploadServlet.java,当然,一下两个重要的Jar包不能够忘记! commons-fileupload-1.2.2.jar commons-io-2.0.1.jar FileUploadServlet.java import java.io.File

sftp方式从windows上传文件到Linux服务器

今天我一直用scp想实现从windows上传文件到Linux服务器,但是鼓捣了半天也没有实现.后来查资料才发现,scp实现文件的上传和下载貌似只能在Linux和Linux之间实现.(欢迎指正不对的地方) 后来开始转用sftp来解决上述问题,其中也是遇到了不少坑,下面说一下比较合理的步骤: 首先声明,我是在Windows上通过xshell5来连接远程服务器的,连接成功后如下图: 然后用sftp连接远程服务器:sftp 192.168.167.178: 再然后,修改本地上传的文件夹路径:先点击这个按

springboot上传文件 &amp; 不配置虚拟路径访问服务器图片 &amp; springboot配置日期的格式化方式

1.    Springboot上传文件 springboot的文件上传不用配置拦截器,其上传方法与SpringMVC一样 @RequestMapping("/uploadPicture") @ResponseBody public JSONResultUtil uploadPicture(MultipartFile file, Integer viewId) { if (file == null) { return JSONResultUtil.error("文件没接到&q

springBoot 上传文件到服务器,头像预览功能

sprijngBoot 2.x版本不需要添加依赖包,soringBoot以及集成好了 一: 上传文件 controller接受层 @PostMapping(value = "/fileUpload")public String fileUpload(@RequestParam(value = "file") MultipartFile file, ModelMap model, HttpServletRequest request) { if (file.isEmp