目錄
第三方服務-通用思路
SDK
準備工作
阿里云OSS-入門程序
.putObject
如何拿到文件對應的字節數組?
.readAllBytes()
集成阿里云OSS完成文件上傳
引入阿里云OSS文件上傳的工具類
上傳文件接口開發
.getOriginalFilename()
程序優化
參數配置化
@Value
@ConfigurationProperties
阿里云對象存儲OSS(Object Storage Service),是一款海量、安全、低成本、高可靠的云存儲服務。使用OSS,您可以通過網絡隨時存儲和調用包括文本、圖片、音頻和視頻等在內的各種文件。
我們在前端進行文件上傳時,依然正常請求我們的服務器端,我們會將上傳上來的文件交給阿里云OSS來進行存儲和管理,阿里云OSS會為每個文件分配一個訪問的路徑,我們通過這個路徑就可以直接訪問阿里云OSS的這個文件
第三方服務-通用思路
第一步操作就是需要去做一些準備工作,我們要使用第三方的云服務,我們就需要去注冊對應的賬號,注冊完賬號還需要進行實名認證,實名認證完了我們就可以登錄到對應的后臺系統了,那登錄進去后哦我們還要根據需要進行充值,這些都是一些準備工作
第二步我們就要開始編寫入門程序了,我們只要參照官方的SDK去編寫入門程序就可以了
SDK
Software Development Kit的簡寫,就是軟件開發工具包,這個SDK就包括我們進行軟件開發時所需要的依賴,以及代碼的事例,這些都可以叫做SDK,那我們就可以參照SDK提供的代碼示例來編寫入門程序
第三步操作就是將其集成到我們的項目中,在項目中集成使用
準備工作
我們要使用阿里云就得注冊阿里云的賬號,注冊完賬號還需要進行實名認證,實名認證之后我們就可以登錄到阿里云的后臺了,登錄到后臺之后我們可以根據自己的需要去充值,只要大家存儲的文件不多,幾十M,其實你充不充值都可以,那如果說你存儲的文件比較多,我要存儲個幾百M,那你充值個一塊錢就足夠使用了,緊接著第三步我們就要開通對應的云服務了,我們所要使用的服務是對象存儲服務OSS,所以我們這里需要開通對象存儲服務,接下來第四步我們需要去創建對象存儲服務的存儲空間,叫bucket,這個存儲空間是存儲對象的容器,再次強調對象存儲服務所指的對象其實就是這個文件,而我們將來存儲的文件都是要隸屬于這個Bucket,第五步就是獲取并配置這個AccessKey秘鑰,這個秘鑰就是我們阿里云身份的憑證,最終我們在代碼中如果你想去使用這個云服務,那你就必須要去配置對應的AccessKey
阿里云OSS-入門程序
在Maven項目中加入依賴項,此時我們需要引入依賴
如果使用的是Java 9及以上的版本,則需要添加以下JAXB相關依賴。
我們來演示一下如何進行文件上傳
我們點擊復制代碼,將所有代碼復制過來然后做一個改造就可以了
在Demo中定義了這樣一個main方法,在main方法中,它來完成文件上傳的入門程序
endpoint代表的是我們所使用的阿里云OSS所對應的bucket,它的域名是什么,我們要到剛剛后臺創建的buket去看一下我們的域名是什么,
在概覽下面有一個訪問端口的Endpoint(地域節點),我們知己復制這個地址直接將域名給它替換掉
注意:前面的協議不要替換,只替換后面的域名,都是htps協議
接下來是bucket的名字,替換成自己的bucket名字
objectName代表的是我們在對象存儲服務中存儲的對象的名字,其實就是文件的名字,將來你將文件傳到這個存儲空間中,那這個文件名叫什么呢?這一塊需要指定一下,那將來我們需要上傳的是一張圖片,那我們就可以指定為001.jpg
region代表的是地域,我們選擇的地域是北京,默認是cn-hangzhou,那我們這里改成cn-beijing就可以了
.putObject
進行文件上傳的方法
當然在這個Demo中,它上傳的是一個Hello OSS的字符串,但是我們這里不需要上傳字符串,我要上傳的是一個文件
如何拿到文件對應的字節數組?
File file = new File("");
byte[] bytes = Files.readAllBytes(file.toPath());
“”里面存放文件
.readAllBytes()
用于從文件系統中讀取文件的所有字節
第二步讀取這個文件,將這個文件讀取成了一個字節數組
這樣我們就完成了文件上傳的代碼改造
點擊運行,返回阿里云OSS即可發現有了文件
點擊001.jpg,有文件的訪問路徑,阿里云OSS會為每個文件分配一個訪問路徑,我們通過這個路徑就可以訪問這張圖片了
那如果有了這個路徑,將來前端想要呈現這個圖片,直接拿到這個路徑,就可以通過image將這個圖片渲染展示出來了
文件上傳需要請求服務器端的程序,那就去請求我們文件上傳的Controller,在Controller中需要接收上傳上來的文件,接收上來之后我們需要將文件存儲起來,我們需要將這個文件存到阿里云OSS中去,而阿里云OSS中我們是可以創建多個存儲空間的,也就是多個bucket,所以我們在這一塊需要指定我們這個文件要存儲到哪個bucket中,當阿里云OSS將這些文件存儲起來之后,它會為每個文件分配一個訪問路徑,所以此時我們需要將這個返回路徑再返回給Controller,Controller最終要將圖片的訪問路徑,也就是訪問的URL,返回給前端,那前端拿到這個URL就可以基于這個URL來訪問阿里云OSS里的這張圖片了,最終在前端頁面就會將這張圖片展示出來
集成阿里云OSS完成文件上傳
引入阿里云OSS文件上傳的工具類
這個工具類實際上是由官方的實例代碼改造而來的,在項目中,我們直接調用這個工具類就可以完成文件上傳了
上傳文件接口開發
我們需要定義一個uploadController,在uploadController中開發這個文件上傳的接口
.getOriginalFilename()
拿到文件的原始名稱
在APIfox中,文件上傳選擇Body——from-data——file
程序優化
在剛才我們制作的AliyunOSS操作的工具類中,我們直接將 endpoint、bucketName參數直接在java文件中寫死了
而如果開發一個大型項目,所有用到的技術涉及到的這些個參數全部寫死在java代碼中,是非常不便于維護和管理的
我們通常將這些容易變動的參數信息定義在一份文件中,在SpringBoot中我們通常會將其定義在application,yml這份配置文件中,也就說將這些參數配置到這份配置文件中,然后在Java代碼中如果要用到這些參數呢,我直接去讀取配置文件當中的這塊參數信息就可以了
參數配置化
指將依稀需要靈活變化的參數,配置在配置文件中,然后通過@Value注解來注入外部配置的屬性
我們要想用到這些參數怎么辦呢
@Value
在SpringBoot中有一個@Value注解,我們直接通過@Value注解來注入外部配置的這些屬性
我直接聲明一個成員變量,然后在成員變量上加上一個注解,叫@Value,然后通過@Value來注入對應的配置項就可以了,大括號里面要寫的就是yml配置文件中的key,你要將每一個配置項的值注入這個屬性成員變量,最終在程序運行時這幾個成員變量就有值了,那以后我如果想更改這個參數,我就不用再去動這個java代碼了,我只需要動這個yml配置文件就可以了
但是使用@Value注解注入配置文件的配置項,如果配置項多,注入繁瑣,需要一項一項注入,此時不便于維護管理 和 復用
大家想其他類中,我也需要用到這些個配置項怎么辦?你是不是需要通過@Value再挨個在注入一次? 所以不便于代碼的復用
那如果說我們需要注入的配置項比較多,在Spring中其實又提供了另外一種注解來簡化這塊的配置
@ConfigurationProperties
通過@ConfigurationProperties,我們就可以實現批量注入,我們可以一次性將多個配置項的值直接封裝到一個實體類AliyunOSSProperties中,那以后如果你想獲取到這些個配置項,你直接獲取這些實體類中的屬性就可以了
如果說我們想將配置項直接封裝到一個實體類中,實體類中的屬性名,需要與配置項中的這個key保持一致,那有endpoint這個key,就需要有endpoint這個屬性,配置項對應的值要封裝到實體類對應的屬性中去,而要想完成封裝,就要為這些實體類提供get,set方法,然后還要將這個實體類交給IOC容器管理,所以在實體類上還加了一個注解叫@Component,
配置文件憑什么能將阿里云OSS里面這個key下面的endpoint這個子key賦值給這個成員變量呢?
所以此時我們還要在實體類上再加上一個注解叫@ConfigurationProperties,而在@ConfigurationProperties這個注解中有個屬性叫prefix,這個屬性代表的是前綴的意思,那就表示這個實體類要封裝的是配置文件中哪一個前綴下面的配置信息,那我這里要封裝的是aliyun.oss這個前綴下的信息,這樣程序運行的時候,他就可以將配置文件中這多個配置項的值直接封裝到這個實體類中
其實這個實體類也就是一個Bean對象,那在其他Bean對象中,我們要想獲取這個屬性的值,我們直接去注入這個Bean對象,然后去調用這個Bean對象的get,set方法就可以獲取到對應的屬性,在其他對象我也想獲取到這個屬性的值,我直接再次注入這個Bean對象就可以了,這樣你可以發現,我一次操作以后在想使用,我直接注入這個Bean就可以獲取到配置項的值了,便于我們程序的復用
注入外部配置文件中的配置項的兩種方式?
- @Value:一個屬性一個屬性的注入
- @ConfigurationProperties:批量將多個屬性注入到Bean對象中