SpringBoot集成百度UEditor圖片上傳後直接訪問404解決辦法

SpringBoot項目上傳圖片通常是上傳至遠程服務器存儲,開發過程當中可能會上傳至當前項目的某個靜態目錄中,此時就會遇到這個問題,文件在上傳以後直接訪問並不能被訪問到,必須從新加載項目。html

首先分析一下緣由:java

咱們知道,若是使用相似 /upload/image/1.jpg 這種格式進行圖片的訪問的時候,SpringBoot讀取的並非本項目中直接的靜態目錄,而是在進行編譯的時候生成target目錄下的文件,以下圖所示:web

 

 那麼問題就來了,咱們在運行的過程當中上傳一個圖片的話,並不能從新加載當前這個項目,也就是target目錄下的文件一直是以前的文件,儘管有人說我進行了SpringBoot熱部署(dev-tools),可以自動從新加載項目,可是問題是熱部署也須要必定的時間去分析和從新加載項目,因此上傳文件後直接進行訪問確定就不能實現了。服務器

簡單來講:文件只是單純的上傳到項目的文件夾中,並無在target目錄下生成對應的文件,致使訪問不到。ide

在網上看了一個博客,說能夠在將文件複製到本地的時候也將文件複製到項目的target目錄下,這樣就能夠訪問了,聽着也很是的有道理,可是實踐出真知,通過個人測試,並不能實現,不知道是由於個人問題仍是什麼,因此並不推薦你們使用這個方法,固然感興趣的也能夠測試一下,畢竟這個聽着是真的頗有道理。函數

解決辦法:配置映射路徑攔截器,將虛擬路徑映射爲真是圖片地址,達到回顯的目的(已測試,有效測試

簡單來講就是將UEditor要訪問的路徑映射成爲本地的路徑,廢話很少說直接上代碼:
注:SpringBoot1版本是extends WebMvcConfigurerAdapter類,SpringBoot2版本是implements WebMvcConfigurer,這個地方有點不同ui

1    @Override
2     public void addResourceHandlers(ResourceHandlerRegistry registry){
3          registry.addResourceHandler("swagger-ui.html").addResourceLocations("classpath:/META-INF/resources/");
4          registry.addResourceHandler("/webjars/**").addResourceLocations("classpath:/META-INF/resources/webjars/");
5          registry.addResourceHandler("/static/ueditor/**").addResourceLocations("classpath:/static/ueditor/");
6          registry.addResourceHandler("/public/**").addResourceLocations("classpath:/public/");
7          registry.addResourceHandler("/static/upload/image/**").addResourceLocations("file:" + UploadUtils.getImgDirFile().getAbsolutePath() + "/");  //添加這一行
8     }

UploadUtils.javaspa

public class UploadUtils {

    // 項目根路徑下的目錄  -- SpringBoot static 目錄至關因而根路徑下(SpringBoot 默認)
    public final static String IMG_PATH_PREFIX = "static/upload/image";

    public static File getImgDirFile(){

        // 構建上傳文件的存放 "文件夾" 路徑
        String fileDirPath = new String("src/main/resources/" + IMG_PATH_PREFIX);

        File fileDir = new File(fileDirPath);
        if(!fileDir.exists()){
            // 遞歸生成文件夾
            fileDir.mkdirs();
        }
        return fileDir;
    }

}

重點在於getAbsolutePath()方法,這個函數的做用是獲取當前項目在當前運行環境下的絕對路徑,如我如今在開發過程當中得到的結果就是D:\WorkSpace\IDEA-WorkSpace\......code

設置完畢以後就能夠正常顯示了。

注:若是你所使用的是SpringBoot多模塊項目,那麼經過這個方法獲取到的每每是父項目所在的地址,所以也會出現問題,解決這個問題的辦法是配置當前項目啓動類的工做環境是在具體的某個項目

   

 

 

 

 

設置完畢後便可解決這個問題

 

附:以前在說這個問題的時候,也有人給我提了一個建議,就是不將圖片放置在項目中,而是放置在某個固定的盤符中,這樣返回請求路徑的時候直接請求本地地址,等未來發布到服務器的時候使用Nginx。

不過問題是我對Nginx並非很瞭解,因此等我學會了Nginx以後再來完善這個博客吧,大家能夠先替我試試好很差用。【手動滑稽】

相關文章
相關標籤/搜索