如何解決SpringBoot集成百度UEditor圖片上傳后直接訪問(wèn)404
SpringBoot項(xiàng)目上傳圖片一般是上傳至遠(yuǎn)程服務(wù)器存儲(chǔ),開(kāi)發(fā)過(guò)程中可能會(huì)上傳至當(dāng)前項(xiàng)目的某個(gè)靜態(tài)目錄中,此時(shí)就會(huì)遇到這個(gè)問(wèn)題,文件在上傳之后直接訪問(wèn)并不能被訪問(wèn)到,必須重新加載項(xiàng)目。
首先分析一下原因:
我們知道,如果使用類似 /upload/image/1.jpg 這種格式進(jìn)行圖片的訪問(wèn)的時(shí)候,SpringBoot讀取的并不是本項(xiàng)目中直接的靜態(tài)目錄,而是在進(jìn)行編譯的時(shí)候生成target目錄下的文件,如下圖所示:

那么問(wèn)題就來(lái)了,我們?cè)谶\(yùn)行的過(guò)程中上傳一個(gè)圖片的話,并不能重新加載當(dāng)前這個(gè)項(xiàng)目,也就是target目錄下的文件一直是之前的文件,盡管有人說(shuō)我進(jìn)行了SpringBoot熱部署(dev-tools),能夠自動(dòng)重新加載項(xiàng)目,但是問(wèn)題是熱部署也需要一定的時(shí)間去分析和重新加載項(xiàng)目,所以上傳文件后直接進(jìn)行訪問(wèn)肯定就不能實(shí)現(xiàn)了。
簡(jiǎn)單來(lái)說(shuō):文件只是單純的上傳到項(xiàng)目的文件夾中,并沒(méi)有在target目錄下生成對(duì)應(yīng)的文件,導(dǎo)致訪問(wèn)不到。
在網(wǎng)上看了一個(gè)博客,說(shuō)可以在將文件復(fù)制到本地的時(shí)候也將文件復(fù)制到項(xiàng)目的target目錄下,這樣就可以訪問(wèn)了,聽(tīng)著也非常的有道理,但是實(shí)踐出真知,經(jīng)過(guò)我的測(cè)試,并不能實(shí)現(xiàn),不知道是因?yàn)槲业膯?wèn)題還是什么,所以并不推薦大家使用這個(gè)方法,當(dāng)然感興趣的也可以測(cè)試一下,畢竟這個(gè)聽(tīng)著是真的很有道理。
解決辦法:配置映射路徑攔截器,將虛擬路徑映射為真是圖片地址,達(dá)到回顯的目的(已測(cè)試,有效)
簡(jiǎn)單來(lái)說(shuō)就是將UEditor要訪問(wèn)的路徑映射成為本地的路徑,廢話不多說(shuō)直接上代碼:
注:SpringBoot1版本是extends WebMvcConfigurerAdapter類,SpringBoot2版本是implements WebMvcConfigurer,這個(gè)地方有點(diǎn)不一樣
@Override
public void addResourceHandlers(ResourceHandlerRegistry registry){
registry.addResourceHandler("swagger-ui.html").addResourceLocations("classpath:/META-INF/resources/");
registry.addResourceHandler("/webjars/**").addResourceLocations("classpath:/META-INF/resources/webjars/");
registry.addResourceHandler("/static/ueditor/**").addResourceLocations("classpath:/static/ueditor/");
registry.addResourceHandler("/public/**").addResourceLocations("classpath:/public/");
registry.addResourceHandler("/static/upload/image/**").addResourceLocations("file:" + UploadUtils.getImgDirFile().getAbsolutePath() + "/"); //添加這一行
}
UploadUtils.java
public class UploadUtils {
// 項(xiàng)目根路徑下的目錄 -- SpringBoot static 目錄相當(dāng)于是根路徑下(SpringBoot 默認(rèn))
public final static String IMG_PATH_PREFIX = "static/upload/image";
public static File getImgDirFile(){
// 構(gòu)建上傳文件的存放 "文件夾" 路徑
String fileDirPath = new String("src/main/resources/" + IMG_PATH_PREFIX);
File fileDir = new File(fileDirPath);
if(!fileDir.exists()){
// 遞歸生成文件夾
fileDir.mkdirs();
}
return fileDir;
}
}
重點(diǎn)在于getAbsolutePath()方法,這個(gè)函數(shù)的作用是獲取當(dāng)前項(xiàng)目在當(dāng)前運(yùn)行環(huán)境下的絕對(duì)路徑,如我現(xiàn)在在開(kāi)發(fā)過(guò)程中獲得的結(jié)果就是D:\WorkSpace\IDEA-WorkSpace\......
設(shè)置完畢之后就可以正常顯示了。
注:如果你所使用的是SpringBoot多模塊項(xiàng)目,那么通過(guò)這個(gè)方法獲取到的往往是父項(xiàng)目所在的地址,因此也會(huì)出現(xiàn)問(wèn)題,解決這個(gè)問(wèn)題的辦法是配置當(dāng)前項(xiàng)目啟動(dòng)類的工作環(huán)境是在具體的某個(gè)項(xiàng)目

