云服務器--阿里云OSS(2)【Springboot使用阿里云OSS】

📒 阿里云 OSS + Spring Boot + 異步任務(直接存 OSS)

1. 項目結構

src/main/java/com/example/demo├── controller│     └── UploadController.java  // 接收上傳請求├── service│     ├── AsyncUploadService.java // 異步上傳邏輯│     └── OssService.java         // OSS 上傳工具類└── DemoApplication.java          // 主啟動類

2. Maven 依賴

<dependency><groupId>com.aliyun.oss</groupId><artifactId>aliyun-sdk-oss</artifactId><version>3.17.4</version>
</dependency>

3. application.properties 配置

# OSS 配置
oss.endpoint=https://oss-cn-hangzhou.aliyuncs.com #你的Endpoint(地域節點)點擊Bucket 列表點擊概覽滑到下面就能看到
oss.access-key-id=你的AccessKeyId
oss.access-key-secret=你的AccessKeySecret
oss.bucket-name=你的BucketName
oss.folder= images


4. OSS 上傳工具類 OssService.java

? ? ? ?oss上放置的資源分私有/公共讀/公共讀寫,我們如果選擇作為圖片/文件服務器時,選擇公共讀、私有寫?,每個文件可以單獨選擇讀寫權限,通過springboot代碼創建文件權限默認和Bucket的一致,如果這句話不太理解可以去看筆者的這篇博客:云服務器--阿里云OSS(1)【阿里云OSS簡單介紹以及環境準備】-CSDN博客

package com.example.demo.service;import com.aliyun.oss.OSS;
import com.aliyun.oss.OSSClientBuilder;
import lombok.RequiredArgsConstructor;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
import org.springframework.web.multipart.MultipartFile;import java.io.IOException;@Service
public class OssService {@Value("${oss.endpoint}")private String endpoint;@Value("${oss.access-key-id}")private String accessKeyId;@Value("${oss.access-key-secret}")private String accessKeySecret;@Value("${oss.bucket-name}")private String bucketName;@Value("${oss.folder}")private String folder;/*** 直接通過 MultipartFile 的輸入流上傳到 OSS*/public String uploadFile(MultipartFile file, String fileName) throws IOException {OSS ossClient = new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret);// 上傳文件(不落地到磁盤)ossClient.putObject(bucketName, fileName, file.getInputStream());ossClient.shutdown();//endpoint.replace("https://", ""),endpoint會帶有https://,會與前面的矛盾要去掉,endpoint中的https://String path = "https://" + bucketName + "." + endpoint.replace("https://", "") + "/" folder + "/"+ fileName;//可以把路徑保存到數據庫中,前端就可以根據這個路徑訪問了save(path);// 返回 OSS 文件訪問 URLreturn path;}
}

5 . 異步上傳服務 AsyncUploadService.java

package com.example.demo.service;import lombok.RequiredArgsConstructor;
import org.springframework.scheduling.annotation.Async;
import org.springframework.stereotype.Service;
import org.springframework.web.multipart.MultipartFile;@Service
public class AsyncUploadService {@Autowiredprivate OssService ossService;/*** 異步上傳文件到 OSS* @param file 上傳的 MultipartFile* @param fileName 存儲到 OSS 的文件名*/@Async // 異步執行,不阻塞主線程public void upload(MultipartFile file, String fileName) {try {// 直接通過 InputStream 上傳到 OSSossService.uploadFile(file, fileName);System.out.println("文件異步上傳完成:" + fileName);} catch (Exception e) {e.printStackTrace();// 這里可加失敗重試機制}}
}

6. 控制器 UploadController.java

?
package com.example.demo.controller;import com.example.demo.service.AsyncUploadService;
import lombok.RequiredArgsConstructor;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;import java.util.UUID;@RestController
@RequiredArgsConstructor
public class UploadController {private final AsyncUploadService asyncUploadService;/*** 接收文件上傳請求*/@PostMapping("/upload")public String upload(@RequestParam("file") MultipartFile file) {// 生成唯一文件名,避免重名覆蓋String fileName = UUID.randomUUID() + "-" + file.getOriginalFilename();// 異步上傳到 OSSasyncUploadService.upload(file, fileName);// 直接返回提示(上傳可能還在進行中)return "文件已接收,正在后臺上傳到 OSS...";}
}


7. 啟用異步任務

?
package com.example.demo;import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.scheduling.annotation.EnableAsync;@SpringBootApplication
@EnableAsync // 開啟 @Async 支持
public class DemoApplication {public static void main(String[] args) {SpringApplication.run(DemoApplication.class, args);}
}


🔍 邏輯說明

