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

使用 Spring Boot 实现图片上传

目录

一、前言? ? ? ??

二、项目准备

2.1、创建SpringBoot项目

2.2、项目结构

2.3、配置文件

2.4、创建控制器

2.5、创建服务

2.6创建前端界面

2.7、静态资源

三、运行项目

四、测试上传功能

总结


一、前言

在现代 web 开发中,图片上传功能是一个常见的需求。本文将介绍如何使用 Spring Boot 实现一个简单的图片上传功能,包括文件的上传、存储和展示。我们将使用 Spring Boot 的文件上传功能,并结合 Thymeleaf 作为模板引擎来构建前端界面。

二、项目准备

2.1、创建SpringBoot项目

可以使用 Spring Initializr 创建一个新的 Spring Boot 项目。选择以下依赖:

  • Spring Web
  • Thymeleaf
  • Spring Boot DevTools(可选,方便开发时热部署)

2.2、项目结构

springboot-image-upload

├── src
│ ├── main
│ │ ├── java
│ │ │ └── com
│ │ │ └── example
│ │ │ └── imageupload
│ │ │ ├── ImageUploadApplication.java
│ │ │ ├── controller
│ │ │ │ └── ImageUploadController.java
│ │ │ └── service
│ │ │ └── ImageUploadService.java
│ │ └── resources
│ │ ├── static
│ │ ├── templates
│ │ │ └── upload.html
│ │ └── application.properties
└── pom.xml

2.3、配置文件

src/main/resources/application.properties中,添加如下配置:

# 文件上传的最大大小 spring.servlet.multipart.max-file-size=2MB spring.servlet.multipart.max-request-size=2MB # 上传文件的存储路径 file.upload-dir=uploads

2.4、创建控制器

com.example.imageupload.controller包下,创建ImageUploadController类。

