Spring Boot中保存前端上传的图片实现步骤详解

 更新时间:2025年06月03日 10:27:47   作者:yuren_xia  
这篇文章主要介绍了Spring Boot中保存前端上传的图片实现步骤,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下

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

1. 添加依赖

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

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-validation</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>
async function 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调用示例

关键点说明:

文件保存路径:

  • 示例中使用相对路径uploads/(项目根目录下)
  • 生产环境建议使用绝对路径(如/var/www/uploads/)

文件名处理:

  • 使用时间戳前缀确保唯一性
  • 保留原始文件名后缀(通过file.getOriginalFilename()获取)

异常处理:

  • 捕获IOException处理文件操作异常
  • 返回错误信息给前端

添加文件类型校验:

if (!file.getContentType().startsWith("image/")) {
    return "仅支持图片文件";
}

添加安全限制:

  • 限制文件扩展名(jpg, png等)
  • 使用病毒扫描工具扫描上传文件

云存储方案:

  • 生产环境建议使用云存储(AWS S3, 阿里云OSS等)
  • 示例代码替换为云存储SDK的上传逻辑

处理流程示意图:

其中,前端上传图片后,后端保存在本地的流程如下:

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

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

到此这篇关于Spring Boot中保存前端上传的图片的文章就介绍到这了,更多相关Spring Boot前端上传图片内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Java超详细大文件分片上传代码

    Java超详细大文件分片上传代码

    文件上传是一个很常见的功能。在项目开发过程中,我们通常都会使用一些成熟的上传组件来实现对应的功能,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧<BR>
    2022-06-06
  • SpringBoot实战之SSL配置详解

    SpringBoot实战之SSL配置详解

    今天小编就为大家分享一篇关于SpringBoot实战之SSL配置详解,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
    2019-02-02
  • mybatis注入Date日期值为null的解决方法

    mybatis注入Date日期值为null的解决方法

    这篇文章主要给大家介绍了关于mybatis注入Date日期值为null的解决方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-11-11
  • java的三种随机数生成方式

    java的三种随机数生成方式

    主要介绍了java的三种随机数生成方式的实现方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,,需要的朋友可以参考下
    2021-07-07
  • Java 的 Condition 接口与等待通知机制详解

    Java 的 Condition 接口与等待通知机制详解

    在 Java 并发编程里,实现线程间的协作与同步是极为关键的任务,本文将深入探究Condition接口及其背后的等待通知机制,感兴趣的朋友一起看看吧
    2025-05-05
  • springboot整合rabbitmq的示例代码

    springboot整合rabbitmq的示例代码

    本篇文章主要介绍了springboot整合rabbitmq的示例代码,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-12-12
  • Mybatis如何使用注解优化代码

    Mybatis如何使用注解优化代码

    这篇文章主要介绍了Mybatis如何使用注解优化代码,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-11-11
  • java实现遗传算法实例分享(打印城市信息)

    java实现遗传算法实例分享(打印城市信息)

    本文介绍java实现遗传算法的实例,代码中使用城市名做为数据,可以打印当前代数的所有城市序列,以及其相关的参数,大家参考使用吧
    2014-01-01
  • Maven的使用和配置国内源的保姆级教程

    Maven的使用和配置国内源的保姆级教程

    Maven是⼀个项目管理工具,基于POM(Project Object Model,项目对象模型)的概念,Maven可以通过一小段描述信息来管理项目的构建,报告和文档的项目管理工具软件,很多新手还不够了解maven,所以本文给大家讲解Maven的使用和配置,需要的朋友可以参考下
    2025-04-04
  • 浅谈JavaWeb中的web.xml配置部署描述符文件

    浅谈JavaWeb中的web.xml配置部署描述符文件

    下面小编就为大家带来一篇浅谈JavaWeb中的web.xml配置部署描述符文件。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-05-05

最新评论