最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

SpringBoot項(xiàng)目自定義靜態(tài)資源映射規(guī)則的實(shí)現(xiàn)代碼

 更新時(shí)間:2025年08月12日 10:51:13   作者:不吃冰  
在開發(fā)Web應(yīng)用時(shí),我們經(jīng)常需要處理文件上傳與訪問(wèn),?傳統(tǒng)做法可能是使用Nginx反向代理,但對(duì)于小型項(xiàng)目或快速開發(fā)場(chǎng)景,我們可以直接用?Spring MVC的靜態(tài)資源映射? 功能,本文將基于WebMvcConfigurer手寫配置,實(shí)現(xiàn) ?本地文件目錄映射為Web URL,需要的朋友可以參考下

1. 引言:為什么需要靜態(tài)資源映射???

在開發(fā)Web應(yīng)用時(shí),我們經(jīng)常需要處理文件上傳與訪問(wèn),例如:

  • 用戶頭像存儲(chǔ)后,如何通過(guò)URL直接訪問(wèn)?
  • 博客文章中的圖片如何托管到服務(wù)器并提供外鏈?
  • 如何避免將文件放到 resources/static 目錄下,導(dǎo)致項(xiàng)目臃腫?

?傳統(tǒng)做法可能是使用Nginx反向代理,但對(duì)于小型項(xiàng)目或快速開發(fā)場(chǎng)景,我們可以直接用 ?Spring MVC 的靜態(tài)資源映射? 功能,將本地磁盤的某個(gè)目錄映射為Web可訪問(wèn)路徑。

本文將基于 WebMvcConfigurer 手寫配置,實(shí)現(xiàn) ?本地文件目錄映射為Web URL,并解決常見問(wèn)題。

?2. 核心代碼解析?

我們先來(lái)看完整的配置類:

package com.qcby.AICommunity.config;
 
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
 
@Configuration
public class WebMVCConfiguration implements WebMvcConfigurer {
 
    @Value("${upload-path.face}") // 從配置文件讀取路徑
    private String face;
 
    @Override
    public void addResourceHandlers(ResourceHandlerRegistry registry) {
        registry.addResourceHandler("/community/upload/face/?**?")
                .addResourceLocations("file:" + face);
    }
}

?2.1 關(guān)鍵點(diǎn)解析?

?**@Configuration**?
聲明這是一個(gè)Spring配置類,會(huì)被自動(dòng)加載。

?**@Value("${upload-path.face}")**?
application.ymlapplication.properties 注入文件存儲(chǔ)路徑,例如:

upload-path:
  face: D:/upload/face/  # Windows
  # face: /var/upload/face/  # Linux

?**addResourceHandlers 方法**?

  • addResourceHandler("/community/upload/face/?**?")
    定義Web訪問(wèn)的URL模式,** 表示匹配任意子路徑。
  • addResourceLocations("file:" + face)
    指定本地文件系統(tǒng)路徑,file: 前綴表示磁盤目錄(而非classpath資源)。

?3. 實(shí)際應(yīng)用示例?

?3.1 文件上傳Controller?

假設(shè)我們有一個(gè)頭像上傳接口:

@RestController
@RequestMapping("/user")
public class UserController {
 
    @Value("${upload-path.face}")
    private String uploadPath;
 
    @PostMapping("/upload-avatar")
    public String uploadAvatar(MultipartFile file) throws IOException {
        String fileName = UUID.randomUUID() + ".jpg";
        File dest = new File(uploadPath + fileName);
        file.transferTo(dest); // 保存到本地
        return "/community/upload/face/" + fileName; // 返回訪問(wèn)路徑
    }
}
  • 文件會(huì)被保存到 D:/upload/face/xxx.jpg(取決于配置)。
  • 前端可通過(guò) http://your-domain.com/community/upload/face/xxx.jpg 直接訪問(wèn)。

?3.2 前端調(diào)用示例?

// 上傳頭像
const fileInput = document.querySelector('input[type="file"]');
const formData = new FormData();
formData.append('file', fileInput.files[0]);
 
