超級(jí)簡(jiǎn)單的阿里云oss使用,把我代碼復(fù)制即可使用
一.需求
項(xiàng)目需要上傳頭像,不想存在本地,之前用過阿里云其他產(chǎn)品,這里就使用一下阿里云的oss了,不得不說阿里云的產(chǎn)品使用步驟真的很清晰.這里說一下我自己的使用步驟.
步驟:
1.沒有阿里云賬號(hào)的先去注冊(cè)和認(rèn)證
選擇對(duì)象存儲(chǔ)oss,進(jìn)行開通

開通不要錢,有一定免費(fèi)額度

2.創(chuàng)建bucket,類似于文件夾
權(quán)限可以設(shè)置為公共讀

3.可視化使用
大家可以自己去文件管理里上傳一個(gè)圖片試試就知道了,每個(gè)存儲(chǔ)文件會(huì)生成一個(gè)對(duì)應(yīng)的url,拿到之后我們可以從阿里云上下載下來這個(gè)圖片.
4.開發(fā)使用
阿里云很多小白指南非常適合我這樣的菜雞,這里有一個(gè)oss開發(fā)者使用指南,大家可以點(diǎn)擊oss學(xué)習(xí)路徑的java sdk看看,所謂sdk類似于一個(gè)說明書
5.參考一下阿里云 oss java sdk
其實(shí)也就是兩步
1.引pom
<!--阿里云oss-->
<dependency>
<groupId>com.aliyun.oss</groupId>
<artifactId>aliyun-sdk-oss</artifactId>
<version>3.8.0</version>
</dependency>
<!--阿里云oss-->
2.復(fù)制黏貼大法

