在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 {@Overridepublic 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 {@Autowiredprivate 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中實現圖片的上傳和修改功能。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/74880.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/74880.shtml
英文地址,請注明出處:http://en.pswp.cn/web/74880.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

網絡原理 - HTTP/HTTPS

1. HTTP 1.1 HTTP是什么&#xff1f; HTTP (全稱為 “超文本傳輸協議”) 是?種應用非常廣泛的應用層協議. HTTP發展史&#xff1a; HTTP 誕生于1991年. 目前已經發展為最主流使用的?種應用層協議 最新的 HTTP 3 版本也正在完善中, 目前 Google / Facebook 等公司的產品已經…

第十屆MathorCup高校數學建模挑戰賽-A題:無車承運人平臺線路定價問題

目錄 摘 要 一、問題提出 1.1 背景 1.2 問題重述 二、基本假設 三、符號說明 四、問題分析 4.1 問題一的分析 4.2 問題二的分析 4.3 問題三的分析 4.4 問題四的分析 五、模型的建立與求解 5.1 問題一模型的建立與求解 5.1.1 數據預處理 5.1.2 問題一結果檢驗:因子分析模型 5.2…

C++假期練習

思維導圖 牛客練習

Go語言-初學者日記(四):包管理

眾所周知——“包”治百病。 理解包與模塊&#xff0c;是 Go 邁向工程化開發的關鍵一環&#xff01; &#x1f4c2; 一、包&#xff08;Package&#xff09;是 Go 的基本組織單位 在 Go 中&#xff0c;每個 .go 文件都屬于某個包&#xff08;package&#xff09;&#xff1a; …

Scala面向對象2

1. 抽象屬性和方法&#xff1a;用 abstract 關鍵字定義抽象類&#xff0c;其中抽象屬性無初始值&#xff0c;抽象方法無實現 。重寫抽象方法需用 override &#xff0c;重寫抽象屬性時&#xff0c;可變屬性用 var &#xff0c;不可變屬性用 val 。 匿名子類&#xff1a;和 Jav…

DiffAD:自動駕駛的統一擴散建模方法

25年3月來自新加坡公司 Carion 和北航的論文“DiffAD: A Unified Diffusion Modeling Approach for Autonomous Driving”。 端到端自動駕駛 (E2E-AD) 已迅速成為實現完全自動駕駛的一種有前途的方法。然而&#xff0c;現有的 E2E-AD 系統通常采用傳統的多任務框架&#xff0c…

Python四大核心數據結構深度解析:列表、元組、字典與集合

在Python編程語言中&#xff0c;數據結構是組織和存儲數據的基本方式。Python提供了四種內置的核心數據結構&#xff1a;列表&#xff08;List&#xff09;、元組&#xff08;Tuple&#xff09;、字典&#xff08;Dictionary&#xff09;和集合&#xff08;Set&#xff09;。這…

網絡編程—Socket套接字(TCP)

上篇文章&#xff1a; 網絡編程—Socket套接字&#xff08;UDP&#xff09;https://blog.csdn.net/sniper_fandc/article/details/146923670?fromshareblogdetail&sharetypeblogdetail&sharerId146923670&sharereferPC&sharesourcesniper_fandc&sharefro…

SkyWalking+Springboot實戰(最詳細)

本篇文章記錄了作者在0到1學習SkyWalking的過程&#xff0c;記錄了對SkyWalking的部署&#xff0c;學習&#xff0c;使用Bug解決等等過程 一、什么是SkyWalking 官方文檔&#xff1a; Apache SkyWalkinghttps://skywalking.apache.org/ SkyWalking 是一個開源的分布式追蹤、性…

Arduino示例代碼講解:Row-Column Scanning an 8x8 LED matrix with X-Y input LED矩陣

Arduino示例代碼講解:Row-Column Scanning an 8x8 LED matrix with X-Y input LED矩陣 Row-Column Scanning an 8x8 LED matrix with X-Y input LED矩陣功能概述硬件部分:軟件部分:代碼逐行解釋定義常量定義變量`setup()` 函數`loop()` 函數`readSensors()` 函數`refreshScr…

多線程編程中的鎖策略

目錄 1.悲觀鎖vs樂觀鎖 關鍵總結 悲觀鎖&#xff1a; 樂觀鎖&#xff1a; 選擇建議 用 悲觀鎖 當&#xff1a; 用 樂觀鎖 當&#xff1a; 2.重量級鎖vs輕量級鎖 選擇建議 用 輕量級鎖&#xff1a; 用 重量級鎖&#xff1a; 3.掛起等待鎖vs自旋鎖 關鍵細節說明 選擇…

負載均衡是什么,Kubernetes如何自動實現負載均衡

負載均衡是什么&#xff1f; 負載均衡&#xff08;Load Balancing&#xff09; 是一種網絡技術&#xff0c;用于將網絡流量&#xff08;如 HTTP 請求、TCP 連接等&#xff09;分發到多個服務器或服務實例上&#xff0c;以避免單個服務器過載&#xff0c;提高系統的可用性、可擴…

React-01React創建第一個項目(npm install -g create-react-app)

1. React特點 JSX是javaScript語法的擴展&#xff0c;React開發不一定使用JSX。單向響應的數據流&#xff0c;React實現單向數據流&#xff0c;減少重復代碼&#xff0c;比傳統數據綁定更簡單。等等 JSX是js的語法擴展&#xff0c;允許在js中編寫類似HTML的代碼 const …

小程序中的網絡請求

在小程序中&#xff0c;使用 wx.request( ) 這個方法來發送網路請求&#xff0c;整個請求的方式和 jQuery 里面的 $.ajax 方法是非常相似的。 在 wx.request( ) 這個方法中&#xff0c;接收一個配置對象&#xff0c;該配置對象中能夠配置的項目如下表&#xff1a; 關于服務器…

jvm 的attach 和agent機制

Java 的 Attach 和 Agent 機制在實際應用中得到了廣泛的成功應用&#xff0c;尤其是在監控、調試、性能分析、故障排查等方面。以下是這兩種機制在實際場景中的一些成功應用案例&#xff1a; 1. 性能監控與分析 Java Agent 和 Attach 機制廣泛應用于性能監控和分析&#xff0…

基于SpringBoot的“留守兒童網站”的設計與實現(源碼+數據庫+文檔+PPT)

基于SpringBoot的“留守兒童網站”的設計與實現&#xff08;源碼數據庫文檔PPT) 開發語言&#xff1a;Java 數據庫&#xff1a;MySQL 技術&#xff1a;SpringBoot 工具&#xff1a;IDEA/Ecilpse、Navicat、Maven 系統展示 系統整體功能圖 局部E-R圖 系統首頁界面 系統注冊…

iPhone XR:一代神機,止步于此

什么樣的 iPhone &#xff0c;才配稱為一代神機&#xff1f; 我曾經用過iPhone 4S、iPhone 6S Plus、iPhone 8 Plus&#xff0c;iPhone SE2、iPhone XR、iPhone 13、iPhone 14 Plus、iPhone 15/Pro。 不管硬件再怎么卷&#xff0c;不管囊中是否羞澀&#xff0c;主力機基本沒考…

【VUE】RuoYi-Vue3項目結構的分析

【VUE】RuoYi-Vue3項目結構的分析 1. 項目地址2. RuoYi-Vue3項目結構2.1 整體結構2.2 package.json2.2.1 &#x1f9fe; 基本信息2.2.2 &#x1f527; 腳本命令&#xff08;scripts&#xff09;2.2.3 &#x1f30d; 倉庫信息2.2.4 &#x1f4e6; 項目依賴&#xff08;dependenc…

架構師面試(二十五):分布式存儲 Leader 設計

問題 在非常多的分布式存儲系統中&#xff0c;如&#xff1a;Zookeeper、Etcd、Kafka等&#xff0c;往往會存在一個 【Leader】 角色&#xff0c;并由該角色負責數據的寫入&#xff0c;這樣設計最主要的原因是什么呢&#xff1f; A. 唯一負責數據寫入的 Leader 角色可以避免并…

使用YoloV5和Mediapipe實現——上課玩手機檢測(附完整源碼)

目錄 效果展示 應用場景舉例 1. 課堂或考試監控&#xff08;看到這個學生黨還會愛我嗎&#xff09; 2. 駕駛安全監控&#xff08;防止開車玩手機&#xff09; 3. 企業辦公管理&#xff08;防止工作時間玩手機&#xff09; 4. 監獄、戒毒所、特殊場所安保 5. 家長監管&am…