fetch('/user/upload-avatar', {
  method: 'POST',
  body: formData
})
.then(response => response.text())
.then(url => {
  console.log('訪問(wèn)地址:', url);
  // 示例結(jié)果: "/community/upload/face/a1b2c3d4.jpg"
});

?4. 常見問(wèn)題與優(yōu)化?

?4.1 路徑分隔符兼容性問(wèn)題?

?Windows? 使用反斜杠 \,而 ?Linux? 使用正斜杠 /。
建議在配置中統(tǒng)一:

private String face = "D:/upload/face/"; // 推薦
// 或
private String face = "D:\\upload\\face\\"; // 需轉(zhuǎn)義

?4.2 權(quán)限問(wèn)題?

  • 確保應(yīng)用有權(quán)限讀寫目標(biāo)目錄(生產(chǎn)環(huán)境注意 chmod 或 Windows 權(quán)限設(shè)置)。

?4.3 動(dòng)態(tài)路徑映射?

如果需要按用戶ID分目錄存儲(chǔ):

@Value("${upload-path.base}")
private String basePath;
 
@Override
public void addResourceHandlers(ResourceHandlerRegistry registry) {
    registry.addResourceHandler("/uploads/user/?**?")
            .addResourceLocations("file:" + basePath + "user/");
}

然后在保存文件時(shí):

String userDir = basePath + "user/" + userId + "/";
Files.createDirectories(Paths.get(userDir)); // 創(chuàng)建用戶目錄

?4.4 結(jié)合Nginx優(yōu)化(生產(chǎn)環(huán)境推薦)??

雖然Spring Boot能直接映射本地文件,但生產(chǎn)環(huán)境建議:

  • 用Nginx處理靜態(tài)資源,減輕應(yīng)用服務(wù)器壓力。
  • 配置緩存、CDN加速訪問(wèn)。

?5. 總結(jié)?

本文通過(guò) WebMvcConfigurer 實(shí)現(xiàn)了:

  1. ?本地磁盤目錄映射為Web可訪問(wèn)URL。
  2. ?動(dòng)態(tài)配置文件存儲(chǔ)路徑?(通過(guò) @Value)。
  3. ?解決跨平臺(tái)路徑問(wèn)題。

?適用場(chǎng)景?:

  • 開發(fā)環(huán)境快速搭建文件訪問(wèn)服務(wù)。
  • 中小型項(xiàng)目避免引入Nginx的簡(jiǎn)化方案。

?進(jìn)一步優(yōu)化?:

  • 結(jié)合Spring Security控制訪問(wèn)權(quán)限。
  • 使用OSS(如阿里云OSS)替代本地存儲(chǔ)。

