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

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

在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

3. 创建文件上传控制器

import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;
import java.io.IOException;
import java.nio.file.*;@RestController
@RequestMapping("/api/images")
public class ImageController {// 指定保存目录(示例路径,可根据需求修改)private static final String UPLOAD_DIR = "uploads/";@PostMapping("/upload")public String uploadImage(@RequestParam("image") MultipartFile file) {try {// 创建目录(如果不存在)Path uploadPath = Paths.get(UPLOAD_DIR);if (!Files.exists(uploadPath)) {Files.createDirectories(uploadPath);}// 生成唯一文件名(防止覆盖)String fileName = System.currentTimeMillis() + "_" + file.getOriginalFilename();Path filePath = uploadPath.resolve(fileName);// 保存文件Files.copy(file.getInputStream(), filePath, StandardCopyOption.REPLACE_EXISTING);return "文件上传成功: " + fileName;} catch (IOException e) {e.printStackTrace();return "文件上传失败: " + e.getMessage();}}
}

4. 前端调用示例(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/api/images/upload', {method: 'POST',body: formData});const result = await response.text();console.log(result);
}
</script>

关键点说明:

  1. 文件保存路径

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

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

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

进阶优化建议:

  1. 返回文件访问URL

    // 在Controller中返回完整访问路径
    String fileUrl = "http://your-domain.com/images/" + fileName;
    return Map.of("url", fileUrl);
    
  2. 添加文件类型校验

    if (!file.getContentType().startsWith("image/")) {return "仅支持图片文件";
    }
    
  3. 使用配置化路径

    # application.properties
    app.upload.dir=/var/www/uploads/
    
    @Value("${app.upload.dir}")
    private String uploadDir;
    
  4. 添加安全限制

    • 限制文件扩展名(jpg, png等)
    • 使用病毒扫描工具扫描上传文件
  5. 云存储方案

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

处理流程示意图:

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

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

http://www.lqws.cn/news/69841.html

相关文章:

  • Android高级开发第三篇 - JNI异常处理与线程安全编程
  • 使用 PHP 和 Guzzle 对接印度股票数据源API
  • 【Android】MT6835 + MT6631 WiFi进入Meta模式出现WiFi_HQA_OpenAdapter failed
  • 【Elasticsearch】Elasticsearch 核心技术(一):索引
  • 大数据-275 Spark MLib - 基础介绍 机器学习算法 集成学习 随机森铃 Bagging Boosting
  • MySQL数据库从0到1
  • 基于FPGA的VGA显示文字和动态数字基础例程,进而动态显示数据,类似温湿度等
  • 监控 100 台服务器磁盘内存CPU利用率
  • MPTCP 聚合吞吐
  • StarRocks部署方案详解:从单机到分布式集群
  • TDengine 的 AI 应用实战——电力需求预测
  • 【存储基础】存储设备和服务器的关系和区别
  • 第1篇:数据库中间件概述:架构演进、典型方案与应用场景
  • 序列搜索策略
  • PromQL 快速上手
  • 4.RV1126-OPENCV 图像轮廓识别
  • 【SpringBoot】| 接口架构风格—RESTful
  • 什么是 CPU 缓存模型?
  • 深入探讨redis:缓存
  • vue-13(延迟加载路由)
  • Vue-6-前端框架Vue之基于Plotly.js绘制曲线
  • 【软件测试】web自动化:Pycharm+Selenium+Firefox(一)
  • WebSocket与Reactor模式:构建实时交互应用
  • Qt OpenGL 实现交互功能(如鼠标、键盘操作)
  • 【基于阿里云搭建数据仓库(离线)】Data Studio创建资源与函数
  • [Java恶补day13] 53. 最大子数组和
  • AI大数据模型如何与thingsboard物联网结合
  • 基于SpringBoot运动会管理系统设计和实现(源码+文档+部署讲解)
  • 20250602在荣品的PRO-RK3566开发板的Android13下打开关机对话框
  • 【LeetCode 题解】两数之和(C++/Python 双解法):从语法到算法的全面解析