后端之路——阿里云OSS云存儲

一、何為阿里云OSS

全名叫“阿里云對象存儲OSS”,就是云存儲,前端發文件到服務器,服務器不用再存到本地磁盤,可以直接傳給“阿里云OSS”,存在網上。

二、怎么用

大體邏輯:

細分的話就是:

1、準備工作:OSS開通

這一部分黑馬程序員寫的很詳細,我就直接cv他的教程了

(1)打開《阿里云-計算,為了無法計算的價值》阿里云官網,申請阿里云賬號并完成實名認證。

(2)開通OSS

? ? ? ? ?登錄阿里云官網。 點擊右上角的控制臺。
?
? 將鼠標移至產品,然后在輸入框搜索 【對象存儲 OSS】 ,找到并單擊【對象存儲 OSS】 ,打開 OSS 產品詳情頁面。
OSS 產品詳情頁中的單擊立即開通。

(3)創建Bucket存儲空間

開通服務后,在OSS產品詳情頁面單擊管理控制臺直接進入OSS管理控制臺界面。
您也可以單擊位于官網首頁右上方菜單欄的控制臺,進入阿里云管理控制臺首頁,然后單
擊左側的對象存儲 OSS菜單進入 阿里云登錄 - 歡迎登錄阿里云,安全穩定的云計算服務平臺
新建 Bucket ,命名為 hmleadnews ,讀寫權限為 公共讀 3. OSS 快速入門

(4)獲取Bucket信息以及【Access密鑰】

要獲取這幾個很重要的信息: Bucket名稱Endpoint(地域節點)、【 AccessKeyId】、【 AccessKeySecret
然后在側邊欄的【Bucket列表】可以看到你創建的Bucket
就能看到我們要的第一個東西【 Bucket名稱
點擊你這個【Bucket】倉庫,然后再點擊【概覽】
然后往下翻可以看到我們要的第二個東西:【 Endpoint(地域節點)
然后最后到右上角點擊個人頭像,選中【AccessKey管理】
就可以獲得我們最后要的兩個東西:【 AccessKeyId】、【 AccessKeySecret
拿到之后【保存起來】,不然的話就看不到了,下次再要,這個accessKey就作廢了,然后重新手機號驗證,獲取一個新的【 AccessKeyId】和【 AccessKeySecret

2、在test配置一個上傳樣例代碼試一下

那么接下來就可以在代碼里測試一下能不能用了

首先我們還要在【pom.xml】文件里在配置好【阿里云OSS的依賴】

<!-- 阿里云OSS的依賴 -->
<dependency><groupId>com.aliyun.oss</groupId><artifactId>aliyun-sdk-oss</artifactId><version>3.15.1</version>
</dependency>

如果你是java9以下的版本就不用做下一步操作,如果是java9以上的,在下面再配置這個依賴

<!-- java9以上的版本還需要配置這個阿里云配置 -->
<dependency><groupId>javax.xml.bind</groupId><artifactId>jaxb-api</artifactId><version>2.3.1</version>
</dependency>
<dependency><groupId>javax.activation</groupId><artifactId>activation</artifactId><version>1.1.1</version>
</dependency>
<!-- no more than 2.3.3-->
<dependency><groupId>org.glassfish.jaxb</groupId><artifactId>jaxb-runtime</artifactId><version>2.3.3</version>
</dependency>

然后開始在【test】目錄下的【java】的【測試類】文件夾里加一個Demo類

然后把這段代碼直接復制過去:

(因為黑馬程序員里的教程是N年前的,阿里云OSS更新了代碼配置,所以直接用我下面這個別用黑馬程序員的資料代碼,我這是官方最新的)

