当前位置: 首页 > news >正文

http://localhost:8080/photos/xxx.png的本地图片访问方案

在 Web 开发中,让图片能够通过特定 URL 直接访问是非常基础且重要的功能。例如通过http://localhost:8080/photos/person_94_1754202238192.png这样的地址直接加载图片,在用户头像展示、资料图片预览等场景中高频出现。本文将结合实际项目代码,详细讲解如何在 Spring Boot 环境中搭建这样的图片访问机制,从配置到代码实现全程干货。

一、需求分析:URL 路径的构成

我们要实现的 URL 是http://localhost:8080/photos/person_94_1754202238192.png,可以拆分为几个部分:

  • http://localhost:8080:本地服务器地址和端口
  • /photos:资源访问的上下文路径(映射路径)
  • person_94_1754202238192.png:具体的图片文件名

核心需求是:当浏览器请求/photos/xxx.png时,服务器能自动找到本地对应本地磁盘上的图片文件并返回。

二、实现原理

Spring Boot 提供了静态资源映射功能,通过配置可以将特定的 URL 路径映射到本地磁盘的目录。当访问该 URL 路径时,Spring MVC 会自动到映射的本地目录中查找对应的文件并返回。

简单来说就是建立一种映射关系:

URL路径:/photos/xxx.png → 本地目录:D:/community/community-ui/src/photos/xxx.png

 

三、具体实现步骤

1. 配置文件设置(application.yml)

首先在配置文件中定义图片的存储路径和访问路径规则,这样做的好处是方便后期维护和修改。

 

# 单独定义文件上传目录,方便代码中引用
file:upload-dir: D:/community/community-ui/src/photos

2. 配置 WebMvc 资源映射(WebConfig.java)

虽然 Spring Boot 的默认配置已经可以实现静态资源访问,但为了更灵活地控制(尤其是在多模块项目或有特殊需求时),我们通常会自定义 WebMvc 配置类:

package com.qcby.config;import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;@Configuration
public class WebConfig implements WebMvcConfigurer {// 从配置文件中注入上传目录@Value("${file.upload-dir}")private String uploadDir;@Overridepublic void addResourceHandlers(ResourceHandlerRegistry registry) {// 配置资源处理器:将/photos/**路径映射到本地uploadDir目录registry.addResourceHandler("/photos/**").addResourceLocations("file:" + uploadDir + "/");}
}

 

这里的关键代码是addResourceHandleraddResourceLocations的组合:

  • addResourceHandler("/photos/**"):设置 URL 访问模式
  • addResourceLocations("file:" + uploadDir + "/"):设置对应的本地目录,注意路径末尾的/不能少

但是如果你在yml文件中这样配置的 upload-dir: D:/community/community-ui/src/photos/

后面的"/" 就可以省略了目的是,获取这个图片所在文件夹的全路径

配置到这一步其实你就已经可以通过
http://localhost:8080/photos/xxx.png

访问到你所对应的图片了

测试一下:

没问题哈 !!!!!!!!!!!!!!

3. 图片文件的保存(代码实现)

有了路径映射后,还需要确保图片确实保存到了我们配置的目录中。以下是保存图片并生成访问 URL 的示例代码:

// 从配置文件注入上传目录
@Value("${file.upload-dir}")
private String uploadDir;// 保存图片并生成访问URL
public String saveImage(Integer personId, String fileBase64) throws Exception {// 1. 生成唯一的文件名(避免重名覆盖)String fileName = "person_" + personId + "_" + System.currentTimeMillis() + ".png";// 2. 构建完整的本地文件路径String filePath = Paths.get(uploadDir, fileName).toString();// 3. 确保目录存在,不存在则创建File fileDir = new File(uploadDir);if (!fileDir.exists()) {fileDir.mkdirs();}// 4. 处理Base64格式的图片数据String base64Data = fileBase64.contains(",") ? fileBase64.split(",")[1] : fileBase64;byte[] imageBytes = Base64.getDecoder().decode(base64Data);// 5. 保存图片到本地目录Files.write(Paths.get(filePath), imageBytes);// 6. 生成可访问的URLString fullUrl = "http://localhost:8080/photos/" + fileName;return fullUrl;
}

 

