一、何為阿里云OSS
全名叫“阿里云對象存儲OSS”,就是云存儲,前端發文件到服務器,服務器不用再存到本地磁盤,可以直接傳給“阿里云OSS”,存在網上。
二、怎么用
大體邏輯:
細分的話就是:
1、準備工作:OSS開通
這一部分黑馬程序員寫的很詳細,我就直接cv他的教程了
(1)打開《阿里云-計算,為了無法計算的價值》阿里云官網,申請阿里云賬號并完成實名認證。

(2)開通OSS




(3)創建Bucket存儲空間


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





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);}
}