這里寫一下我使用阿里云oss的圖片上傳,大家可作demo參考
由于阿里云一些密鑰配置和地域結(jié)點(diǎn),bucket等是常量級(jí)的,所以我這里抽取出來放在了application.properties中,方便管理 ,數(shù)據(jù)我手動(dòng)加密了....大家換成自己的即可,
這些配置key=value key都是自己隨便寫的(也不是,起碼可以見名思意),只是為了我們配置的一個(gè)配置類可以利用spring的依賴注入填充value而已
#配置阿里云oss的固定值
#阿里云 OSS
#不同的服務(wù)器,地址不同
aliyun.oss.file.endpoint=oss-cn-beijing.aliyuncs.com
aliyun.oss.file.keyid=XXXXXXXXXX
aliyun.oss.file.keysecret=XXXXXXXXXXXX
#bucket可以在控制臺(tái)創(chuàng)建,也可以使用java代碼創(chuàng)建
aliyun.oss.file.bucketname=zyh-XXXXXXXXX
配置類
說明:
- 1.首先加了@Component注解使咱們的這個(gè)文件可以隨著spring容器一起啟動(dòng)
- 2.該util類實(shí)現(xiàn)了InitializingBean ,可以在配置文件加載后調(diào)用afterPropertiesSet方法進(jìn)行一些操作
- 3.我們這里先設(shè)置了一些private對(duì)象進(jìn)行配置文件中值的依賴注入
- 4.我們這里重新定義了一些大寫的常量
- 首先public使外部類(別的類)可以調(diào)用
-static使外部類可以直接通過類名.(點(diǎn))調(diào)用
- 首先public使外部類(別的類)可以調(diào)用
- 在afterPropertiesSet中對(duì)常量進(jìn)行賦值
package com.zyh.future.util;
import org.springframework.beans.factory.InitializingBean;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
//服務(wù)器啟動(dòng)的時(shí)候讀取配置文件的內(nèi)容
@Component
public class ConstantPropertiesUtils implements InitializingBean {
//如果我們直接@value("a")是把a(bǔ)賦值給endpoint
//所以我們需要使用spring提供的一個(gè)方法"${a}"來獲取a對(duì)應(yīng)的值
@Value("${aliyun.oss.file.endpoint}")
private String endpoint;
@Value("${aliyun.oss.file.keyid}")
private String keyid;
@Value("${aliyun.oss.file.keysecret}")
private String keysecret;
@Value("${aliyun.oss.file.bucketname}")
private String bucketname;
//這些值賦值好了但是我們沒用辦法直接使用的。
//我們可以設(shè)置一些staic靜態(tài)變量,這樣就可以直接用類名.來調(diào)用了
public static String ENDPOINT;
public static String KEYID;
public static String KEYSECRET;
public static String BUCKETNAME;
//服務(wù)器啟動(dòng)就會(huì)初始化ConstantYmlUtils并且調(diào)用afterPropertiesSet方法讀取配置文件的內(nèi)容
@Override
public void afterPropertiesSet() throws Exception {
ENDPOINT=endpoint;
KEYID=keyid;
KEYSECRET=keysecret;
BUCKETNAME=bucketname;
}
}
Controller
說明:
我們阿里云oss倉庫的url是一個(gè)咱們的倉庫+固定的地域結(jié)點(diǎn)值+咱們的文件名字,所以這里為了使上傳的文件名字不重復(fù),使用了一個(gè)idworker,不知道的可以看一下Twitter的 Snowflake(雪花算法)
import com.aliyun.oss.OSS;
import com.aliyun.oss.OSSClientBuilder;
import com.zyh.future.entity.Result;
import com.zyh.future.entity.StatusCode;
import com.zyh.future.util.ConstantPropertiesUtils;
import com.zyh.future.util.IdWorker;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;
import java.io.InputStream;
/**
* 功能描述: 上傳文件到阿里云oss
* @Param:
* @Return:
* @Author: Zyh
* @Date: 2020/2/2 23:19
*/
@RestController
@CrossOrigin
@RequestMapping(value = "/fileupload")
public class FileUploadConteoller {
@Autowired
private IdWorker idWorker;
/**
* 功能描述: 上傳用戶頭像
* @Param: [file]
* @Return: com.zyh.future.entity.Result 返回頭像上傳后在阿里云oss上的路徑
* @Author: Zyh
* @Date: 2020/2/3 0:19
*/
@RequestMapping(value = "/file",method = RequestMethod.POST)
public Result fileUpload(@RequestParam("file") MultipartFile file){
/*上傳文件到阿里云oss*/
// 地域結(jié)點(diǎn)Endpoint以北京為例,其它Region請(qǐng)按實(shí)際情況填寫。
String endpoint = ConstantPropertiesUtils.ENDPOINT;
// 云賬號(hào)AccessKey有所有API訪問權(quán)限,建議遵循阿里云安全最佳實(shí)踐,創(chuàng)建并使用RAM子賬號(hào)進(jìn)行API訪問或日常運(yùn)維,
String accessKeyId = ConstantPropertiesUtils.KEYID;
String accessKeySecret = ConstantPropertiesUtils.KEYSECRET;
String bucketName= ConstantPropertiesUtils.BUCKETNAME;
/*上傳文件到阿里云oss*/
//1.使用@RequestParam("file") MultipartFile file可以接收到文件
//使用MultiparatFile 接收文件需要指定一個(gè)參數(shù)名,這個(gè)值應(yīng)該是我們前端指定的input文件標(biāo)簽名
//2.得到上傳文件的名稱獲取上傳輸入流
String filename = file.getOriginalFilename();
System.out.print("所要上傳的文件名稱為:"+filename);
//創(chuàng)建一個(gè)唯一id作為文件名字,并覆蓋之前的文件名字,之前的文件名字這里只顯示到console中
filename = idWorker.nextId()+filename.substring(filename.lastIndexOf("."));
//以我手動(dòng)上傳的文件為例http://zyh-future.oss-cn-beijing.aliyuncs.com/IMG_6407.JPG
//前面都是固定的域https://zyh-future.oss-cn-beijing.aliyuncs.com/
/*自己拼出來在之后阿里云上的文件路徑*/
String path="http://"+bucketName+"."+endpoint+"/"+filename;
try{
InputStream inputStream = file.getInputStream();
/*上傳文件到阿里云oss*/
// 創(chuàng)建OSSClient實(shí)例。
OSS ossClient = new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret);
// 上傳文件流。//參數(shù)分別為倉庫名稱,文件名稱,文件流
ossClient.putObject(bucketName, filename, inputStream);
// 關(guān)閉OSSClient。
ossClient.shutdown();
/*上傳文件到阿里云oss*/
}catch (Exception e)
{
e.printStackTrace();
return new Result(true, StatusCode.ERROR,"上傳失敗");
}
//返回頭像在阿里云oss上的路徑
return new Result(true, StatusCode.OK,"上傳成功", path);
}
}
大家搭建完了可以用postman測(cè)試一下

ps:如果我們想方便管理或者后期擴(kuò)展,我們這里也可以引入一個(gè)工具
<!--日期時(shí)間工具-->
<dependency>
<groupId>joda-time</groupId>
<artifactId>joda-time</artifactId>
<version>2.10.1</version>
</dependency>
我們可以用這個(gè)工具的一個(gè)方法String dirpath=new DateTime().tostring("yyyy/MM/dd");將當(dāng)前的時(shí)間轉(zhuǎn)換為yyyy/MM/dd的格式,比如2020/02/03
這樣我們上傳的文件名字時(shí)候可以以這個(gè)dirpath作為我們的圖片所在的文件夾名稱,以分布式id生成器生成的id為名稱存儲(chǔ).
filename = dicpath+"/"+idWorker.nextId()+filename.substring(filename.lastIndexOf("."));
ossClient.putObject(bucketName, filename, inputStream);
下面看一下效果

