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
#====自定義變量======
#文件上傳地址
file.upload.dir=uploads/

3. 創建文件上傳控制器

package com.hirain.mall.controller;import com.hirain.mall.common.ApiRestResponse;
import jakarta.servlet.http.HttpServletRequest;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.multipart.MultipartFile;import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.Map;
import java.util.UUID;@RestController
@RequestMapping("/images")
public class ImageController {@Value("${file.upload.dir}") // 從配置文件中讀取路徑private String uploadDir;@PostMapping("/upload")public ApiRestResponse<?> uploadImage(@RequestParam("image") MultipartFile file,HttpServletRequest request) {try {// 創建目錄 (如果不存在)Path uploadPath = Paths.get(uploadDir);if (!Files.exists(uploadPath)) {Files.createDirectories(uploadPath);}// 生成唯一文件名 (避免覆蓋)String originalFileName = file.getOriginalFilename();String fileExt = originalFileName.substring(originalFileName.lastIndexOf("."));String newFileName = UUID.randomUUID() + fileExt;// 保存文件Path targetPath = uploadPath.resolve(newFileName);Files.copy(file.getInputStream(), targetPath);// 生成訪問 URL (使用環境信息構建完整URL)String baseUrl = request.getRequestURL().toString().replace(request.getRequestURI(), "");String imageUrl = baseUrl + "/images/" + newFileName;return ApiRestResponse.success(Map.of("filename", newFileName,"url", imageUrl//完成靜態資源映射配置后,通過瀏覽器直接訪問該地址即可訪問圖片));} catch (Exception e) {return ApiRestResponse.error(500,"上傳失敗: " + e.getMessage());}}
}

4.靜態資源映射配置類WebConfig

package com.hirain.mall.config;import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;import java.io.File;@Configuration
public class WebConfig implements WebMvcConfigurer {@Value("${file.upload.dir}")private String uploadDir;@Overridepublic void addResourceHandlers(ResourceHandlerRegistry registry) {// 將真實的上傳目錄映射為虛擬路徑registry.addResourceHandler("/images/**").addResourceLocations("file:" + uploadDir + File.separator);}
}

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

6. postman調用示例

在這里插入圖片描述

關鍵點說明:

  1. 文件保存路徑