package com.example.imageupload.controller; import com.example.imageupload.service.ImageUploadService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Controller; import org.springframework.ui.Model; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.multipart.MultipartFile; import java.util.List; @Controller public class ImageUploadController { @Autowired private ImageUploadService imageUploadService; @GetMapping("/") public String uploadPage(Model model) { List<String> uploadedImages = imageUploadService.getUploadedImages(); model.addAttribute("uploadedImages", uploadedImages); return "upload"; } @PostMapping("/upload") public String uploadImage(@RequestParam("file") MultipartFile file, Model model) { if (file.isEmpty()) { model.addAttribute("message", "请选择一个文件进行上传"); return "upload"; } // 保存文件 String imagePath = imageUploadService.uploadImage(file); model.addAttribute("message", "文件上传成功: " + imagePath); model.addAttribute("uploadedImages", imageUploadService.getUploadedImages()); return "upload"; } }

2.5、创建服务

com.example.imageupload.service包下,创建ImageUploadService类。

package com.example.imageupload.service; import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Service; import org.springframework.web.multipart.MultipartFile; import java.io.File; import java.io.IOException; import java.nio.file.Files; import java.nio.file.Path; import java.nio.file.Paths; import java.util.ArrayList; import java.util.List; @Service public class ImageUploadService { @Value("${file.upload-dir}") private String uploadDir; public String uploadImage(MultipartFile file) { try { // 确保目录存在 File dir = new File(uploadDir); if (!dir.exists()) { dir.mkdirs(); } // 文件保存路径 Path filePath = Paths.get(uploadDir, file.getOriginalFilename()); file.transferTo(filePath); return file.getOriginalFilename(); } catch (IOException e) { e.printStackTrace(); return null; } } public List<String> getUploadedImages() { List<String> images = new ArrayList<>(); File dir = new File(uploadDir); if (dir.exists()) { for (File file : dir.listFiles()) { images.add(file.getName()); } } return images; } }

2.6创建前端界面

src/main/resources/templates目录下,创建upload.html文件。

<!DOCTYPE html> <html xmlns:th="http://www.thymeleaf.org"> <head> <title>图片上传</title> <link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.5.2/css/bootstrap.min.css"> </head> <body> <div class="container"> <h1 class="mt-5">图片上传</h1> <form action="/upload" method="post" enctype="multipart/form-data"> <div class="form-group"> <label for="file">选择文件</label> <input type="file" class="form-control-file" id="file" name="file" required> </div> <button type="submit" class="btn btn-primary">上传</button> </form> <div th:if="${message}" class="alert alert-info mt-3"> <p th:text="${message}"></p> </div> <h2 class="mt-5">已上传的图片</h2> <div class="row"> <div class="col-md-3" th:each="image : ${uploadedImages}"> <div class="card mb-4"> <img th:src="@{/uploads/{image}(image=image)}" class="card-img-top" alt="图片"> <div class="card-body"> <h5 class="card-title" th:text="${image}"></h5> </div> </div> </div> </div> </div> </body> </html>

2.7、静态资源

src/main/resources/static目录下,创建uploads文件夹,确保上传的图片能够被访问。

三、运行项目

确保项目依赖已经正确引入,并在 IDE 中启动项目。打开浏览器,访http://localhost:8080/,你应该可以看到上传界面。

四、测试上传功能

  1. 选择一个图片文件进行上传,点击“上传”按钮。
  2. 上传成功后,页面会显示上传的消息和已上传的图片列表。

总结

通过上述步骤,我们成功实现了一个简单的图片上传功能。你可以根据自己的需求进一步扩展功能,比如增加文件类型和大小的限制、支持多文件上传、实现文件的删除功能等。希望这个示例能帮助你在项目中实现图片上传功能!

http://www.jsqmd.com/news/480902/

相关文章:

  • 盘点2026年上海好用的家庭装修公司,专业室内装修公司哪家性价比高 - mypinpai
  • CLIP ViT-H-14部署教程:GPU多卡负载均衡与特征提取任务分发
  • 选购防爆矿用干式变压器,内蒙古、贵州地区哪家口碑好? - myqiye
  • 2026年靠谱的竞速无人机模拟器APP排行榜,带你了解品牌 - 工业品牌热点
  • 美缝品牌推荐,卓高美缝性价比高吗,全国服务覆盖广吗? - 工业设备
  • 北京/上海/深圳/杭州/南京/无锡高端腕表维修干货,36个品牌故障应对+正规门店实用指南 - 时光修表匠
  • Qwen3.5-35B-A3B-AWQ-4bit企业级部署方案:生产环境双卡容错与热重启实践
  • 题解:P15653 [省选联考 2026] 星图 / starmap
  • 2026年3月,寻找优质四通球阀制造厂家,可靠的四通球阀有哪些赋能企业生产效率提升与成本优化 - 品牌推荐师
  • 术语俗话 --- dto、vo、Entity是什么
  • NOP源码分析 十一
  • NOP源码分析 六
  • NOP源码分析五
  • 2026-03-15
  • 软件研发 --- ( pear-admin-flask 项目结构)Flask + Layui 项目标准开发模板
  • 2026年OMO模式电商零售系统优选,提升零售竞争力,县域数字化运营,OMO模式电商零售平台怎么选择 - 品牌推荐师
  • 分析50Ω空气线差分探头,哪家性价比高? - 工业推荐榜
  • Memos 备忘录的Markdown语法介绍
  • 2026不锈钢筛板定制风向标,口碑厂家实力推荐,目前不锈钢筛板技术领航,品质之选 - 品牌推荐师
  • UG NX中快速摆正零件视角的几种常用方法
  • NOP源码分析 二
  • NOP源码分析五---set的存储
  • 动态内存分配
  • 1018: 士兵排阵
  • 数据库优化(面试标准回答 + 博客版)
  • 2026年停车场管理服务推荐哪些,北京权威企业盘点 - mypinpai
  • 2026年国内不错的发际线种植品牌推荐,这几家值得关注!不剃发植发/发际线种植/发际线调整,发际线种植医院推荐哪些 - 品牌推荐师
  • NOP源码分析四
  • 盘点2026年口碑好的西服定制品牌,宁波郡狮手工高档结婚西服定制亮眼 - 工业品牌热点
  • 2026年低温同轴铜镍电缆什么品牌好,快来一起探讨 - 工业设备