Spring Boot應用實現圖片資源服務

在這篇文章中,我們將介紹如何使用Spring Boot創建一個REST API來提供服務器上的靜態圖片資源。該API包括路徑安全檢查、文件存在性驗證以及緩存控制等功能,并且代碼包含詳細的注釋以幫助理解。

Maven依賴

首先,在您的pom.xml文件中添加以下依賴項:

<dependencies><!-- Spring Boot Starter Web for building web applications --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><!-- Lombok to reduce boilerplate code --><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><scope>provided</scope></dependency><!-- For logging --><dependency><groupId>org.slf4j</groupId><artifactId>slf4j-api</artifactId></dependency>
</dependencies>

確保您已經正確配置了Maven項目的其他部分,如<parent>標簽和版本管理等。

Java代碼

接下來是核心Java代碼,位于package pub.qingyun.web;包下:

package pub.qingyun.web;import lombok.extern.slf4j.Slf4j;
import org.springframework.core.io.UrlResource;
import org.springframework.http.HttpHeaders;
import org.springframework.http.MediaType;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.CrossOrigin;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;import java.net.MalformedURLException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;@RestController
@CrossOrigin
@Slf4j
public class ImageController {// 圖片根目錄private static final Path IMAGE_ROOT = Paths.get("F:", "Temp").toAbsolutePath().normalize();/*** 獲取圖片資源并返回給客戶端** @param imagePath 圖片文件的相對路徑參數* @return ResponseEntity<UrlResource> 包含圖片資源的響應實體,包含適當的HTTP狀態碼和響應頭*/@GetMapping("/showImage")public ResponseEntity<UrlResource> getImage(@RequestParam String imagePath) {long start = System.currentTimeMillis();// 參數校驗:檢查圖片路徑是否為空if (imagePath == null || imagePath.trim().isEmpty()) {log.warn("Missing imagePath parameter");return ResponseEntity.badRequest().build();}// 路徑安全檢查:防止路徑遍歷攻擊// 過濾非法字符,防止路徑穿越if (imagePath.contains("..") || imagePath.contains("\\") || imagePath.startsWith("/")) {log.warn("Forbidden path access attempt: [PATH_REDACTED]");return ResponseEntity.status(403).build();}Path resolvedPath = IMAGE_ROOT.resolve(imagePath).normalize();if (!resolvedPath.startsWith(IMAGE_ROOT)) {log.warn("Forbidden path access attempt: [PATH_REDACTED]");return ResponseEntity.status(403).build();}// 文件存在性檢查:驗證文件是否存在且為常規文件if (!Files.exists(resolvedPath) || !Files.isRegularFile(resolvedPath)) {log.info("Image not found: [PATH_REDACTED]");return ResponseEntity.notFound().build();}// 緩存文件長度,避免重復調用long fileLength = resolvedPath.toFile().length();// 創建資源對象UrlResource resource;try {resource = new UrlResource(resolvedPath.toUri());} catch (MalformedURLException e) {log.error("Failed to create resource for: [PATH_REDACTED], Malformed URL", e);return ResponseEntity.status(500).build();} catch (Exception e) {log.error("Failed to create resource for: [PATH_REDACTED]", e);return ResponseEntity.status(500).build();}// 設置響應頭信息HttpHeaders headers = new HttpHeaders();headers.setCacheControl("public, max-age=86400"); // 緩存 1 天headers.setExpires(System.currentTimeMillis() + 86400_000L); // 過期時間headers.setContentDispositionFormData("inline", resource.getFilename());log.info("getImage [PATH_REDACTED] ({} bytes) cost: {}ms", fileLength, (System.currentTimeMillis() - start));// 構建并返回成功響應return ResponseEntity.ok().headers(headers).contentType(MediaType.IMAGE_JPEG).contentLength(fileLength).body(resource);}
}

這個代碼段展示了一個簡單的Spring Boot REST控制器,用于從指定路徑加載圖片并將其作為資源返回給客戶端。它包括必要的安全措施來防止潛在的路徑遍歷攻擊,并設置了緩存控制頭以提高性能。希望這段代碼能為您提供構建自己的圖片服務的幫助!

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/96146.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/96146.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/96146.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Word 中 MathType 公式編號問題與解決