这段代码做了几件重要的事:

  • 生成包含唯一标识(人员 ID + 时间戳)的文件名,避免文件重名
  • 自动创建目录(如果不存在),防止保存失败
  • 正确处理 Base64 格式的图片数据(去除可能存在的前缀)
  • 构建完整的访问 URL,格式为http://服务器地址:端口/photos/文件名

4. 访问测试

完成以上配置和代码后,启动 Spring Boot 应用:

  1. 确保图片已保存到D:/community/community-ui/src/photos/目录下,文件名是person_94_1754202238192.png
  2. 打开浏览器,访问http://localhost:8080/photos/person_94_1754202238192.png
  3. 如果配置正确,浏览器会直接显示该图片

四、常见问题及解决方案

  1. 404 错误:文件未找到

    • 检查本地文件是否确实存在于配置的目录中
    • 确认文件名是否与 URL 中的一致(注意大小写,Windows 系统不区分大小写,但 Linux 系统区分)
    • 检查uploadDir配置是否正确,路径分隔符是否使用/\\(建议使用/,Spring 会自动处理)
  2. 500 错误:服务器内部错误

    • 检查目录权限,确保应用程序有读写该目录的权限
    • 查看 Base64 解码过程是否有误,无效的 Base64 数据会导致解码失败
  3. URL 访问正常但图片无法显示

    • 检查图片文件是否损坏,可以尝试直接打开本地文件验证
    • 确认 Base64 数据处理是否正确,特别是可能包含了非图片的 Base64 数据
http://www.lryc.cn/news/609036.html

相关文章:

  • 常见的框架漏洞(Thinkphp,spring,Shiro)
  • io_submit系统调用及示例
  • 【硬件-笔试面试题】硬件/电子工程师,笔试面试题-54,(知识点:硬件设计流程)
  • 知识随记-----MySQL 连接池健康检测与 RAII 资源管理技术
  • vulnhub-noob靶机攻略
  • ICT模拟零件测试方法--电位器测试
  • 【QT】常⽤控件详解(二)windowOpacitycursorfontsetToolTipfocusPolicystyleSheet
  • 8.1.3 TiDB集群方案雨Replication原理
  • git用户设置
  • 嵌入式 C 语言入门:多文件编程实践笔记 —— 从文件创建到调用
  • Python Seaborn【数据可视化库】 全面讲解
  • C++ 之 【模拟实现 优先级队列】
  • Java 大视界 -- Java 大数据机器学习模型在金融市场情绪分析与投资决策辅助中的应用(379)
  • 控制建模matlab练习05:比例积分控制-①系统建模
  • 【游戏比赛demo灵感】Scenario No.9(又名:World Agent)
  • 【Python✨】解决 Conda 安装 MoviePy 报错问题
  • 【Linux系统编程】进程信号
  • Rust 同步方式访问 REST API 的完整指南
  • python学智能算法(三十一)|SVM-Slater条件理解
  • Rust:如何开发Windows 动态链接库 DLL
  • 【AI编程工具IDE/CLI/插件专栏】-国外IDE与Cursor能力对比
  • 08.Redis 持久化
  • Pytorch实现一个简单的贝叶斯卷积神经网络模型
  • (一)全栈(react配置/https支持/useState多组件传递/表单提交/React Query/axois封装/Router)
  • CICD--自动化部署--jinkins
  • TV电视版软件集合分享
  • 动感按钮:如何打造交互感十足的点击动画效果
  • 【前端安全】聊聊 HTML 闭合优先级和浏览器解析顺序
  • 二叉树算法之【前序遍历】
  • 设计原则和设计模式