将springboot项目部署到服务器,但原来很多地方写了绝对路径,所以我要做一些修改,原代码如下
@ApiOperation(value = "导入数据")
@PostMapping("/Data")
public String StoreDataBase(MultipartFile file) throws Exception {
try
{
String folder = "/Users/hjz/Documents/本科毕业设计/青藏科考/20210126测试/2020青藏科考滇藏线_07.23拷/images";
// 文件夹
File imgFolder = new File(folder);
// 获取文件名
String fname = file.getOriginalFilename();
// 获取文件后缀
String ext = "." + fname.substring(fname.lastIndexOf(".")+1);
//获取时间字符串
String dateTimeFormatter = DateTimeFormatter.ofPattern("yyyyMMddHHmmss").format(LocalDateTime.now());
// 生成新的文件名
String newFileName =dateTimeFormatter+ StringUtils.getRandomString(2) + ext;
// 文件在本机的全路径
File filePath = new File(imgFolder, newFileName);
file.transferTo(filePath);
return collectPointService.addData(newFileName);
}
catch (Exception e){
e.printStackTrace();
return "";
}
}
然后我想把保存路径变为resources下的static静态资源保存
所以我修改了代码如下
@ApiOperation(value = "导入数据")
@PostMapping("/Data")
public String StoreDataBase(MultipartFile file) throws Exception {
try
{
String staticPath = ClassUtils.getDefaultClassLoader().getResource("static").getPath();
String folder = staticPath+"/imagefile";
// 文件夹
File imgFolder = new File(folder);
// 获取文件名
String fname = file.getOriginalFilename();
// 获取文件后缀
String ext = "." + fname.substring(fname.lastIndexOf(".")+1);
//获取时间字符串
String dateTimeFormatter = DateTimeFormatter.ofPattern("yyyyMMddHHmmss").format(LocalDateTime.now());
// 生成新的文件名
String newFileName =dateTimeFormatter+ StringUtils.getRandomString(2) + ext;
// 文件在本机的全路径
File filePath = new File(imgFolder, newFileName);
file.transferTo(filePath);
return collectPointService.addData(newFileName);
}
catch (Exception e){
e.printStackTrace();
return "";
}
}
但是报错如下
java.io.IOException: java.io.FileNotFoundException: /Users/hjz/Desktop/Final%202/vue/vue-server/target/classes/static/imagefile/20220305154511ss.db (No such file or directory)
at org.apache.catalina.core.ApplicationPart.write(ApplicationPart.java:122)
首先我想问一下为了可以部署使用将文件存入静态资源的做法是否可行,可行的话请问应该如何解决上面遇到的问题呢
一般情况下,文件资源最好是存放到服务器指定路径下,而不是存放到源码所在的位置,一方面可以减小服务打包时的文件大小;另一方面,不便于管理,启动时反而增加服务的压力。最好的做法是在配置文件中添加一个可配置路径,代码中动态读取,后期可以根据需要手动修改配置文件即可
一般这种情况下,资源最好是跟源码分离存储,我们常采用的方式是在服务器另外新建一个文件夹用于存放项目的资源。在上传的时候,路径直接设置为线上环境,也就是服务器的文件夹地址(比如:/media/file/)。这样的话,在resources配置文件里面只需要修改文件地址即可,不用改动代码。
不建议这样做,对于上传文件的操作,如果是需要保存的文件建议创建特定目录,并将目录配置在数据库或者application.yml等配置文件中,在代码中获取相关路径后进行文件保存的操作;如果是不需要保存的文件,上传后解析完就需要删除的文件则直接保存到临时文件或者/tmp目录下就可以。
文件不能保存在程序文件中,就比如游戏更新,不可能玩着玩着就更新了,static中放的是静态文件
在服务器创建一个文件夹专门放你用的文件图片什么的,部署到服务器直接用服务器的路径就好了
需要把文件资源存放到服务器指定路径下,比如你的/etc下单独创建一个资源目录也可以放