当前位置: 首页 > 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 {@Autowiredprivate 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. 上传成功后,页面会显示上传的消息和已上传的图片列表。

总结

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

相关文章:

使用 Spring Boot 实现图片上传

目录 一、前言 二、项目准备 2.1、创建SpringBoot项目 2.2、项目结构 2.3、配置文件 2.4、创建控制器 2.5、创建服务 2.6创建前端界面 2.7、静态资源 三、运行项目 四、测试上传功能 总结 一、前言 在现代 web 开发中&#xff0c;图片上传功能是一个…...

深度解析跨境支付之产品架构

跨境支付企业有能力开放更多的底层能力接口给到外界合作伙伴。其中包括购汇及申报、结汇及申报、换汇&#xff08;包含汇率查询和外汇兑换、远期锁汇等功能&#xff09;、境外本地下单、查询、退款、外汇跨境收款、海外代发、VA账户开户及余额查询、VCC发卡及查询等能力。 在这…...

Linux下的线程同步与死锁避免

文章目录 死锁的四个必要条件破坏死锁条件的方法破坏互斥条件使用读写锁&#xff08;pthread_rwlock_t&#xff09; 破坏持有并等待条件一次性申请所有资源 破坏不可剥夺条件使用超时锁定机制可重入锁&#xff08;递归锁&#xff09; 破坏循环等待条件统一锁顺序 在 Linux 下进…...

【Python爬虫实战】Selenium自动化网页操作入门指南

#1024程序员节&#xff5c;征文# &#x1f308;个人主页&#xff1a;易辰君-CSDN博客 &#x1f525; 系列专栏&#xff1a;https://blog.csdn.net/2401_86688088/category_12797772.html ​ 目录 前言 一、准备工作 &#xff08;一&#xff09;安装 Selenium 库 &#xff0…...

mono源码交叉编译 linux arm arm64全过程

初级代码游戏的专栏介绍与文章目录-CSDN博客 我的github&#xff1a;codetoys&#xff0c;所有代码都将会位于ctfc库中。已经放入库中我会指出在库中的位置。 这些代码大部分以Linux为目标但部分代码是纯C的&#xff0c;可以在任何平台上使用。 源码指引&#xff1a;github源…...

矩阵的可解性:关于Ax=b的研究

上一篇文章讲解了如何求解 A x 0 Ax0 Ax0&#xff0c;得到 A A A的零空间。 类似的&#xff0c;我们今天学习的是如何求解 A x b Axb Axb&#xff0c;并以此加强你对线性代数中&#xff0c;代数与空间的理解。 同样的&#xff0c;我们举与上一次一样的例子&#xff0c;矩阵 …...

10.22.2024刷华为OD C题型(三)--for循环例子

脚踝动了手术&#xff0c;现在宾馆恢复&#xff0c;伤筋动骨一百天还真不是说笑的&#xff0c;继续努力吧。 文章目录 靠谱的车灰度图恢复灰度图恢复 -- for循环使用例子 靠谱的车 https://www.nowcoder.com/discuss/564514429228834816 这个题目思路不难&#xff0c;就是要自…...

QT:MaintenanceTool 模块安装工具

QT的MaintenanceTool 工具对已安装的 Qt 进行卸载、修复等其他操作时提示At least one valid and enabled repository required for this action to succeed 解决方式&#xff1a;在设置中添加一个临时的仓库 https://mirrors.tuna.tsinghua.edu.cn/qt/online/qtsdkrepositor…...

同标签实现监听LocalStorage

使用 React 生命周期函数 useEffect来监听和处理 LocalStorage 的变化 import React, { useEffect } from react;const LocalStorageListener () > {useEffect(() > {// 注册监听器const handleStorageChange (event) > {if (event.key myKey) {console.log(注册…...

JAVA高性能缓存项目

版本一 代码实现 import java.util.HashMap; import java.util.concurrent.TimeUnit;public class CacheExample01 {private final static HashMap<String, Integer> cache new HashMap<>();public static Integer check(String userId) throws InterruptedExce…...

智慧农业大数据平台:智汇田园,数驭未来

智慧农业大数据平台 计讯物联智慧农业大数据平台是一个集管理数字化、作业自动化、生产智能化、产品绿色化、环境信息化、服务现代化于一体的多功能监管系统。它通过与硬件产品的搭配使用&#xff0c;实现对农业生产全过程的实时监测、精准控制和科学管理。该平台集成了多个数…...

Go语言基础教程:可变参数函数

Go 语言允许函数接收可变数量的参数&#xff0c;这种特性对于处理数量不确定的参数特别有用。在本教程中&#xff0c;我们将通过示例代码讲解如何定义和使用 Go 的可变参数函数。 package mainimport "fmt"// 定义一个可变参数函数 sum&#xff0c;接收任意数量的整…...

高并发场景下解决并发数据不一致

简单的场景: 全量数据更新的情况下, 不在乎同一秒的请求都必须要成功, 只留下最新的更新请求数据 方案常用的是 1、数据库增加时间戳标识实现的乐观锁, 请求参数从源头带上微秒或者毫秒时间戳数据库存储, 然后在更新SQL语句上比较 (数据库的时间 < 参数传递的时间) 例如: A…...

OpenAI GPT-o1实现方案记录与梳理

本篇文章用于记录从各处收集到的o1复现方案的推测以及介绍 目录 Journey Learning - 上海交通大学NYUMBZUAIGAIRCore IdeaKey QuestionsKey TechnologiesTrainingInference A Tutorial on LLM Reasoning: Relevant methods behind ChatGPT o1 - UCL汪军教授Core Idea先导自回归…...

Excel:vba实现生成随机数

Sub 生成随机数字()Dim randomNumber As IntegerDim minValue As IntegerDim maxValue As Integer 设置随机数的范围(假入班级里面有43个学生&#xff0c;学号是从1→43)minValue 1maxValue 43 生成随机数(在1到43之间生成随机数)randomNumber Application.WorksheetFunctio…...

Python | Leetcode Python题解之第506题相对名次

题目&#xff1a; 题解&#xff1a; class Solution:desc ("Gold Medal", "Silver Medal", "Bronze Medal")def findRelativeRanks(self, score: List[int]) -> List[str]:ans [""] * len(score)arr sorted(enumerate(score), …...

安全见闻(6)

声明&#xff1a;学习视频来自b站up主 泷羽sec&#xff0c;如涉及侵权马上删除文章 感谢泷羽sec 团队的教学 视频地址&#xff1a;安全见闻&#xff08;6&#xff09;_哔哩哔哩_bilibili 学无止境&#xff0c;开拓自己的眼界才能走的更远 本文主要讲解通讯协议涉及的安全问题。…...

Promise、async、await 、异步生成器的错误处理方案

1、Promise.all 的错误处理 Promise.all 方法接受一个 Promise 数组&#xff0c;并返回所有解析 Promise 的结果数组&#xff1a; const promise1 Promise.resolve("one"); const promise2 Promise.resolve("two");Promise.all([promise1, promise2]).…...

腾讯云:数智教育专场-学习笔记

15点13分2024年10月21日&#xff08;短短5天的时间&#xff0c;自己的成长速度更加惊人&#xff09;-开始进行“降本增效”学习模式&#xff0c;根据小米手环对于自己的行为模式分析&#xff08;不断地寻找数据之间的关联性&#xff09;&#xff0c;每天高效记忆时间&#xff0…...

Ovis: 多模态大语言模型的结构化嵌入对齐

论文题目&#xff1a;Ovis: Structural Embedding Alignment for Multimodal Large Language Model 论文地址&#xff1a;https://arxiv.org/pdf/2405.20797 github地址&#xff1a;https://github.com/AIDC-AI/Ovis/?tabreadme-ov-file 今天&#xff0c;我将分享一项重要的研…...

python的Django的render_to_string函数和render函数模板的使用

一、render_to_string render_to_string 是 Django 框架中的一个便捷函数&#xff0c;用于将模板渲染为字符串。 render_to_string(template_name.html, context, requestNone, usingNone) template_name.html&#xff1a;要渲染的模板文件的名称。context&#xff1a;传递给…...

基于Python大数据的王者荣耀战队数据分析及可视化系统

作者&#xff1a;计算机学姐 开发技术&#xff1a;SpringBoot、SSM、Vue、MySQL、JSP、ElementUI、Python、小程序等&#xff0c;“文末源码”。 专栏推荐&#xff1a;前后端分离项目源码、SpringBoot项目源码、Vue项目源码、SSM项目源码、微信小程序源码 精品专栏&#xff1a;…...

【Linux学习】(3)Linux的基本指令操作

前言 配置Xshell登录远程服务器Linux的基本指令——man、cp、mv、alias&which、cat&more&less、head&tail、date、cal、find、grep、zip&tar、bc、unameLinux常用热键 一、配置Xshell登录远程服务器 以前我们登录使用指令&#xff1a; ssh 用户名你的公网…...

Mac 使用脚本批量导入 Apple 歌曲

最近呢&#xff0c;买了一个 iPad&#xff0c;虽然家里笔记本台式都有&#xff0c;显示器都是 2个&#xff0c;比较方便看代码&#xff08;边打游戏边追剧&#xff09;。 但是在床上拿笔记本始终还是不方便&#xff0c;手机在家看还是小了点&#xff0c;自从有 iPad 之后&…...

全桥PFC电路及MATLAB仿真

一、PFC电路原理概述 PFC全称“Power Factor Correction”&#xff08;功率因数校正&#xff09;&#xff0c;PFC电路即能对功率因数进行校正&#xff0c;或者说是能提高功率因数的电路。是开关电源中很常见的电路。功率因数是用来描述电力系统中有功功率&#xff08;实际使用…...

【安当产品应用案例100集】025-确保数据安全传输——基于KMS与HSM的定期分发加密解决方案

引言&#xff1a; 在当今快速发展的数字化时代&#xff0c;企业面临着前所未有的信息安全挑战。尤其是在需要向供应商定期分发敏感数据的情况下&#xff0c;如何保证这些数据在传输过程中的安全性变得至关重要。为此&#xff0c;我们推出了结合安当KMS密钥管理平台与HSM密码机…...

十 缺陷检测解决策略之三:频域+空域

十 缺陷检测解决策略之三:频域空域 read_image (Image, 矩形) * 中间低频&#xff0c;四周高频 fft_image (Image, ImageFFT) * 中间低频&#xff0c;四周高频 fft_generic (Image, ImageFFT1, to_freq, -1, sqrt, dc_center, complex) * 中间高频&#xff0c;四周低频 rft_ge…...

有望第一次走出慢牛

A股已走完30多年历程。 大约每十年&#xff0c;会经历一轮牛熊周期。特点是每一轮周期&#xff0c;大约九成的时间都是熊市主导。就是我们常说的 快牛慢熊。 这一次&#xff0c;会不会重复历史? 历史不会简单重复。已经感受到了盘面的变化。 有人说&#xff0c;股市爆涨爆…...

计算机网络(十二) —— 高级IO

#1024程序员节 | 征文# 目录 一&#xff0c;预备 1.1 重新理解IO 1.2 五种IO模型 1.3 非阻塞IO 二&#xff0c;select 2.1 关于select 2.2 select接口参数解释 2.3 timeval结构体和fd_set类型 2.4 socket就绪条件 2.5 select基本工作流程 2.6 简单select的服务器代…...

电力行业 | 等保测评(网络安全等级保护)工作全解

电力行业为什么要做网络安全等级保护&#xff1f; 电力行业是关系到国家安全和社会稳定的基础性行业&#xff0c;电力行业信息化程度相对较高&#xff0c;是首批国家信息安全等级保护的重点行业。 01 国家法律法规的要求 1994《计算机信息系统安全保护条例》&#xff08;国务…...

ui设计参考网站有哪些/百度手机助手最新版下载

取余的符号问题 #include"stdio.h" int main() {//%的运算对象只能是整数printf("%d\n", 7 % 3);//输出结果为1printf("%d\n", 7 % -3);//输出结果为1printf("%d\n", -7 % 3);//输出结果为-1//a%b余数的正负号只与a的正负有关return 0…...

网站开始怎么做的/怎么建立企业网站

前言 前面文章介绍了【gophish搭建教程及演示】&#xff0c;今天这篇文章将详细的介绍gophish的使用&#xff0c;包括如何配置邮箱发送、配置钓鱼邮件模板、伪造钓鱼界面、建立用户和用户组等&#xff1b;废话不多少&#xff0c;直接开始吧&#xff1b; 注意&#xff1a;本篇文…...

做夹具需要知道的几个网站/发布信息的免费平台有哪些

展示图&#xff1a; 首先是配置 gzh.appid公众号appid wxPay.mchId商户号 wxPay.key支付密钥 wxPay.notifyUrl域名回调地址 常量&#xff1a; /**微信支付统一下单接口*/public static final String unifiedOrderUrl "https://api.mch.weixin.qq.com/pay/unifiedorder…...

具有价值的响应式网站/seo优化方式包括

在王者荣耀游戏中玩家可以进到别的玩家页面查询该玩家的一些信息&#xff0c;包括历史战绩、常用英雄、亲密关系等。有时候为了保护自己的隐私不被别的玩家看到&#xff0c;此时用户可以设置查阅权限&#xff0c;这样隐私就不会被泄露了。那如何设置呢&#xff1f;下面就跟大家…...

wordpress 查看url/百度手游排行榜

【题目】方阵填数&#xff1a;在一个 N*N的方阵中&#xff0c;填入 1,2..... N*N个数&#xff0c;并要求构成如下格式&#xff1a; 图例&#xff1a;10 11 12 19 16 13 28 15 14 37 6 5 4【上手】观察图例&#xff0c;不难看出这是一个螺旋矩阵&#xff0c;下面是色…...

设计教程网站/网络推广的主要工作内容

路径指文件存放的位置&#xff0c;在网页中利用路径可以引用文件&#xff0c;插入图像、视频等。表示路径的方法有两种&#xff1a;相对路径&#xff0c;绝对路径。以下讨论均是在HTML环境下进行。 相对路径 相对路径是指目标相对于当前文件的路径&#xff0c;网页结构设计中…...