阿里云OSS
為了解決海量數(shù)據(jù)存儲與彈性擴(kuò)容,我們一般采用云存儲
的解決方案-阿里云OSS梧乘。
一绊序、測試Bucket
Bucket可以理解為電腦上的磁盤
引入相關(guān)依賴
<dependency>
<groupId>com.aliyun.oss</groupId>
<artifactId>aliyun-sdk-oss</artifactId>
<version>3.1.0</version>
</dependency>
測試創(chuàng)建Bucket的連接茴迁。其中:
- endpoint :創(chuàng)建Bucket后概覽頁面獲取
- accessKeyId :可由右上角個人信息中AccessKey管理獲取
- accessKeySecret :可由右上角個人信息中AccessKey管理獲取
- bucketName :創(chuàng)建Bucket時的名稱
public class TestOSS {
// yourEndpoint填寫B(tài)ucket所在地域?qū)?yīng)的Endpoint孔飒。以華東1(杭州)為例灌闺,Endpoint填寫為https://oss-cn-hangzhou.aliyuncs.com。
String endpoint = "your-endpoint";
// 阿里云賬號AccessKey擁有所有API的訪問權(quán)限坏瞄,風(fēng)險很高桂对。強(qiáng)烈建議您創(chuàng)建并使用RAM用戶進(jìn)行API訪問或日常運(yùn)維,請登錄RAM控制臺創(chuàng)建RAM用戶鸠匀。
String accessKeyId = "your-accessKeyId ";
String accessKeySecret = "your-accessKeySecret ";
// 填寫B(tài)ucket名稱蕉斜,例如examplebucket。
String bucketName = "your-bucketName ";
@Test
public void testCreateBucket() {
// 創(chuàng)建OSSClient實(shí)例
OSSClient ossClient = new OSSClient(endpoint, accessKeyId, accessKeySecret);
// 創(chuàng)建存儲空間
ossClient.createBucket(bucketName);
// 關(guān)閉ossClient
ossClient.shutdown();
}
}
判斷存儲空間是否存在
@Test
public void testExist() {
// 創(chuàng)建OSSClient實(shí)例
OSSClient ossClient = new OSSClient(endpoint, accessKeyId, accessKeySecret);
boolean exist = ossClient.doesBucketExist(bucketName);
System.out.println(exist);
// 關(guān)閉ossClient
ossClient.shutdown();
}
二、文件上傳
配置application.properties
#服務(wù)端口
server.port=8080
# 應(yīng)用名稱
spring.application.name=OssDemo01
#阿里云 OSS
#不同的服務(wù)器宅此,地址不同
aliyun.oss.file.endpoint=your Endpoint
aliyun.oss.file.keyid=your AccessKeyID
aliyun.oss.file.keysecret=your AccessKeySecret
#bucket可以在控制臺創(chuàng)建机错,也可以使用java代碼創(chuàng)建
aliyun.oss.file.bucketname=your BucketName
從配置文件讀取常量
創(chuàng)建常量讀取工具類:ConstantPropertiesUtil.java
使用@Value讀取 application.properties 里的配置內(nèi)容
用 Spring 的 InitializingBean 的 afterPropertiesSet 來初始化配置信息,這個方法將在所有的屬性被初始化后調(diào)用父腕。
/**
* 常量類毡熏,讀取配置文件application.properties中的配置
*/
@Component
//@PropertySource("classpath:application.properties")
public class ConstantPropertiesUtil implements InitializingBean {
@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.filehost}")
private String fileHost;
@Value("${aliyun.oss.file.bucketname}")
private String bucketName;
public static String END_POINT;
public static String ACCESS_KEY_ID;
public static String ACCESS_KEY_SECRET;
public static String BUCKET_NAME;
public static String FILE_HOST ;
@Override
public void afterPropertiesSet() throws Exception {
END_POINT = endpoint;
ACCESS_KEY_ID = keyId;
ACCESS_KEY_SECRET = keySecret;
BUCKET_NAME = bucketName;
FILE_HOST = fileHost;
}
}
創(chuàng)建service接口
public interface IFileService {
/**
* 文件上傳至阿里云
* @param file
* @return
*/
String upload(MultipartFile file);
}
實(shí)現(xiàn)接口
@Service
public class FileService Impl implements IFileService {
@Override
public String upload(MultipartFile file) {
//工具類獲取值
String endpoint = ConstantPropertiesUtil.END_POIND;
String accessKeyId = ConstantPropertiesUtil.ACCESS_KEY_ID;
String accessKeySecret = ConstantPropertiesUtil.ACCESS_KEY_SECRET;
String bucketName = ConstantPropertiesUtil.BUCKET_NAME;
try {
// 創(chuàng)建OSSClient實(shí)例。
OSS ossClient = new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret);
// 上傳文件流
InputStream inputStream = file.getInputStream();
//獲取文件名稱
String fileName = file.getOriginalFilename();
//存在問題:多次上傳相同文件的名稱侣诵,造成最后一次上傳把之前上傳文件覆蓋
//解決:方式1.在文件名稱里面添加隨機(jī)唯一的值
String uuid = UUID.randomUUID().toString().replace("-", "");
fileName = uuid + fileName;
//方式2 把文件按照日期進(jìn)行分類
String datePath = new DateTime().toString("yyyy/MM/dd");
fileName = datePath +"/" + fileName;
//調(diào)用oss方法實(shí)現(xiàn)上傳
//第一個參數(shù):Bucket名稱
//第二個參數(shù):上傳到oss文件路徑和文件名稱
//第三個參數(shù):上傳文件輸入流
ossClient.putObject(bucketName,fileName,inputStream);
// 關(guān)閉OSSClient。
ossClient.shutdown();
//把上傳之后的文件路徑返回
String url = "https://" + bucketName + "."+endpoint + "/" + fileName;
return url;
}catch (Exception e){
e.printStackTrace();
return null;
}
}
}
控制層
@RestController
@RequestMapping("/file/upload")
@AllArgsConstructor
public class FileController {
private final IFileService fileService;
@PostMapping
public String upload(MultipartFile file){
//獲取上傳文件 MultipartFile
//返回上傳到oss的路徑
String url = fileService.upload(file);
return url;
}
}