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

在Spring Boot中实现图片上传和修改

1. 图片上传实现步骤

1.1 添加依赖

确保 spring-boot-starter-webspring-boot-starter-validation 已存在:

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-validation</artifactId>
</dependency>
1.2 配置文件上传限制

application.properties 中配置最大文件大小:

spring.servlet.multipart.max-file-size=10MB
spring.servlet.multipart.max-request-size=10MB
1.3 编写上传接口
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;
import java.io.File;
import java.io.IOException;
import java.util.UUID;

@RestController
public class ImageController {

    // 指定图片存储目录(示例路径,建议使用配置类或环境变量)
    private final String UPLOAD_DIR = "src/main/resources/static/images/";

    @PostMapping("/upload")
    public String uploadImage(@RequestParam("file") MultipartFile file) throws IOException {
        if (file.isEmpty()) {
            return "文件不能为空";
        }

        // 生成唯一文件名(防止重复)
        String originalFilename = file.getOriginalFilename();
        String fileExtension = originalFilename.substring(originalFilename.lastIndexOf("."));
        String newFileName = UUID.randomUUID() + fileExtension;

        // 创建目标文件
        File dest = new File(UPLOAD_DIR + newFileName);
        if (!dest.getParentFile().exists()) {
            dest.getParentFile().mkdirs(); // 创建目录
        }

        // 保存文件
        file.transferTo(dest);
        return "上传成功,访问地址: /images/" + newFileName;
    }
}
1.4 配置静态资源访问

默认情况下,static 目录下的文件可以直接访问。如果需要自定义路径,添加配置类:

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 {
    @Override
    public void addResourceHandlers(ResourceHandlerRegistry registry) {
        registry.addResourceHandler("/images/**")
                .addResourceLocations("file:src/main/resources/static/images/");
    }
}

2. 图片修改实现步骤

修改图片通常需要先删除旧图片,再上传新图片,并更新数据库记录(如果有)。

2.1 添加删除旧图片的逻辑
public class ImageController {

    @PostMapping("/update")
    public String updateImage(
            @RequestParam("oldFileName") String oldFileName,
            @RequestParam("newFile") MultipartFile newFile) throws IOException {
        
        // 删除旧图片
        File oldFile = new File(UPLOAD_DIR + oldFileName);
        if (oldFile.exists()) {
            oldFile.delete();
        }

        // 上传新图片
        return uploadImage(newFile);
    }
}
2.2 结合数据库操作(示例)

如果图片路径存储在数据库中,需结合JPA/Hibernate更新记录:

@Entity
public class User {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
    private String avatar; // 图片路径字段
    // getter/setter
}

@RestController
public class UserController {

    @Autowired
    private UserRepository userRepository;

    @PostMapping("/user/{userId}/avatar")
    public String updateAvatar(
            @PathVariable Long userId,
            @RequestParam("file") MultipartFile file) throws IOException {
        
        User user = userRepository.findById(userId).orElseThrow();
        
        // 删除旧头像(如果有)
        if (user.getAvatar() != null) {
            File oldFile = new File(UPLOAD_DIR + user.getAvatar());
            if (oldFile.exists()) oldFile.delete();
        }

        // 上传新头像并更新数据库
        String newFileName = UUID.randomUUID() + getFileExtension(file);
        file.transferTo(new File(UPLOAD_DIR + newFileName));
        user.setAvatar(newFileName);
        userRepository.save(user);

        return "头像更新成功";
    }

    private String getFileExtension(MultipartFile file) {
        String name = file.getOriginalFilename();
        return name.substring(name.lastIndexOf("."));
    }
}

3. 前端调用示例(HTML)

<form action="/upload" method="post" enctype="multipart/form-data">
    <input type="file" name="file">
    <button type="submit">上传</button>
</form>

<form action="/update" method="post" enctype="multipart/form-data">
    <input type="hidden" name="oldFileName" value="old-image.jpg">
    <input type="file" name="newFile">
    <button type="submit">修改图片</button>
</form>

4. 注意事项

  1. 安全性:限制文件类型(如仅允许 image/jpeg, image/png),避免上传恶意文件。
  2. 异常处理:捕获 IOException 并返回友好提示。
  3. 分布式部署:若多实例部署,需使用云存储(如阿里云OSS、七牛云)替代本地存储。
  4. 路径管理:建议将上传路径配置在 application.properties 中,避免硬编码。

通过以上步骤,即可在Spring Boot中实现图片的上传和修改功能。

相关文章:

  • STM32看门狗原理与应用详解:独立看门狗 vs 窗口看门狗(上) | 零基础入门STM32第九十四步
  • 设计模式:为什么使用模板设计模式(不相同的步骤进行抽取,使用不同的子类实现)减少重复代码,让代码更好维护。
  • C++语言的网络编程
  • 第一章:服务架构演进史_《凤凰架构:构建可靠的大型分布式系统》_Notes
  • 英文单词记忆系统:基于PyQt5与DeepSeek大模型的智能学习工具
  • UDP学习笔记(四)UDP 为什么大小不能超过 64KB?
  • 高级:性能优化面试题深度剖析
  • Node.js局部生效的中间件
  • pyTorch框架-迁移学习-实现四种天气图片多分类问题
  • 【Windows批处理】命令入门详解
  • Rust 2024介绍 | 开发环境搭建详细教程(rust 1.85.0)
  • 《Glance:一站式聚合信息,告别浏览器切换烦恼》
  • 国产芯片解析:龙讯USB Type-C/DP Transmitter多场景覆盖,定义高速互联新标杆
  • 21.OpenCV获取图像轮廓信息
  • 【js逆向】某日番动漫网视频地址解密
  • 车辆监控平台技术标准解析
  • Bert论文解析
  • 2019 CCF CSP-S2.树的重心
  • Linux驱动学习笔记(七)
  • IDEA加载项目时依赖无法更新
  • 雷神代刷推广网站/今日新闻国际头条新闻
  • 网站建设 大公司/制作自己的网站
  • seo优化器/太原seo排名优化软件
  • 怎么用自己主机做网站/app下载推广
  • 阿里巴巴国际站入驻费用及条件/推广网页
  • 网站策划案/社会新闻最新消息