1.问题描述:
使用springboot
开发一个项目,开发文件上传的时候,通常会将上传的文件存储到资源目录下的static
里面,然后在本地测试上传文件功能没有问题,但是将项目打成jar包放到服务器上运行的时候就会报错,找不到对应目录。或者可以将上传文件存储到和jar包同级的目录下,但是无法通过http
访问到文件
2.项目打成jar包后如何设置文件资源存储路径
!!!保存上传的资源文件路径,路径在部署jar包同级目录
//这里 /img/uploadFile/ 可以更改为不同层级的目录,可以跟开发时的静态目录统一
String path = System.getProperty("user.dir")+"/static/img/uploadFile/";
File dir = new File(path);
// 如果不存在则创建目录
if(!dir.exists()){
dir.mkdirs();
}
3.设置http访问上传的静态资源文件
在项目中创建一个config
包,然后新建一个java类uploadConfig
,用来设置上传的路径
package com.curry.config;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
@Configuration
public class uploadConfig implements WebMvcConfigurer {
@Override
public void addResourceHandlers(ResourceHandlerRegistry registry) {
registry.addResourceHandler("/static/**").addResourceLocations("classpath:/static/","file:static/");
}
}
接下来就可以通过http://ip:port/img/uploadFile/test.png
来访问该文件了
如果static的目录结构和项目里面的一样的话,就跟访问打jar
包前一样访问即可,相当于通过目录结构访问相应的文件。
完整代码
package com.xxx.xxx.xxxx.controller;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.multipart.MultipartFile;
import java.io.File;
import java.io.IOException;
import java.util.Calendar;
@Controller
@RequestMapping("/admin")
public class UploadController {
@RequestMapping("/upload")
public String upload(MultipartFile file,
Model model) throws IOException {
//校验文件是否为空
if (file.isEmpty()){
model.addAttribute("path","请选择文件上传!");
return "admin/upload";
}
//图片重命名,防止图片名称重复,可以使用时间戳或者UUID生成,我这里不需要担心文件名重复,所以没做
String originalFilename = file.getOriginalFilename();
String filename = originalFilename;
//上传图片,并判断是否有年份文件夹
Calendar calendar = Calendar.getInstance();
int year = calendar.get(Calendar.YEAR);
// String pre = System.getProperty("user.dir") + "/src/main/resources/static/img/paper/" + year +"/";
String pre = System.getProperty("user.dir") + "/static/img/paper/" + year +"/";
//file.mkdir创建一个文件夹,成功则返回true,失败则返回false。失败表明File对象指定的路径已经存在,或者由于整个路径还不存在,该文件夹不能被创建。
File file1 = new File(pre);
file1.mkdir();
String path = pre + filename;
file.transferTo(new File(path));
model.addAttribute("path",path);
return "admin/upload";
}
}