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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈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 倍 …