  1. 用戶上傳文件 → 控制器接收 MultipartFile

  2. 生成唯一文件名(避免 OSS 覆蓋舊文件)

  3. 異步執行上傳@Async 標記的方法)

  4. 直接用 MultipartFile.getInputStream() 上傳到 OSS(避免本地磁盤中轉)

  5. 返回提示信息(上傳還在后臺進行)


📌 關鍵點

  • 使用 異步任務 避免上傳過程阻塞 HTTP 請求

  • 使用 MultipartFile.getInputStream() 避免文件落地到本地磁盤

  • 生產環境可加 失敗重試機制(例如 Spring Retry)

  • OSS Bucket 權限一般用 公共讀 + 私有寫

    • 公共讀:用戶可直接訪問圖片 URL

    • 私有寫:只有服務器能寫入,防止惡意上傳

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

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

相關文章

get請求中文字符參數亂碼問題

第一種方法 服務器默認的傳參編碼格式是ISO8859-1,所以前端直接原樣字符串請求&#xff0c;到后端解析一下就得到正確字符 String fileName request.getParameter("fileName"); fileName new String(fileName.getBytes("ISO8859-1"),"UTF-8");…

C語言(10)——結構體、聯合體、枚舉

關于C語言零基礎學習知識&#xff0c;小編有話說&#xff0c;各位看官敬請入下面的專欄世界&#xff1a;打怪升級之路——C語言之路_ankleless的博客-CSDN博客 Hi&#xff01;冒險者&#x1f60e;&#xff0c;歡迎闖入 C 語言的奇幻異世界&#x1f30c;&#xff01; 我是 Ankle…

海康威視攝像頭實時推流到阿里云公網服務器(Windows + FFmpeg + nginx-rtmp)

海康威視攝像頭實時推流到阿里云公網服務器&#xff08;Windows FFmpeg nginx-rtmp1. 步驟總覽2. 阿里云 ECS&#xff08;Linux&#xff09;配置2.1 開放端口2.2 安裝 nginx-rtmp3. Windows 電腦端配置3.1 安裝 FFmpeg3.1.1 官網/鏡像下載&#xff1a;3.1.2 解壓后將 bin 目錄…

基礎網絡網路層——IPV4地址

在IP網絡上&#xff0c;如果用戶要將一臺計算機連接到Internet上&#xff0c;就需要向因特網服務提供方ISP&#xff08;Internet Service Provider&#xff09;申請一個IP地址。IP地址是在計算機網絡中被用來唯一標識一臺設備的一組數字。IPv4地址由32位二進制數值組成&#xf…

技術速遞|GPT-5 正式上線 Azure AI Foundry

AI 應用正在經歷一場深刻變革——對企業來說&#xff0c;僅僅“能聊天”早已不夠&#xff0c;生成內容、邏輯推理、落地生產&#xff0c;這些才是新時代對 AI 能力的真正考驗。 今天&#xff0c;我們非常激動地宣布&#xff0c;OpenAI 最新旗艦大模型 GPT-5 正式上線 Azure AI …

Logistic Regression|邏輯回歸

----------------------------------------------------------------------------------------------- 這是我在我的網站中截取的文章&#xff0c;有更多的文章歡迎來訪問我自己的博客網站rn.berlinlian.cn&#xff0c;這里還有很多有關計算機的知識&#xff0c;歡迎進行留言或…

三極管在電路中的應用

1、信號放大&#xff08;電壓放大&#xff09; 應用場景 &#xff1a;麥克風聲音放大、耳機驅動、廣播信號接收等音頻設備 原理解析 &#xff1a; 想象三極管如同一個精準的水龍頭&#xff1a; 基極&#xff08;B&#xff09;電流如同擰動閥門的微弱力量&#xff08;輸入信號&a…

Redis 事務機制

文章目錄一、什么是事務&#xff1f;二、事務相關操作總體認識基本操作流程watch 操作演示watch 原理一、什么是事務&#xff1f; Redis 的事務和 MySQL 的事務概念上是類似的. 都是把?系列操作綁定成?組. 讓這?組能夠批量執?. Redis 的事務和 MySQL 事務的區別&#xff1…

Mybatis學習之自定義映射resultMap(七)

這里寫目錄標題一、準備工作1、新建maven工程2、準備兩張表3、建立mapper、pojo、映射文件mapper接口pojoxxxMapper.xml二、resultMap處理字段和屬性的映射關系1、用起別名的方式保證字段名與屬性名一致2、逐一設置resultMap映射關系3、配置mapUnderscoreToCamelCase三、多對一…

數學學習 | 高數、線代、概率論及數理統計薦書

