首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 相關知識

Spring Boot 圖片上傳與靜態訪問實戰:自定義存儲路徑、ResourceHandler 配置全解析

     編輯:Java 相關知識

核心痛點:內嵌 Tomcat 的「類路徑陷阱」

Spring Boot 打包為 JAR 時,src/main/resources/static 會被打入 JAR 內部,無法在運行時動態寫入新檔案。上傳的圖片必須存放在外部文件系統,並配置靜態資源映射對外訪問。

方案架構

上傳目錄:/data/upload/  (外部磁碟、NFS、S3 掛載點)
訪問 URL:https://host:port/images/xxx.png
映射規則:/images/** → file:/data/upload/

1. 配置上傳屬性

# application.yml
app:
  upload:
    root-path: /data/upload
    url-prefix: /images/**
spring:
  servlet:
    multipart:
      max-file-size: 10MB
      max-request-size: 20MB

2. 靜態資源映射(關鍵)

3. 上傳控制器

4. 前端直傳示例

<input type="file" id="imgInput" accept="image/*">
<button onclick="upload()">上傳</button>
<img id="preview" style="max-width:300px;display:none">

<script>
function upload() {
    const file = document.getElementById('imgInput').files[0];
    if (!file) return alert('請選擇圖片');
    const fd = new FormData();
    fd.append('file', file);
    fetch('/api/upload/image', {method:'POST', body:fd})
        .then(r => r.json())
        .then(res => {
            if (res.code === 0) {
                document.getElementById('preview').src = res.url;
                document.getElementById('preview').style.display = 'block';
            } else alert(res.msg);
        });
}
</script>

安全與擴展建議

避坑檢查清單

  1. Windows 路徑分隔符:file:///D:/upload/(三斜杠)
  2. Linux 權限:啟動用戶需對 /data/upload 有讀寫權限
  3. JAR 包內靜態資源優先級高於外部映射,避免同名衝突
  4. 生產環境建議關閉 spring.mvc.static-path-pattern 預設映射,僅暴露必要前綴
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved
風險/需求對策
惡意腳本上傳校驗 Content-Type、副檔名、魔數;禁用執行權限 chmod -R -x /data/upload
文件名衝突/遍歷UUID 重命名、禁止用戶控制路徑
大文件/斷點續傳引入 Plupload/WebUploader 分片上傳,後端合併
多實例共享存儲掛載 NFS、CephFS 或對接 MinIO/S3,配置 ResourceResolver 統一訪問
圖片處理(壓縮、水印、縮圖)上傳後異步調用 Thumbnailator / ImageMagick,存多規格版本
防盜鏈Nginx valid_referers 或簽名 URL 限時訪問