Spring Boot中保存前端上传的图片 - 教程

news/2025/10/6 9:18:36/文章来源:https://www.cnblogs.com/lxjshuju/p/19127279

在Spring Boot中保存前端上传的图片可以通过以下步骤实现:

1. 添加依赖

确保在pom.xml中已包含Spring Web依赖:

<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>

2. 配置文件上传限制

application.properties中设置文件大小限制:

spring.servlet.multipart.max-file-size=10MB
spring.servlet.multipart.max-request-size=10MB
#====自定义变量======
#文件上传地址
file.upload.dir=uploads/

3. 创建文件上传控制器

package com.hirain.mall.controller
;
import com.hirain.mall.common.ApiRestResponse
;
import jakarta.servlet.http.HttpServletRequest
;
import org.springframework.beans.factory.annotation.Value
;
import org.springframework.web.bind.annotation.PostMapping
;
import org.springframework.web.bind.annotation.RequestMapping
;
import org.springframework.web.bind.annotation.RequestParam
;
import org.springframework.web.bind.annotation.RestController
;
import org.springframework.web.multipart.MultipartFile
;
import java.nio.file.Files
;
import java.nio.file.Path
;
import java.nio.file.Paths
;
import java.util.Map
;
import java.util.UUID
;
@RestController
@RequestMapping
("/images"
)
public
class ImageController {
@Value
("${file.upload.dir}"
) // 从配置文件中读取路径
private String uploadDir;
@PostMapping
("/upload"
)
public ApiRestResponse<
?> uploadImage(
@RequestParam
("image"
) MultipartFile file,
HttpServletRequest request) {
try {
// 创建目录 (如果不存在)
Path uploadPath = Paths.get(uploadDir)
;
if (!Files.exists(uploadPath)
) {
Files.createDirectories(uploadPath)
;
}
// 生成唯一文件名 (避免覆盖)
String originalFileName = file.getOriginalFilename(
)
;
String fileExt = originalFileName.substring(originalFileName.lastIndexOf("."
)
)
;
String newFileName = UUID.randomUUID(
) + fileExt;
// 保存文件
Path targetPath = uploadPath.resolve(newFileName)
;
Files.copy(file.getInputStream(
)
, targetPath)
;
// 生成访问 URL (使用环境信息构建完整URL)
String baseUrl = request.getRequestURL(
).toString(
).replace(request.getRequestURI(
)
, ""
)
;
String imageUrl = baseUrl + "/images/" + newFileName;
return ApiRestResponse.success(Map.of(
"filename"
, newFileName,
"url"
, imageUrl//完成静态资源映射配置后,通过浏览器直接访问该地址即可访问图片
)
)
;
}
catch (Exception e) {
return ApiRestResponse.error(500
,"上传失败: " + e.getMessage(
)
)
;
}
}
}

4.静态资源映射配置类WebConfig

package com.hirain.mall.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
;
import java.io.File
;
@Configuration
public
class WebConfig
implements WebMvcConfigurer {
@Value
("${file.upload.dir}"
)
private String uploadDir;
@Override
public
void addResourceHandlers(ResourceHandlerRegistry registry) {
// 将真实的上传目录映射为虚拟路径
registry.addResourceHandler("/images/**"
)
.addResourceLocations("file:" + uploadDir + File.separator)
;
}
}

5. 前端调用示例(HTML)

<input type="file" id="imageInput"><button onclick="uploadImage(
)">上传</button>
<script>asyncfunction uploadImage() {const fileInput = document.getElementById('imageInput');const formData =new FormData();formData.append('image', fileInput.files[0]);const response =await fetch('http://localhost:8080/images/upload', {method: 'POST',body: formData});const result =await response.text();console.log(result);}
</script>

6. postman调用示例

在这里插入图片描述

关键点说明:

  1. 文件保存路径

  2. 文件名处理

  3. 异常处理

进阶优化建议:

  1. 添加文件类型校验

    if (!file.getContentType(
    ).startsWith("image/"
    )
    ) {
    return "仅支持图片文件"
    ;
    }
  2. 添加安全限制

  3. 云存储方案

处理流程示意图:

在这里插入图片描述
其中,前端上传图片后,后端保存在本地的流程如下:

前端 → 发送Multipart请求 → Spring控制器 → 验证文件 → 生成唯一文件名 → 保存到本地 → 返回结果

根据实际需求选择本地存储或云存储方案,并注意做好文件类型校验和安全防护措施。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/929143.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

完整教程:Go语言的context

完整教程:Go语言的context2025-10-06 09:10 tlnshuju 阅读(0) 评论(0) 收藏 举报pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; …

国外做农产品有名的网站手机端网站设计模板

《博主简介》 小伙伴们好&#xff0c;我是阿旭。专注于人工智能、AIGC、python、计算机视觉相关分享研究。 ✌更多学习资源&#xff0c;可关注公-仲-hao:【阿旭算法与机器学习】&#xff0c;共同学习交流~ &#x1f44d;感谢小伙伴们点赞、关注&#xff01; 《------往期经典推…

创意网站建设排行榜wordpress删除摘要