注&#xff1a;本文為 “數學學習書目推薦” 相關合輯。 略作重排&#xff0c;如有內容異常&#xff0c;請看原文。 高等數學、線性代數及概率論與數理統計領域推薦書目 西湖邊的卡夫卡 編輯于 2023-09-19 13:26 7495 人贊同了該回答 數學具有內在的美學屬性&#xff0c;但并非…

【LLM實戰|langgraph】langgrpah基礎

every blog every motto: You can do more than you think. https://blog.csdn.net/weixin_39190382?typeblog 0. 前言 langgraph 基礎 1. Chatbot實現 # !pip install langchain # !pip install langgraphfrom typing import Annotatedfrom typing_extensions import Typ…

大疆無人機使用eport連接Jetson主板實現目標檢測

所需硬件設備如下&#xff1a; 實現原理&#xff1a; 視頻流獲取&#xff1a;從大疆無人機獲取實時視頻流。數據傳輸&#xff1a;將視頻流傳輸至 Jetson 平臺。目標檢測處理&#xff1a;在 Jetson 上運行目標檢測算法對傳入的視頻幀進行分析 EPort開發套件 大疆官網給出了…

Typora激活與使用

Typora下載 下載地址&#xff1a;Typora 官方中文站 Typora&#xff08;1.9.5及其以前的版本&#xff09; 工具&#xff1a;待補充 流程 1.解壓工具 2.將license-gen.exe、node_inject.exe兩個文件放于typora安裝目錄下 3.在typora安裝目錄下運行cmd&#xff08;可以打開…

圖片拆分工具,自定義宮格切割

軟件介紹 今天推薦一款實用的圖像處理工具——lmage Splitter&#xff0c;支持圖像拆分與格式互轉功能&#xff0c;無廣告干擾&#xff0c;操作簡單流暢&#xff0c;滿足多樣化圖片編輯需求。 軟件優勢 該工具為綠色版設計&#xff0c;無需安裝即可直接運行&#xff0c;下載…

23種設計模式解析--創建型模式

創建型模式&#xff08;造物主的智慧&#xff09; 單例模式 模式定義 單例模式&#xff08;Singleton&#xff09;確保一個類僅有一個實例&#xff0c;并提供該實例的全局訪問點。核心思想是通過私有化構造函數和靜態成員實現受控的對象創建。核心實現要點 私有構造函數&#x…

全面解析軟件工程形式化說明技術

一、形式化說明技術概述&#xff1a;從模糊到精確的跨越 在軟件工程的發展歷程中&#xff0c;需求說明技術始終是確保軟件系統成功開發的關鍵環節。從早期依賴自然語言的非形式化描述&#xff0c;到如今基于數學和邏輯的形式化方法&#xff0c;這一領域經歷了從模糊到精確的深…

百度網盤自動啟動如何關閉,關閉智能看圖

#某度軟件引起的奔潰#在日常辦公中&#xff0c;有時候雙擊圖片&#xff0c;會自動打開了某度的網盤&#xff0c;很奇怪莫名其妙的為什么會關閉網盤后又自動打開了。如何發現是某度的牛虻軟件在搞鬼的&#xff1f;我右鍵圖片&#xff0c;選擇打開方式&#xff0c;發現有“智能看…

疏老師-python訓練營-Day40訓練和測試的規范寫法

浙大疏錦行 知識點回顧&#xff1a; 彩色和灰度圖片測試和訓練的規范寫法&#xff1a;封裝在函數中展平操作&#xff1a;除第一個維度batchsize外全部展平dropout操作&#xff1a;訓練階段隨機丟棄神經元&#xff0c;測試階段eval模式關閉dropout 作業&#xff1a;仔細學習下測…

【重磅發布】flutter_chen_keyboard -專注于鍵盤相關功能

flutter_chen_keyboard 一個功能強大且易于使用的 Flutter 鍵盤增強庫&#xff0c;專為提升移動應用的鍵盤交互體驗而設計。 &#x1f4d6; 庫簡介 flutter_chen_keyboard 是一個專注于鍵盤相關功能的 Flutter 工具庫&#xff0c;旨在為開發者提供更流暢、更智能的鍵盤交互解決…

idea設置注釋--帶日期和作者和描述

最終效果 在File Header中添加如下內容&#xff1a; /*** author ${USER}* date ${DATE} ${TIME}* description ${DESCRIPTION}*/${USER}&#xff1a;IDEA 里設置的用戶名 ${DATE}&#xff1a;當前日期 ${TIME}&#xff1a;當前時間 可以加自定義變量&#xff0c;比如 ${DESCRI…