问题展示
参考文章
百度易得,是tomcat的问题,可以通过更改tomcat配置文件的方式解决,但是springboot项目他的tomcat是内嵌的,所以要用另一种方式解决
我查到的解决方式
博客地址链接
另一篇博客的解决
两个大同小异,综合理解理解终于解决了问题
但我觉得他们说的意思还是不清晰,还要修改信息的展示,我看着他的还是小半个小时
问题解决
1.写一个配置类
配置虚拟地址映射,这么理解这个方法
以截图中为例,我请求/Path/,就相当于是访问后面那个红框的地址
但是文件上传时好像不能这样请求
这样会直接上传失败
但是如果直接将绝对路径上传到数据库,访问就会出现Not allowed to load local resource:问题
我们想要请求图片展示时请求的是虚拟路径,那么我们可以这样
@Controller
public class FileController {
@GetMapping("/upload")
public String upload() {
return "upload";
}
@PostMapping("/upload")
@ResponseBody
public Map<String,Object> upload(@RequestParam("file") MultipartFile file, HttpServletRequest request, Model model) {
Map<String,Object> map = new HashMap<>();
map.put("code",0);
if (file.isEmpty()) {
map.put("msg","上传失败");
return map;
}
String fileName = UUID.randomUUID().toString().substring(0,5)+file.getOriginalFilename() ;
User user = (User) request.getSession().getAttribute("user");
//这个不能写到项目路径下,tomcat会访问不到
//上传还必须是绝对路径,不然他会上传失败
//那我能不能这里写个句对路径,但我实际往数据库中写的只有文件名,然后配置虚拟目录
// String filePath = "\\path\\"+user.getUsername()+"\\";
String filePath = "D:\\"+user.getUsername()+"\\";
//这里图片上传是用的绝对路径
System.out.println(filePath);
File dest = new File(filePath + fileName);
if (!dest.exists()){
dest.mkdirs();
}
Map<String,Object> data = new HashMap<>();
data.put("src",filePath+fileName);
try {
file.transferTo(dest);
map.put("msg","上传成功");
//之前传绝对路径的情况:
//map.put("url",filePath+fileName);
//这句话配合前端代码pushNeed来看
//这个map会作为json返回
//在前端可以获取到他的url,然后放到表单里,属性设置成隐藏,传到数据库
//在这里可以只传他的文件名,不传路径,然后请求的时候加路径就可以加配置得虚拟目录了
//map.put("url",fileName);
System.out.println("上传成功");
return map;
} catch (IOException e) {
map.put("msg","上传失败");
System.out.println("上传失败");
}
return map;
}
}
这样表单上传的时候就吧文件名也一起上传
传到数据库里是红框里的样子,只有文件名
可以看到另一条记录就是我为了恢复错误写的一条记录,是绝对路径
存的是相对路径
请求展示的时候
他的/Path/就会映射成D:/fzj/然后相当于是访问这个绝对路径下的内容
没加载出来的是之前传绝对路径的记录,现在又在前面加了虚拟路径,应该是会报404的。
注意点
thymeleaf拼接路径
不要直接
会报错
他是这么拼接路径的