package com.czm.tliaswebmanagement;import com.aliyun.oss.ClientException;
import com.aliyun.oss.OSS;
import com.aliyun.oss.common.auth.*;
import com.aliyun.oss.OSSClientBuilder;
import com.aliyun.oss.OSSException;
import com.aliyun.oss.model.PutObjectRequest;
import com.aliyun.oss.model.PutObjectResult;
import java.io.File;public class Demo {public static void main(String[] args) throws Exception {/*** 基礎配置:連接服務并驗證個人身份*/// Endpoint以華東1(杭州)為例,其它Region請按實際情況填寫。String endpoint = "https://oss-cn-hangzhou.aliyuncs.com";// 從環境變量中獲取訪問憑證。運行本代碼示例之前,請確保已設置環境變量OSS_ACCESS_KEY_ID和OSS_ACCESS_KEY_SECRET。EnvironmentVariableCredentialsProvider credentialsProvider = CredentialsProviderFactory.newEnvironmentVariableCredentialsProvider();// 填寫Bucket名稱,例如examplebucket。String bucketName = "czm-goeasy-im";/*** 配置具體文件上傳信息*/// 填寫Object完整路徑,完整路徑中不能包含Bucket名稱,例如exampledir/exampleobject.txt。String objectName = "1.png";// 填寫本地文件的完整路徑,例如D:\\localpath\\examplefile.txt。// 如果未指定本地路徑,則默認從示例程序所屬項目對應本地路徑中上傳文件。String filePath= "C:\\Users\\岑梓銘\\Desktop\\c182dd874f2e4c4baaf1806d54bf9cfc.png";// 創建OSSClient實例。OSS ossClient = new OSSClientBuilder().build(endpoint, credentialsProvider);try {// 創建PutObjectRequest對象。PutObjectRequest putObjectRequest = new PutObjectRequest(bucketName, objectName, new File(filePath));// 如果需要上傳時設置存儲類型和訪問權限,請參考以下示例代碼。// ObjectMetadata metadata = new ObjectMetadata();// metadata.setHeader(OSSHeaders.OSS_STORAGE_CLASS, StorageClass.Standard.toString());// metadata.setObjectAcl(CannedAccessControlList.Private);// putObjectRequest.setMetadata(metadata);// 上傳文件。PutObjectResult result = ossClient.putObject(putObjectRequest);           } catch (OSSException oe) {System.out.println("Caught an OSSException, which means your request made it to OSS, "+ "but was rejected with an error response for some reason.");System.out.println("Error Message:" + oe.getErrorMessage());System.out.println("Error Code:" + oe.getErrorCode());System.out.println("Request ID:" + oe.getRequestId());System.out.println("Host ID:" + oe.getHostId());} catch (ClientException ce) {System.out.println("Caught an ClientException, which means the client encountered "+ "a serious internal problem while trying to communicate with OSS, "+ "such as not being able to access the network.");System.out.println("Error Message:" + ce.getMessage());} finally {if (ossClient != null) {ossClient.shutdown();}}}
}

然后別急著運行,我簡單講解一下你們要改的地方

(1)配【EndPoint節點】

首先在最上面的三句代碼里,第一句是【配置你與OSS的Bucket倉庫連接的網址】,專業點就是【EndPoint節點】

(2)配【AccessKeyId】和【AccessKeySecret

因為黑馬程序員里的教程是N年前的,阿里云更新了OSS的配置,所以阿里云OSS新的代碼里沒有直接配【AccessKeyId】和【AccessKeySecret】的代碼,取而代之的是用戶直接在【系統變量】和【環境變量】里配置好【AccessKeyId】和【AccessKeySecret

.

在【環境變量加上兩個變量(變量名不能自定義,只能是這兩):

【OSS_ACCESS_KEY_ID】:【變量值】就是我們剛剛阿里云看的【AccessKeyId

【OSS_ACCESS_KEY_SECRET】:【變量值】就是我們剛剛阿里云看的【AccessKeySecret

再在【系統變量加上剛剛那兩個變量(變量名不能自定義,只能是這兩):

【OSS_ACCESS_KEY_ID】、【OSS_ACCESS_KEY_SECRET】

最后在【系統變量】的Path】里用“%變量%”的形式,把那兩個變量加進去

(3)配【Bucket名】

(4)配置【文件在本地的絕對路徑】、文件上傳之后在【阿里云OSS的Bucket庫叫啥名字】

這個是文件上傳之后在【阿里云OSS的Bucket庫叫啥名字】
這個是【文件在本地的絕對路徑】
寫完這些之后,因為我們剛剛配置了【系統變量】,所以我建議先【重啟電腦】,然后再啟動spring boot工程,哦這里還有一點:test的測試類可以不用運行整個spring boot工程,只允許這一個類就行
然后就能看到你上傳的文件了,這個網址就是提供給前端訪問圖片的url

3、正式前后端利用阿里云OSS聯調一下文件上傳

文件上傳這玩意因為其實沒什么技術含量,而且代碼又臭又長的,那么這里我們直接創建一個【工具類】,復制我的代碼,然后要上傳文件的地方就調用這個【工具類】幫我們上傳即可

(1)首先在controller、service這些包的同級目錄,創建一個【utils】包,創建一個【AliOSSUtils類】

(2)然后在這個類里直接復制粘貼下面的代碼

package com.czm.tliaswebmanagement.utils;import com.aliyun.oss.OSS;
import com.aliyun.oss.OSSClientBuilder;
import org.springframework.stereotype.Component;
import org.springframework.web.multipart.MultipartFile;
import java.io.*;
import java.util.UUID;/*** 阿里云 OSS 工具類* 因為不屬于controller層,也不屬于service層,所以用component注解來存放到IOC容器里*/
@Component
public class AliOSSUtils {private String endpoint = "你自己的Bucket的EndPoint節點";private String accessKeyId = "你自己的accessKeyId";private String accessKeySecret = "你自己的accessKeySecret";private String bucketName = "你自己的Bucket名字";/*** 實現上傳圖片到OSS*/public String upload(MultipartFile file) throws IOException {// 獲取上傳的文件的輸入流InputStream inputStream = file.getInputStream();// 避免文件覆蓋String originalFilename = file.getOriginalFilename();String fileName = UUID.randomUUID().toString() + originalFilename.substring(originalFilename.lastIndexOf("."));//上傳文件到 OSSOSS ossClient = new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret);ossClient.putObject(bucketName, fileName, inputStream);//文件訪問路徑String url = endpoint.split("//")[0] + "//" + bucketName + "." + endpoint.split("//")[1] + "/" + fileName;// 關閉ossClientossClient.shutdown();return url;// 把上傳到oss的路徑返回}}

注意,這里寫你們自己的配置,就跟上一個在test里的示例一樣配置,只不過這里多了要讓你自己配置【AccessKeyId】和【AccessKeySecret】這兩項而已

然后簡單講一下這些代碼都是干啥:

不用了解那么深,反正也不會記,以后都是直接用就行了

有一點,記得用【@Component】給它放到IOC容器,以方便別的地方直接用

(3)接下來創建一個上傳文件的controller接口,調用AliOSSUtil工具類就行了

太簡單了就不解釋了,注釋都有,只需要

1、在請求方法用MultipartFile接收文件參數? ?

2、調用AliOSSUtiles工具類上傳文件、并返回上傳完后的圖片地址? ?

3、把地址返回給前端

package com.czm.tliaswebmanagement.controller;import com.czm.tliaswebmanagement.pojo.Result;
import com.czm.tliaswebmanagement.utils.AliOSSUtils;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.multipart.MultipartFile;import java.io.File;
import java.io.IOException;
import java.util.UUID;@Slf4j
@RestController
public class UpLoadController {//注入依賴:AliOSSUtiles工具類@Autowiredprivate AliOSSUtils aliOSSUtils;@PostMapping("/upload")public Result uplaod(MultipartFile image) throws IOException {log.info("上傳過來的參數:{}", image.getOriginalFilename());//調用阿里云OSS工具類【AliOSSUtiles】進行文件上傳String url = aliOSSUtils.upload(image);log.info("文件上傳完成,url是:{}", url);return Result.success(url);}
}

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

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

相關文章

Rust: Fury高性能序列化庫嘗試

在序列化庫中&#xff0c;傳統的有Json,XML&#xff0c;性能好的有thrift&#xff0c;protobuf等。據說Fury官網的介紹&#xff0c;Fury性能要遠遠好于protobuf&#xff0c;且不象protobuf還需要定義IDL&#xff0c;非常輕便&#xff0c;隨取隨用。 今天來嘗試一下。 一、carg…

gitlab每日備份以及restore

gitlab服務有非常簡潔的每日備份命令&#xff0c; 從production的gitlab的每日備份中restore到backup環境也非常方便。 一、Production gitlab每日備份 1. Production gitlab環境上編寫腳本 cat /root/gitlab_bak.shgitlab-rake gitlab:backup:create > /var/opt/gitl…

JavaSE (Java基礎):面向對象(下)

8.7 多態 什么是多態&#xff1f; 即同一方法可以根據發送對象的不同而采用多種不同的方式。 一個對象的實際類型是確定的&#xff0c;但可以指向對象的引用的類型有很多。在句話我是這樣理解的&#xff1a; 在實例中使用方法都是根據他最開始將類實例化最左邊的類型來定的&…

消息中間件ApacheKafka在windows簡單安裝

一.背景 之前公司需要API網關管理軟件ApacheShenYu&#xff0c;我相信把調用的記錄都存到一個數據庫。他支持日志推送到kafka&#xff0c;所以&#xff0c;我準備嘗試一下通過kafka接收調用的日志信息。第一步&#xff0c;當然是安裝kafka了。 二.ApacheKafka的下載 打開下載…

【C++】 解決 C++ 語言報錯:Memory Leak

文章目錄 引言 內存泄漏&#xff08;Memory Leak&#xff09;是 C 編程中常見且嚴重的內存管理問題之一。當程序分配了內存而沒有正確釋放&#xff0c;導致內存無法被重新利用時&#xff0c;就會發生內存泄漏。這種錯誤會導致程序占用越來越多的內存&#xff0c;最終可能導致系…

關于人情世故的小討論

大家好&#xff0c;我是阿趙。 ??最近國內籃球界內出了不少事情&#xff0c;讓人對籃球這項運動產生了很多疑問。 ??去年的CUBA&#xff0c;擁有全國最好生源的清華大學居然輸給了連985 、211都不是的廣東工業大學。作為廣工的畢業生&#xff0c;我知道廣工的籃球一直都很強…

Unity PC和Android端的數據存儲和讀取

使用Resource&#xff1a; 提示&#xff1a;使用resouce打包后會被壓縮進.resources文件中&#xff0c;意味著它是只讀文件&#xff0c;且必須使用resouce.load加載&#xff1a; /// <summary>/// 全平臺使用/// </summary>/// <typeparam name"T"&g…

論文學習——動態多目標優化的一種新的分位數引導的對偶預測策略

論文題目&#xff1a;A novel quantile-guided dual prediction strategies for dynamic multi-objective optimization 動態多目標優化的一種新的分位數引導的對偶預測策略&#xff08;Hao Sun a,b, Anran Cao a,b, Ziyu Hu a,b, Xiaxia Li a,b, Zhiwei Zhao c&#xff09;In…

“免費”的可視化大屏案例分享-智慧園區綜合管理平臺

一.智慧園區是什么&#xff1f; 智慧園區是一種融合了新一代信息與通信技術的先進園區發展理念。它通過迅捷信息采集、高速信息傳輸、高度集中計算、智能事務處理和無所不在的服務提供能力&#xff0c;實現了園區內及時、互動、整合的信息感知、傳遞和處理。這樣的園區旨在提高…

自定義注解-手機號驗證注解

注解 package com.XX.assess.annotation;import com.XX.assess.util.MobileValidator;import javax.validation.Constraint; import javax.validation.Payload; import java.lang.annotation.*;/*** 手機號校驗注解* @author super*/ @Retention(RetentionPolicy.RUNTIME) @Ta…

正確使用Pytorch Geometric打開Cora(Planetoid)數據集

文章目錄 關于報錯&#xff08;"Cannot connect to host"&#xff09;解決方法 關于報錯&#xff08;“Cannot connect to host”&#xff09; 我們在使用PyG調用Planetoid數據集的時候&#xff0c;常會碰到如下報錯&#xff1a; 解決方法就是手動下載這個數據集。…

在 AWS Lambda 中使用 Flask 應用

本文將介紹如何在 AWS Lambda 中創建和部署一個使用 Flask 框架的應用。 1. 創建 Lambda 函數 首先,在 AWS Lambda 控制臺創建一個新的函數,命名為 ??flask-app??。 2. 準備 Flask 層 為了在 Lambda 中使用 Flask,我們需要創建一個包含 Flask 庫的層。按照以下步驟操…

java中如何使用ffmpeg命令來實現視頻編碼轉換

在Java中使用FFmpeg命令來進行視頻編碼轉換&#xff0c;可以通過調用系統命令來執行FFmpeg命令。下面是一個使用FFmpeg進行視頻轉碼的示例代碼&#xff1a; import java.io.BufferedReader; import java.io.InputStreamReader;public class FFmpegVideoConverter {public stat…

前端播放RTSP視頻流,使用FLV請求RTSP視頻流播放(Vue項目,在Vue中使用插件flv.js請求RTSP視頻流播放)

簡述&#xff1a;在瀏覽器中請求 RTSP 視頻流并進行播放時&#xff0c;直接使用原生的瀏覽器 API 是行不通的&#xff0c;因為它們不支持 RTSP 協議。為了解決這個問題&#xff0c;開發者通常會選擇使用像 flv.js 這樣的庫&#xff0c;它專為在瀏覽器中播放 FLV 和其他流媒體格…

MySQL 代理層:ProxySQL

文章目錄 說明安裝部署1.1 yum 安裝1.2 啟停管理1.3 查詢版本1.4 Admin 管理接口 入門體驗功能介紹3.1 多層次配置系統 讀寫分離將實例接入到代理服務定義主機組之間的復制關系配置路由規則事務讀的配置延遲閾值和請求轉發 ProxySQL 核心表mysql_usersmysql_serversmysql_repli…

Java實現日志全鏈路追蹤.精確到一次請求的全部流程

廣大程序員在排除線上問題時,會經常遇見各種BUG.處理這些BUG的時候日志就格外的重要.只有完善的日志才能快速有效的定位問題.為了提高BUG處理效率.我決定在日志上面優化.實現每次請求有統一的id.通過id能獲取當前接口的全鏈路流程走向. 實現效果如下: 一次查詢即可找到所有關…

自定義一個背景圖片的高度,隨著容器高度的變化而變化,小于圖片的高度時裁剪,大于時拉伸100%展示

1、通過js創建<image?>標簽來獲取背景圖片的寬高比&#xff1b; 2、當元素的高度大于原有比例計算出來的高度時&#xff0c;背景圖片的高度拉伸自適應100%&#xff0c;否則高度為auto&#xff0c;會自動被裁減 3、背景圖片容器高度變化時&#xff0c;自動計算背景圖片的…

Android network - NUD檢測機制(Android 14)

Android network - NUD檢測機制 1. 前言2. 源碼分析2.1 ClientModeImpl2.2 IpClient2.3 IpReachabilityMonitor 1. 前言 在Android系統中&#xff0c;NUD&#xff08;Neighbor Unreachable Detection&#xff09;指的是網絡中的鄰居不可達檢測機制&#xff0c;它用于檢測設備是…

數據驅動測試實踐:Postman 中使用數據文件的指南

Postman 是一個強大的 API 開發和測試工具&#xff0c;它支持數據驅動測試&#xff0c;允許測試者使用外部數據文件來驅動測試&#xff0c;實現測試用例的參數化。數據驅動測試可以顯著提高測試效率&#xff0c;減少重復工作&#xff0c;并允許測試用例覆蓋更廣泛的輸入場景。本…

一文了解常見DNS問題

當企業的DNS出現故障時&#xff0c;為不影響企業的正常運行&#xff0c;團隊需要能夠快速確定問題的性質和范圍。那么有哪些常見的DNS問題呢&#xff1f; 域名解析失敗&#xff1a; 當您輸入一個域名&#xff0c;但無法獲取到與之對應的IP地址&#xff0c;導致無法訪問相應的網…