    • 示例中使用相對路徑uploads/(項目根目錄下)
    • 生產環境建議使用絕對路徑(如/var/www/uploads/
  2. 文件名處理

    • 使用時間戳前綴確保唯一性
    • 保留原始文件名后綴(通過file.getOriginalFilename()獲取)
  3. 異常處理

    • 捕獲IOException處理文件操作異常
    • 返回錯誤信息給前端

進階優化建議:

  1. 添加文件類型校驗

    if (!file.getContentType().startsWith("image/")) {return "僅支持圖片文件";
    }
    
  2. 添加安全限制

    • 限制文件擴展名(jpg, png等)
    • 使用病毒掃描工具掃描上傳文件
  3. 云存儲方案

    • 生產環境建議使用云存儲(AWS S3, 阿里云OSS等)
    • 示例代碼替換為云存儲SDK的上傳邏輯

處理流程示意圖:

在這里插入圖片描述
其中,前端上傳圖片后,后端保存在本地的流程如下:

前端 → 發送Multipart請求 → Spring控制器 → 驗證文件 → 生成唯一文件名 → 保存到本地 → 返回結果

根據實際需求選擇本地存儲或云存儲方案,并注意做好文件類型校驗和安全防護措施。

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

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

相關文章

應用層協議:HTTP

目錄 HTTP&#xff1a;超文本傳輸協議 1.1 HTTP報文 1.1.1 請求報文 1.1.2 響應報文 1.2 HTTP請求過程和原理 1.2.1 請求過程 1、域名&#xff08;DNS&#xff09;解析 2、建立TCP連接&#xff08;三次握手&#xff09; 3、發送HTTP請求 4、服務器處理請求 5、返回H…

商務合同范本智能審核系統 AI 大模型處理方案

1. 項目概述與目標 目標: 構建一個基于AI大模型的智能合同審核系統,能夠自動解析商務合同范本,識別其中的法律風險點(如權責不對等、違約金比例異常、條款模糊、缺失必要條款等),并結合企業內部合規數據庫進行實時比對,提供專業的修改建議,大幅提升合同審查的效率和合…

Kafka 消息隊列

一、 消息隊列 1. 什么是消息隊列 消息(Message)是指在應用間傳送的數據。消息可以非常簡單&#xff0c;比如只包含文本字符串&#xff0c;也可以更復雜&#xff0c;可能包含嵌入對象。消息隊列(Message Queue)是一種應用間的通信方式&#xff0c;消息發送后可以立即返回&…

NodeJS全棧WEB3面試題——P3Web3.js / Ethers.js 使用

3.1 Ethers.js 和 Web3.js 的主要區別是什么&#xff1f; 比較點Ethers.jsWeb3.js體積更輕量&#xff0c;適合前端較大&#xff0c;加載慢&#xff0c;適合 Node文檔文檔簡潔、現代化&#xff0c;支持 TypeScript文檔豐富&#xff0c;但不夠現代化模塊化設計高度模塊化&#x…

Ubuntu 桌面版忘記賬戶密碼的重置方法

如果你忘記了 Ubuntu 桌面版的用戶密碼&#xff0c;可以通過進入恢復模式&#xff08;Recovery Mode&#xff09;來重置密碼。以下是詳細步驟&#xff1a; 一、進入 GRUB 引導菜單 重啟計算機&#xff1a;點擊關機按鈕&#xff0c;選擇重啟。在啟動時按住 Shift 鍵&#xff1…

全志A40i android7.1 調試信息打印串口由uart0改為uart3

一&#xff0c;概述 1. 目的 將調試信息打印串口由uart0改為uart3。 2. 版本信息 Uboot版本&#xff1a;2014.07&#xff1b; Kernel版本&#xff1a;Linux-3.10&#xff1b; 二&#xff0c;Uboot 1. sys_config.fex改動 使能uart3(TX:PH00 RX:PH01)&#xff0c;并讓boo…

【五子棋在線對戰】二.項目結構設計 實用工具類模板的實現

項目結構設計 1.項目模塊劃分2.業務處理模塊子模塊的劃分3.實用工具類模板的實現3.1 日志宏的實現3.2 mysql工具3.3 JsonCpp工具3.4 string-Split工具 && file_util工具 1.項目模塊劃分 ● 數據管理模塊&#xff1a;依托 MySQL 數據庫&#xff0c;負責用戶數據的存儲與…

53 python akshare(獲取金融數據)

在金融數據獲取與分析領域,AkShare是一個強大且靈活的開源庫,它提供了豐富的金融數據接口,覆蓋股票、期貨、期權、基金、債券、外匯等多個金融市場。AkShare更專注于中國金融市場數據,并且支持從多個數據源獲取數據,具有更高的穩定性和更全面的數據覆蓋。 一、安裝akshar…

藍橋杯17114 殘缺的數字

問題描述 七段碼顯示器是一種常見的顯示數字的電子元件&#xff0c;它由七個發光管組成: 圖依次展示了數字 0~9 用七段碼來顯示的狀態&#xff0c;其中燈管為黃色表示點亮&#xff0c;灰色表示熄滅。根據燈管的亮暗狀態&#xff0c;我們可以用一個狀態碼(狀態碼是一個 7 位的…

Java觀察者模式深度解析:構建松耦合事件驅動系統的藝術

目錄 觀察者模式基礎解析核心結構與實現原理Java內置觀察者實現Spring框架中的高級應用典型應用場景與實戰案例觀察者模式變體與優化常見問題與最佳實踐總結與未來展望1. 觀察者模式基礎解析 1.1 模式定義與核心思想 觀察者模式(Observer Pattern)是一種行為型設計模式,它…

NocoBase v1.7.0 正式版發布

原文鏈接&#xff1a;https://www.nocobase.com/cn/blog/nocobase-1-7-0。 新特性 用戶角色并集 角色并集是一種權限管理模式&#xff0c;根據系統設置&#xff0c;系統開發者可以選擇使用獨立角色、允許角色并集&#xff0c;或者僅使用角色并集&#xff0c;以滿足不同的權限…

破解通信難題,modbus轉profibus網關在高爐水沖渣系統中穩定好用

基于在高爐水沖渣傳動監控系統的工藝背景下,穩聯技術Profibus-Modbus網關在控制系統中使支持Profibus協議的設備與支持Modbus RTU協議的設備之間進行通訊協議轉換的作用,使得支持不同通訊協議的設備之間能夠進行數據傳遞,并且給出了設計方法.應用Profibus-Modbus總線橋WL-ABD30…

開源是什么?我們為什么要開源?

本片為故事類文章推薦聽音頻哦 軟件自由運動的背景 夢開始的地方 20世紀70年代&#xff0c;軟件行業處于早期發展階段&#xff0c;軟件通常與硬件捆綁銷售&#xff0c;用戶對軟件的使用、修改和分發權利非常有限。隨著計算機技術的發展和互聯網的普及&#xff0c;越來越多的開…

Educational Codeforces Round 179 (Rated for Div. 2)(A-E)

題目鏈接&#xff1a;Dashboard - Educational Codeforces Round 179 (Rated for Div. 2) - Codeforces A. Energy Crystals 思路 貪心地模擬一下過程很容易就看出來了&#xff0c;每次變成盡可能大的數 1 1 0 -> 1 1 3 -> 3 3 5 -> 5 5 11....我們只需要關注最大…

React Native開發鴻蒙運動健康類應用的項目實踐記錄

??項目名稱??&#xff1a;HarmonyFitness - 基于React Native的鴻蒙運動健康應用 ??技術棧??&#xff1a;React Native 0.72.5 TypeScript HarmonyOS API ArkTS原生模塊 一、環境搭建與項目初始化 ??雙環境配置?? ??React Native環境??&#xff1a; npx re…

Linux --UDP套接字實現簡單的網絡聊天室

一、Server端的實現 1.1、服務端的初始化 ①、創建套接字&#xff1a; 創建套接字接口&#xff1a; #include <sys/types.h> /* See NOTES */ #include <sys/socket.h> int socket(int domain, int type, int protocol); //1. 這是一個創建套接字的接…

Eureka 高可用集群搭建實戰:服務注冊與發現的底層原理與避坑指南

引言&#xff1a;為什么 Eureka 依然是存量系統的核心&#xff1f; 盡管 Nacos 等新注冊中心崛起&#xff0c;但金融、電力等保守行業仍有大量系統運行在 Eureka 上。理解其高可用設計與自我保護機制&#xff0c;是保障分布式系統穩定的必修課。本文將手把手帶你搭建生產級 Eur…

Spring Boot應用開發實戰

Spring Boot應用開發實戰&#xff1a;從零到生產級項目的深度指南 在當今Java生態中&#xff0c;Spring Boot已占據絕對主導地位——據統計&#xff0c;超過75%的新Java項目選擇Spring Boot作為開發框架。本文將帶您從零開始&#xff0c;深入探索Spring Boot的核心精髓&#xf…

yum更換阿里云的鏡像源

步驟 1&#xff1a;備份原有源配置&#xff08;重要&#xff01;&#xff09; sudo mkdir /etc/yum.repos.d/backup sudo mv /etc/yum.repos.d/CentOS-* /etc/yum.repos.d/backup/步驟 2&#xff1a;下載阿里云源配置 sudo curl -o /etc/yum.repos.d/CentOS-Base.repo https:…

【算法訓練營Day06】哈希表part2

文章目錄 四數相加贖金信三數之和四數之和 四數相加 題目鏈接&#xff1a;454. 四數相加 II 這個題注意它只需要給出次數&#xff0c;而不是元組。所以我們可以分治。將前兩個數組的加和情況使用map存儲起來&#xff0c;再將后兩個數組的加和情況使用map存儲起來&#xff0c;ke…