注&#xff1a;本文為 “Word 中 MathType 公式編號” 相關合輯。 圖片清晰度受引文原圖所限。 略作重排&#xff0c;未整理去重。 如有內容異常&#xff0c;請看原文。 【Word】解決 MathType 已插入公式按新章節開始編號的問題 Allan326 于 2020-03-25 15:30:08 發布 問題…

19. 大數據-產品概念

文章目錄前言一、數據庫1. 簡介2. 使用場景3. 數據庫類型4. 數據類型二、數據倉庫1. 簡介2. 使用場景3. 數據倉庫架構三、數據平臺1. 簡介2. 使用場景3. 數據倉庫架構四、數據中臺1. 簡介2. 使用場景3. 數據中臺架構五、數據湖1. 簡介2. 使用場景3. 數據湖架構六、總結1. 區別2…

python學習DAY46打卡

DAY 46 通道注意力(SE注意力) 內容&#xff1a; 不同CNN層的特征圖&#xff1a;不同通道的特征圖什么是注意力&#xff1a;注意力家族&#xff0c;類似于動物園&#xff0c;都是不同的模塊&#xff0c;好不好試了才知道。通道注意力&#xff1a;模型的定義和插入的位置通道注意…

Ansible 中的文件包含與導入機制

Ansible 中的文件包含與導入機制本文介紹了在 Ansible 中如何通過模塊化方式管理復雜的 Playbook&#xff0c;包括使用 include 和 import 系列語句來拆分和重用代碼。概述 當 Playbook 變得冗長或復雜時&#xff0c;可以將其拆分為多個小文件以提高可管理性。Ansible 提供了模…

OpenCV-循環讀取視頻幀,對每一幀進行處理

原型代碼 內存模型&#xff1a; 核心變量&#xff1a;frame&#xff0c;Numpy ndarray&#xff0c;每次會被覆蓋&#xff0c;大小保持恒定import cv2video_path your_video.mp4cap cv2.VideoCapture(video_path)if not cap.isOpened():print("Cant open Video")exi…

決策樹的學習(二)

一、整體框架本 PPT 聚焦機器學習中的決策樹算法&#xff0c;圍繞 “核心算法&#xff08;ID3、C4.5、CART&#xff09;→ 特殊問題&#xff08;連續值處理&#xff09;→ 優化策略&#xff08;剪枝&#xff09;→ 代碼實現→ 課堂練習” 展開&#xff0c;系統補充決策樹的進階…

粗糧廠的基于spark的通用olap之間的同步工具項目

粗糧廠的基于spark的通用olap之間的同步工具項目1 項目背景2 項目實現2.1 實現原理2.2 細節要點3 抽樣說明4 項目運行狀態4.1 運行速度4.2 項目吞吐4.3 穩定性說的比較簡單&#xff0c;有需要的可以留言&#xff0c;我不斷補充完善1 項目背景 我們公司內部的需要一款&#xff…

C# 時間戳

在C#中&#xff0c;獲取當前時間的毫秒級時間戳可以通過多種方式實現。以下是幾種常見的方法&#xff1a;方法1&#xff1a;使用DateTime和DateTimeOffsetlong timestamp (long)(DateTimeOffset.Now.ToUnixTimeMilliseconds()); Console.WriteLine(timestamp);方法2&#xff1…

【牛客刷題】REAL792 小O的平面畫圓

文章目錄 一、題目介紹 1.1 輸入描述 1.2 輸出描述 1.3 示例 二、算法設計思路 2.1 核心問題分析 2.2 圖解兩個圓的位置關系 2.2.1. 相離 (Separate) 2.2.2. 外切 (Externally Tangent) 2.2.3. 相交 (Intersecting) 2.2.4. 內切 (Internally Tangent) 2.2.5. 包含 (Containing)…

uniapp:微信小程序使用Canvas 和Canvas 2D繪制圖形

一、Canvas 畫布 canvas 組件 提供了繪制界面&#xff0c;可以在之上進行任意繪制 功能描述 Canvas 畫布。2.9.0 起支持一套新 Canvas 2D 接口&#xff08;需指定 type 屬性&#xff09;&#xff0c;同時支持同層渲染&#xff0c;原有接口不再維護。 二、Canvas 和Canvas 2D 區…

word如何轉換為pdf

