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题解Leetcode 8字符串转换整数

    java题解Leetcode 8字符串转换整数

    这篇文章主要为大家介绍了java题解Leetcode 8字符串转换整数实现,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-06-06
  • Java使用split分割无效获取不到预期效果的解决办法

    Java使用split分割无效获取不到预期效果的解决办法

    这篇文章主要给大家介绍了关于Java使用split分割无效获取不到预期效果的解决办法,java的String类中有个split方法,这个是我们经常使用到的,需要的朋友可以参考下
    2023-08-08
  • Java如何按16进制发送和接收TCP指令

    Java如何按16进制发送和接收TCP指令

    这篇文章主要介绍了Java如何按16进制发送和接收TCP指令问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2023-09-09
  • Spring中ImportBeanDefinitionRegistrar源码和使用方式

    Spring中ImportBeanDefinitionRegistrar源码和使用方式

    Spring容器扩展流程总结:1. 定义Mapper层,2. 通过FactoryBean创建代理对象,3. 使用ImportBeanDefinitionRegistrar修改Bean定义,4. 应用自定义注解@LuoyanImportBeanDefinitionRegistrar,5. 配置类中执行后置处理器,6. 启动类中查看源码,希望对大家有所帮助
    2024-11-11
  • SpringBoot遇到的坑@Qualifier报红的解决

    SpringBoot遇到的坑@Qualifier报红的解决

    这篇文章主要介绍了SpringBoot遇到的坑@Qualifier报红的解决,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-11-11
  • Spring中的refresh方法分析

    Spring中的refresh方法分析

    这篇文章主要介绍了Spring中的refresh方法分析,文章围绕主题展开详细的refresh方法相关资料介绍,需要的小伙伴可以参考一下
    2022-05-05
  • Sentinel 断路器在Spring Cloud使用详解

    Sentinel 断路器在Spring Cloud使用详解

    Sentinel是阿里巴巴开源的一款微服务流量控制组件,主要以流量为切入点,从流量路由、流量控制、流量整形、熔断降级、系统自适应过载保护、热点流量防护等多个维度来帮助开发者保障微服务的稳定性,本文介绍Sentinel 断路器在Spring Cloud使用,感兴趣的朋友一起看看吧
    2025-02-02
  • 基于Java实现二维码的生成和解析

    基于Java实现二维码的生成和解析

    二维码其实就是一种编码技术,只是这种编码技术是用在图片上了,将给定的一些文字,数字转换为一张经过特定编码的图片。本文将利用Java实现二维码的生成和解析,需要的可以参考一下
    2022-08-08
  • SpringBoot中@RestControllerAdvice注解的使用

    SpringBoot中@RestControllerAdvice注解的使用

    这篇文章主要介绍了SpringBoot中@RestControllerAdvice注解的使用,@RestControllerAdvice主要用精简客户端返回异常,它可以捕获各种异常,需要的朋友可以参考下
    2024-01-01
  • SpringCloud中分析讲解Feign组件添加请求头有哪些坑梳理

    SpringCloud中分析讲解Feign组件添加请求头有哪些坑梳理

    在spring cloud的项目中用到了feign组件,简单配置过后即可完成请求的调用。又因为有向请求添加Header头的需求,查阅了官方示例后,就觉得很简单,然后一顿操作之后调试报错...下面我们来详细了解
    2022-06-06

最新评论