問題展示
參考文章
百度易得,是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拼接路徑
不要直接
會報錯
他是這麼拼接路徑的