一. 對(duì)象存儲(chǔ)OSS
1. 什么是OSS?
官方的解釋是這樣的:阿里云對(duì)象存儲(chǔ)OSS(Object Storage Service)是一款海量、安全、低成本、高可靠的云存儲(chǔ)服務(wù),提供99.9999999999%(12個(gè)9)的數(shù)據(jù)持久性,99.995%的數(shù)據(jù)可用性。
官網(wǎng):對(duì)象存儲(chǔ)OSS
2. 為什么要使用OSS?
作者認(rèn)為主要是方便項(xiàng)目上線后的文件業(yè)務(wù)的處理,試想一下:大多數(shù)人都不會(huì)把自己電腦直接上當(dāng)本地服務(wù)器上直接上線項(xiàng)目吧,如果用云服務(wù)器訪問量大的話又有點(diǎn)占空間,也無法對(duì)圖片進(jìn)行加密,但我們用到OSS存儲(chǔ)文件就可以解決大部分問題了
二. 開通 OSS
第一步,登錄阿里云官網(wǎng),搜索“OSS”關(guān)鍵字,進(jìn)入 OSS 產(chǎn)品頁。
第二步,購(gòu)買套餐
新人好像有優(yōu)惠活動(dòng),筆者沒看到花錢買的覺得血虧(雖然只有幾塊)
第三步,進(jìn)入 OSS 管理控制臺(tái),點(diǎn)擊Bucket 列表
,點(diǎn)擊創(chuàng)建 Bucket
。
注意:讀寫權(quán)限為“公共讀”,也就是允許互聯(lián)網(wǎng)用戶訪問云空間上的圖片。
第四步:確認(rèn)就行
三、SpringBoot 整合 OSS 實(shí)現(xiàn)文件上傳
1. 在 pom.xml 文件中添加 OSS 的依賴。
<dependency>
<groupId>com.aliyun.oss</groupId>
<artifactId>aliyun-sdk-oss</artifactId>
<version>3.14.0</version>
</dependency>
2. 在 application.yml 文件中添加 OSS 配置項(xiàng)。
aliyun:
oss:
# oss對(duì)外服務(wù)的訪問域名
endpoint: oss-cn-guangzhou.aliyuncs.com
# 訪問身份驗(yàn)證中用到用戶標(biāo)識(shí)(填自己的)
accessKeyId: LTAI5xxxxxxxxxx
# 用戶用于加密簽名字符串和oss用來驗(yàn)證簽名字符串的密鑰(填自己的)
accessKeySecret: xxxxxxxx
# oss的存儲(chǔ)空間
bucketName: baridhu
# 上傳文件大小(M)
maxSize: 3
# 上傳文件夾路徑前綴
dir:
prefix: helloworld/
補(bǔ)充:如何獲取自己的用戶標(biāo)識(shí)和密鑰
1. 把鼠標(biāo)移動(dòng)到自己頭像位置會(huì)出懸浮框,我們選擇AccessKey
管理
2. 創(chuàng)建AccessKey
剩下的按著操作就行了,不再贅敘了
3. 創(chuàng)建配置類OssClientConfig.java
@Configuration
public class OssClientConfig {
@Value("${aliyun.oss.endpoint}")
String endpoint ;
@Value("${aliyun.oss.accessKeyId}")
String accessKeyId ;
@Value("${aliyun.oss.accessKeySecret}")
String accessKeySecret;
@Bean
public OSSClient createOssClient() {
return (OSSClient)new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret);
}
}
其功能是實(shí)現(xiàn)圖片上傳至OSS,其內(nèi)置操作有興趣的可以自己看源碼
4. 文件上傳接口
/**
* @author hj(BaridHu)
*/
@Slf4j
@Api(value = "file", tags = {"文件控制層"})
@RequestMapping("file")
@RestController
@LoginClassAnnotation
public class FileController {
@Value("${aliyun.oss.maxSize}")
private int maxSize;
@Value("${aliyun.oss.bucketName}")
private String bucketName;
@Value("${aliyun.oss.dir.prefix}")
private String dirPrefix;
@Resource
private OSSClient ossClient;
@Resource
private FileService fileService;
@ApiOperation(value = "文件上傳OSS接口")
@PostMapping("upload")
public RestResponse uploadToOSS(@ApiParam(value = "文件名", required = true) @RequestParam("photo") MultipartFile file) {
String url = "";
try {
InputStream inputStream = file.getInputStream();
String objectName = getObjectName(file);
// 創(chuàng)建PutObject請(qǐng)求。
ossClient.putObject(bucketName, objectName, inputStream);
url = formatPath(objectName);
} catch (IOException e) {
e.printStackTrace();
}
return RestResponse.ok(url);
}
private String getObjectName(MultipartFile file) {
// 文件后綴
String suffixName = Objects.requireNonNull(file.getOriginalFilename()).substring(file.getOriginalFilename().lastIndexOf("."));
String fileName = SpringContextUtils.getContext().getBean(SnowFlakeUtils.class).nextId() + suffixName;
// 文件類型:1-圖片,2-音頻,3-視頻
String fileType = FileUtils.getFileType(suffixName);
// 完整路徑
String objectName = "";
switch (fileType) {
case "1":
objectName = dirPrefix + "images/" + DateUtil.today() + "/" + fileName;
break;
case "2":
objectName = dirPrefix + "audio/" + DateUtil.today() + "/" + fileName;
break;
case "3":
objectName = dirPrefix +"videos/" + DateUtil.today() + "/" + fileName;
break;
default:
break;
}
return objectName;
}
private String formatPath(String objectName){
return "https://" + bucketName + "." + ossClient.getEndpoint().getHost() + "/" + objectName;
}
}
補(bǔ)充1: SpringContextUtils.getContext().getBean(SnowFlakeUtils.class).nextId()
是利用雪花算法生成全局唯一的ID值,源于Twitter,能很好的保證ID值不重復(fù),有興趣的自己可以研究研究,有時(shí)間我也會(huì)出一期關(guān)于雪花算法的文章,這里大家可以使用UUID來代替
String fileName = UUID.randomUUID().toString() + suffixName;
補(bǔ)充2: FileUtils工具類
/**
* @author hj(BaridHu)
*/
@Component
public class FileUtils {
public static final String TYPE_JPG = ".jpg";
public static final String TYPE_GIF = ".gif";
public static final String TYPE_PNG = ".png";
public static final String TYPE_BMP = ".bmp";
public static final String TYPE_MP3 = ".mp3";
public static final String TYPE_WAV = ".wav";
public static final String TYPE_M4A = ".m4a";
public static final String TYPE_MP4 = ".mp4";
public static final String TYPE_UNKNOWN = "unknown";
public static boolean delFile(File file) {
if (file.exists()) {
String name = file.getName();
file.delete();
System.out.println("文件 [" + name + "] 已經(jīng)刪除!");
return true;
}
return false;
}
/**
* 獲取文件類型
* type:1-圖片,2-音頻,3-視頻
*
* @return {@link String}
*/
public static String getFileType(String suffixName) {
String type = null;
switch (suffixName) {
case TYPE_JPG:
case TYPE_GIF:
case TYPE_PNG:
case TYPE_BMP:
type = "1";
break;
case TYPE_MP3:
case TYPE_WAV:
case TYPE_M4A:
type = "2";
break;
case TYPE_MP4:
type = "3";
break;
default:
break;
}
return type;
}
}
4. 使用Swagger測(cè)試
可以看到已經(jīng)上傳至對(duì)象存儲(chǔ)桶了如何下載呢?
將返回的URL在瀏覽器網(wǎng)址輸入欄輸入就行文章來源:http://www.zghlxwxcb.cn/news/detail-455155.html
這篇文章就先介紹這么多,后面會(huì)更新拓展!如果你覺得這篇文章對(duì)你有幫助的話,請(qǐng)點(diǎn)贊和收藏哦!如果能點(diǎn)撥小小的關(guān)注就更好哦!文章來源地址http://www.zghlxwxcb.cn/news/detail-455155.html
到了這里,關(guān)于使用SpringBoot將圖片上傳至阿里云OSS的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!