facenet是一款非常经典的神经网络模型&#xff0c;它可以直接学习从人脸图像到欧几里德空间的映射(直接将人脸映射到欧几里得空间)。在欧几里德空间中&#xff0c;距离直接对应于人脸相似性的度量。一旦这个空间产生&#xff0c;使用标准技术&#xff0c;将FaceNet嵌入作为特征…

Python包管理器 uv替代conda? - 详解

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

广州建站网络推广公司大气绿色网站模板

引言 随着软件复杂度的不断增加&#xff0c;如何有效地管理类内部的数据变得愈发重要。属性装饰器作为一种强大的工具&#xff0c;不仅简化了代码&#xff0c;还增强了程序的可读性和可维护性。通过使用属性装饰器&#xff0c;我们可以轻松地实现对类属性的读取、修改以及删除…

网站开发维护报价单wordpress的源代码

一.标识符1.标识符的作用&#xff1a;C 标识符是用来标识变量、函数&#xff0c;或任何其他用户自定义项目的名称2.标识符的规范&#xff1a;一个标识符只能以字母 A-Z 或 a-z 或下划线 _ 开始 后跟零个或多个字母、下划线和数字(0-9)&#xff0c;第二位开始也只能用 A-Z…

P2724 [IOI 1998 / USACO3.1] 联系 Contact 做题笔记

前面思考了好久都没想出什么,看了题解才会,我真是太菜了 思路 本题可以暴力枚举解决,但是直接暴力枚举又会超时 怎么办呢,注意到这个序列中只有 \(0\) 和 \(1\),长得像二进制。直接把二进制强压成十进制就不用一位…

教育网站平面设计53建筑人才网

目录 问题描述: 解决方法: 重要代码&#xff1a; 问题描述: 项目中oracle数据库需要转换为mysql&#xff0c;Oracle中的表字段定义为number(36,16)类型的工具自动转换为mysql的decimal(36,16)。在Oracle数据库中&#xff0c;number(36,16)类型的字段&#xff0c;使用BigDeci…

如果能重来

如果能重来如果能重来 好多事,年轻的时候不去尝试,年纪大了就更不可能去尝试,尤其是一个人。年少多去经历,是一笔财富,更是“不负少年时”。2025.10.6

深入解析:DeepSeek 赋能智能零售,解锁动态定价新范式

深入解析:DeepSeek 赋能智能零售,解锁动态定价新范式2025-10-06 08:57 tlnshuju 阅读(0) 评论(0) 收藏 举报pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; d…

家如何网站刷网站seo排名软件

&#xff08;1&#xff09;什么是多态&#xff1f; 同类型的对象&#xff0c;表现出不同的形态。前者指父类&#xff0c;后者指不同的子类 说简单点&#xff0c;就是父类的同一种方法&#xff0c;可以在不同子类中表现出不同的状态&#xff0c;或者说在不同子类中可以实现不同…

实用指南:pyecharts 画一下股票的月K图(输出html)

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

深入解析:Linux运维笔记:服务器感染 netools 病毒案例

深入解析:Linux运维笔记:服务器感染 netools 病毒案例pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas&…

端午节网站建设目的新余+网站建设

1 开始 这是一个总图 下边慢慢看 我们最基础的写的方式就是xml的方式去写 像这样&#xff0c; 而我们会通过applicationContext的方式去获得我们的bean &#xff0c;我其中一篇博客就写到了applicationContext他的父类就是beanFactory 但是中间的是怎么样处理的呢&#xff1f…

基本型企业网站论文媒体网络推广价格优惠

文章目录 1. 业务背景 1. 业务背景 场景一&#xff1a; 快速响应用户请求 场景描述&#xff1a;比如说⽤户要查看⼀个商品的信息&#xff0c;那么我们需要将商品维度的⼀系列信息如商品的价格、优惠、库存、图⽚等等聚合起来&#xff0c;展示给⽤户。 分析&#xff1a;从用户角…

网站开发的技术解决方案企业网站适合响应式嘛

SonarWiz 8.0.1是功能强大的测绘软件&#xff01;提供强大的数据采集、后处理等功能操作&#xff0c;您将获得灵活完整的报告&#xff0c;并提供丰富的选项以便进行定制和更灵活的进行操作&#xff0c;软件功能齐全&#xff0c;包括完整的海底测绘解决方案&#xff0c;方便实时…

长安网站建设软件摄影网站导航

96.不同的二叉搜索树 力扣题目链接(opens new window) 给定一个整数 n&#xff0c;求以 1 ... n 为节点组成的二叉搜索树有多少种&#xff1f; dp[3] dp[2] * dp[0] dp[1] * dp[1] dp[0] * dp[2] dp[i] &#xff1a; 1到i为节点组成的二叉搜索树的个数为dp[i]。 dp[i] d…

好的高端企业网站建设公司安徽六安特产

下载一些 jar 包驱动&#xff0c;不需用去官网下了&#xff0c;直接去 Maven 中央仓库&#xff0c;高效、简单 Maven 中央仓库地址 https://mvnrepository.com/open-source 我们下期见&#xff0c;拜拜&#xff01;

Linux--进程概念 - 详解

Linux--进程概念 - 详解2025-10-06 08:38 tlnshuju 阅读(0) 评论(0) 收藏 举报pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; fon…

设计模式——命令设计模式(行为型) - 详解

设计模式——命令设计模式(行为型) - 详解pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", &quo…