設(shè)置完畢后即可解決這個(gè)問(wèn)題
附:之前在說(shuō)這個(gè)問(wèn)題的時(shí)候,也有人給我提了一個(gè)建議,就是不將圖片放置在項(xiàng)目中,而是放置在某個(gè)固定的盤符中,這樣返回請(qǐng)求路徑的時(shí)候直接請(qǐng)求本地地址,等將來(lái)發(fā)布到服務(wù)器的時(shí)候使用Nginx。
不過(guò)問(wèn)題是我對(duì)Nginx并不是很了解,所以等我學(xué)會(huì)了Nginx之后再來(lái)完善吧,你們可以先替我試試好不好用
以上就是本次介紹的關(guān)于SpringBoot圖片上傳404的全部知識(shí)點(diǎn)內(nèi)容,感謝大家的學(xué)習(xí)和對(duì)腳本之家的支持。
相關(guān)文章
android顯示意圖激活另一個(gè)Activity的方法
下面小編就為大家?guī)?lái)一篇android顯示意圖激活另一個(gè)Activity的方法。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-06-06
SpringBoot整合ip2region獲取客戶端IP地理位置信息
在我們?nèi)粘EB開(kāi)發(fā)工作中,經(jīng)常會(huì)有需要獲取客戶端地理位置的需求,本文主要介紹了SpringBoot整合ip2region獲取客戶端IP地理位置信息,具有一定的參考價(jià)值,感興趣的可以了解一下2024-08-08
PowerJob的DispatchStrategy方法工作流程源碼解讀
這篇文章主要為大家介紹了PowerJob的DispatchStrategy方法工作流程源碼解讀,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2024-01-01
springboot自定義日志注解的實(shí)現(xiàn)
本文主要介紹了springboot自定義日志注解的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-03-03
Java中如何快速構(gòu)建項(xiàng)目腳手架的實(shí)現(xiàn)
這篇文章主要介紹了Java中如何快速構(gòu)建項(xiàng)目腳手架,文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-05-05
SpringBoot+MyBatisPlus+Vue 前后端分離項(xiàng)目快速搭建過(guò)程(前端篇)
這篇文章主要介紹了SpringBoot+MyBatisPlus+Vue 前后端分離項(xiàng)目快速搭建過(guò)程(前端篇),本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-05-05
Java集合中的fail-fast(快速失敗)機(jī)制詳解
這篇文章主要給大家介紹了關(guān)于Java集合中fail-fast(快速失敗)機(jī)制的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2021-02-02
java通過(guò)snmp協(xié)議獲取物理設(shè)備信息
這篇文章主要介紹了java通過(guò)snmp協(xié)議獲取物理設(shè)備信息,snmp中文含義是簡(jiǎn)單網(wǎng)絡(luò)管理協(xié)議,可用完成對(duì)計(jì)算機(jī)、路由器和其他網(wǎng)絡(luò)設(shè)備的遠(yuǎn)程管理和監(jiān)視,本文我們是通過(guò)java程序來(lái)獲取,需要的朋友可以參考下2023-07-07