pip install pywin32import os import win32com.client import pythoncom # 新增&#xff1a;用于處理COM線程 import sysdef docx_to_pdf(docx_path, pdf_pathNone):"""將Word文檔轉換為PDF格式&#xff0c;修復退出時的COM錯誤"""if not os.p…

服務器Linux防火墻怎樣實現訪問控制

在互聯網世界里&#xff0c;Linux服務器就像一座城池&#xff0c;而防火墻便是城池的守衛者。沒有防火墻&#xff0c;外部的任何流量都能毫無阻攔地進入服務器;而有了防火墻&#xff0c;就可以像設關卡一樣&#xff0c;對進出城門的人進行盤查和控制。對企業運維人員來說&#…

【原創理論】Stochastic Coupled Dyadic System (SCDS):一個用于兩性關系動力學建模的隨機耦合系統框架

【原創理論】Stochastic Coupled Dyadic System (SCDS)&#xff1a;一個用于兩性關系動力學建模的隨機耦合系統框架 作者&#xff1a;[望月&#xff0c;GPT5,GPT-O3,Gemini2.5pro] 分類&#xff1a; 人工智能 理論模型 交叉學科 系統科學 人性 愛情 標簽&#xff1a; 關系動力…

星圖云開發者平臺新功能速遞 | 微服務管理器:無縫整合異構服務,釋放云原生開發潛能

在構建現代數字化應用的過程中&#xff0c;開發者常常面臨一個關鍵挑戰&#xff1a;如何高效、安全地集成和復用既有的復雜服務或自有業務系統&#xff1f;這些服務可能是核心算法引擎、遺留業務邏輯模塊&#xff0c;或是特定的SaaS能力。傳統方式下&#xff0c;將它們融入新的…

數據結構:構建 (create) 一個二叉樹

目錄 問題的本質——什么信息才能唯一確定一棵樹&#xff1f; 推導“最佳拍檔”——哪兩種遍歷序列能行&#xff1f; 遞歸思想——如何構建一棵樹&#xff1f; 第1步&#xff1a;確定整棵樹的根節點 第2步&#xff1a;劃分左右子樹的成員 第3步&#xff1a;遞歸構建左右子…

【STM32】HAL庫中的實現(五):ADC (模數轉換)

什么是 ADC&#xff08;模數轉換器&#xff09; ADC&#xff08;Analog to Digital Converter&#xff09;是將 模擬信號&#xff08;電壓&#xff09;轉換成數字信號&#xff08;數值&#xff09; 的器件。 在 STM32 中&#xff0c;ADC 通常具有以下特性&#xff1a;特性描述分…

智慧校園中IPTV融合對講:構建高效溝通新生態

在智慧校園的建設浪潮里&#xff0c;IPTV融合對講系統宛如一顆璀璨的新星&#xff0c;以其獨特的功能和強大的優勢&#xff0c;為校園的溝通與管理帶來了全新的變革&#xff0c;構建起一個高效、便捷、智能的溝通新生態。從日常溝通層面來看&#xff0c;IPTV融合對講系統打破了…

智能合約里的 “拒絕服務“ 攻擊:讓你的合約變成 “死機的手機“

你有沒有遇到過手機突然卡死&#xff0c;點什么都沒反應的情況&#xff1f;在區塊鏈世界里&#xff0c;智能合約也可能遭遇類似的 "罷工"—— 這就是 "拒絕服務攻擊"&#xff08;Denial of Service&#xff0c;簡稱 DoS&#xff09;。今天用大白話講講合約…

安全設計-防止非法移機

前言我們的設備在實際使用過程中&#xff0c;在我們的巡查機制粒度下&#xff0c;發現依然有設備被非法移動到其他非計劃點位。因此&#xff0c;我們需要設計一套及時預警&#xff0c;但是對客戶無感&#xff0c;不影響業務辦理的防范機制。1.方案設計交互圖2.方案說明 2.1方案…

OpenHarmony之三方庫適配深度實踐:從移植到合規的全鏈路指南

1. 為什么要做三方庫適配?——更深層的價值分析 維度 現狀痛點 預期收益 深度價值 生態 成熟開源庫無法直接運行 復用 10+ 年開源沉淀,提升功能覆蓋率 避免生態碎片化:通過標準化適配流程,確保不同廠商對同一庫的實現一致 性能 JS 層重實現耗 CPU 原生 C/C++ 加速 3~10 倍 …