以上就是SpringBoot項(xiàng)目自定義靜態(tài)資源映射規(guī)則的實(shí)現(xiàn)代碼的詳細(xì)內(nèi)容,更多關(guān)于SpringBoot靜態(tài)資源映射規(guī)則的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • Java獲取媒體文件時(shí)長(zhǎng)的多種實(shí)現(xiàn)方法

    Java獲取媒體文件時(shí)長(zhǎng)的多種實(shí)現(xiàn)方法

    本文主要介紹了Java獲取媒體文件時(shí)長(zhǎng)的多種實(shí)現(xiàn)方法,包括使用第三方庫(kù)如ApacheCommonsIO、JAVE或FFmpeg,通過(guò)這些方法,可以方便地獲取不同媒體格式文件的時(shí)長(zhǎng),感興趣的可以了解一下
    2025-11-11
  • Java元注解meta-annotation和依賴注入詳解

    Java元注解meta-annotation和依賴注入詳解

    這篇文章主要給大家介紹了關(guān)于Java元注解meta-annotation和依賴注入的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-12-12
  • Spring事務(wù)失效的場(chǎng)景梳理總結(jié)

    Spring事務(wù)失效的場(chǎng)景梳理總結(jié)

    實(shí)際項(xiàng)目開發(fā)中,如果涉及到多張表操作時(shí),為了保證業(yè)務(wù)數(shù)據(jù)的一致性,大家一般都會(huì)采用事務(wù)機(jī)制,好多小伙伴可能只是簡(jiǎn)單了解一下,遇到事務(wù)失效的情況,便會(huì)無(wú)從下手,下面這篇文章主要給大家介紹了關(guān)于Spring事務(wù)失效場(chǎng)景的相關(guān)資料,需要的朋友可以參考下
    2023-02-02
  • Java單鏈表的增刪改查與面試題詳解

    Java單鏈表的增刪改查與面試題詳解

    單鏈表是鏈表的其中一種基本結(jié)構(gòu)。一個(gè)最簡(jiǎn)單的結(jié)點(diǎn)結(jié)構(gòu)如圖所示,它是構(gòu)成單鏈表的基本結(jié)點(diǎn)結(jié)構(gòu)。在結(jié)點(diǎn)中數(shù)據(jù)域用來(lái)存儲(chǔ)數(shù)據(jù)元素,指針域用于指向下一個(gè)具有相同結(jié)構(gòu)的結(jié)點(diǎn)。 因?yàn)橹挥幸粋€(gè)指針結(jié)點(diǎn),稱為單鏈表
    2022-09-09
  • 面試時(shí)必問(wèn)的JVM運(yùn)行時(shí)數(shù)據(jù)區(qū)詳解

    面試時(shí)必問(wèn)的JVM運(yùn)行時(shí)數(shù)據(jù)區(qū)詳解

    這篇文章主要介紹了JVM運(yùn)行時(shí)數(shù)據(jù)區(qū)原理解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2021-08-08
  • SpringBoot redis分布式緩存實(shí)現(xiàn)過(guò)程解析

    SpringBoot redis分布式緩存實(shí)現(xiàn)過(guò)程解析

    這篇文章主要介紹了SpringBoot redis分布式緩存實(shí)現(xiàn)過(guò)程解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2019-10-10
  • Java工程編碼格式由GBK轉(zhuǎn)化成utf-8的具體實(shí)現(xiàn)

    Java工程編碼格式由GBK轉(zhuǎn)化成utf-8的具體實(shí)現(xiàn)

    在寫項(xiàng)目的過(guò)程中我發(fā)現(xiàn)有的地方編碼格式被設(shè)置成了 gbk 如果用eclipse等工具直接改回utf-8編碼格式則會(huì)出現(xiàn)亂碼,所以本文給大家介紹了Java工程編碼格式由GBK轉(zhuǎn)化成utf-8的具體實(shí)現(xiàn),感興趣的朋友可以參考下
    2024-05-05
  • JavaWeb項(xiàng)目中springmvc和tomcat對(duì)靜態(tài)文件的處理

    JavaWeb項(xiàng)目中springmvc和tomcat對(duì)靜態(tài)文件的處理

    這篇文章主要介紹了JavaWeb項(xiàng)目中springmvc和tomcat對(duì)靜態(tài)文件的處理 的相關(guān)資料,需要的朋友可以參考下
    2016-07-07
  • mybatis類型處理器JSR310標(biāo)準(zhǔn)詳解

    mybatis類型處理器JSR310標(biāo)準(zhǔn)詳解

    這篇文章主要介紹了mybatis類型處理器JSR310標(biāo)準(zhǔn)詳解,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-01-01
  • Struts2通過(guò)自定義標(biāo)簽實(shí)現(xiàn)權(quán)限控制的方法

    Struts2通過(guò)自定義標(biāo)簽實(shí)現(xiàn)權(quán)限控制的方法

    這篇文章主要介紹了Struts2通過(guò)自定義標(biāo)簽實(shí)現(xiàn)權(quán)限控制的方法,介紹了定義Struts2的自定義標(biāo)簽的三個(gè)步驟以及詳細(xì)解釋,需要的朋友可以參考下。
    2017-09-09

最新評(píng)論

永安市| 南投市| 元江| 平度市| 通河县| 大厂| 沅江市| 东明县| 垦利县| 石楼县| 神农架林区| 两当县| 莲花县| 什邡市| 岚皋县| 张家川| 兴海县| 北安市| 滦南县| 临西县| 肇东市| 河北区| 保定市| 伊通| 乐都县| 健康| 会宁县| 临漳县| 邯郸市| 富蕴县| 双流县| 龙泉市| 冀州市| 昭觉县| 乐清市| 北碚区| 万安县| 运城市| 淳化县| 惠州市| 大邑县|