目錄:
一绢彤、什么是對(duì)象存儲(chǔ)OSS
二谴垫、基本概念
2.1、存儲(chǔ)空間(Bucket)
2.2存哲、對(duì)象/文件(Object)
2.3因宇、Region(地域)
2.4、Endpoint(訪(fǎng)問(wèn)域名)
2.5祟偷、AccessKey(訪(fǎng)問(wèn)密鑰)
2.6账忘、強(qiáng)一致性
2.7谚鄙、數(shù)據(jù)冗余機(jī)制
2.8嚷往、OSS 與文件系統(tǒng)的對(duì)比
三博杖、應(yīng)用場(chǎng)景
3.1婚惫、圖片和音視頻等應(yīng)用的海量存儲(chǔ)
3.2氛赐、網(wǎng)頁(yè)或者移動(dòng)應(yīng)用的靜態(tài)和動(dòng)態(tài)資源分離
3.3、云端數(shù)據(jù)處理
四先舷、實(shí)戰(zhàn)演練
4.1艰管、創(chuàng)建 Bucket
4.2、文件管理
4.3蒋川、SpringBoot整合OSS牲芋,實(shí)現(xiàn)上傳,下載以及查看
4.3.1捺球、前期準(zhǔn)備
4.3.2缸浦、配置application-oss.properties
4.3.3、創(chuàng)建一個(gè)配置類(lèi)
4.3.4氮兵、文件上傳到OSS
4.3.5裂逐、從OSS下載到本地
4.3.6、查看OSS存在的文件
一泣栈、什么是對(duì)象存儲(chǔ)OSS
阿里云對(duì)象存儲(chǔ)OSS(Object Storage Service)是阿里云提供的海量卜高、安全、低成本南片、高可靠的云存儲(chǔ)服務(wù)掺涛。其數(shù)據(jù)設(shè)計(jì)持久性不低于99.9999999999%(12個(gè)9),服務(wù)可用性(或業(yè)務(wù)連續(xù)性)不低于99.995%疼进。
OSS具有與平臺(tái)無(wú)關(guān)的RESTful API接口薪缆,您可以在任何應(yīng)用、任何時(shí)間伞广、任何地點(diǎn)存儲(chǔ)和訪(fǎng)問(wèn)任意類(lèi)型的數(shù)據(jù)矮燎。
二定血、基本概念
2.1、存儲(chǔ)空間(Bucket)
存儲(chǔ)空間是用戶(hù)用于存儲(chǔ)對(duì)象(Object)的容器诞外,所有的對(duì)象都必須隸屬于某個(gè)存儲(chǔ)空間澜沟。存儲(chǔ)空間具有各種配置屬性,包括地域峡谊、訪(fǎng)問(wèn)權(quán)限茫虽、存儲(chǔ)類(lèi)型等。用戶(hù)可以根據(jù)實(shí)際需求既们,創(chuàng)建不同類(lèi)型的存儲(chǔ)空間來(lái)存儲(chǔ)不同的數(shù)據(jù)濒析。
- 同一個(gè)存儲(chǔ)空間的內(nèi)部是扁平的,沒(méi)有文件系統(tǒng)的目錄等概念啥纸,所有的對(duì)象都直接隸屬于其對(duì)應(yīng)的存儲(chǔ)空間号杏。
- 每個(gè)用戶(hù)可以擁有多個(gè)存儲(chǔ)空間。
- 存儲(chǔ)空間的名稱(chēng)在 OSS 范圍內(nèi)必須是全局唯一的斯棒,一旦創(chuàng)建之后無(wú)法修改名稱(chēng)盾致。
- 存儲(chǔ)空間內(nèi)部的對(duì)象數(shù)目沒(méi)有限制。
存儲(chǔ)空間的命名規(guī)范如下:
- 只能包括小寫(xiě)字母荣暮、數(shù)字和短橫線(xiàn)(-)庭惜。
- 必須以小寫(xiě)字母或者數(shù)字開(kāi)頭和結(jié)尾。
- 長(zhǎng)度必須在 3–63 字節(jié)之間穗酥。
2.2护赊、對(duì)象/文件(Object)
對(duì)象是 OSS 存儲(chǔ)數(shù)據(jù)的基本單元,也被稱(chēng)為 OSS 的文件砾跃。對(duì)象由元信息(Object Meta)骏啰,用戶(hù)數(shù)據(jù)(Data)和文件名(Key)組成。對(duì)象由存儲(chǔ)空間內(nèi)部唯一的 Key 來(lái)標(biāo)識(shí)抽高。對(duì)象元信息是一組鍵值對(duì)器一,表示了對(duì)象的一些屬性,比如最后修改時(shí)間厨内、大小等信息祈秕,同時(shí)用戶(hù)也可以在元信息中存儲(chǔ)一些自定義的信息。
對(duì)象的生命周期是從上傳成功到被刪除為止雏胃。在整個(gè)生命周期內(nèi)请毛,只有通過(guò)追加上傳的 Object 可以繼續(xù)通過(guò)追加上傳寫(xiě)入數(shù)據(jù),其他上傳方式上傳的 Object 內(nèi)容無(wú)法編輯瞭亮,您可以通過(guò)重復(fù)上傳同名的對(duì)象來(lái)覆蓋之前的對(duì)象方仿。
對(duì)象的命名規(guī)范如下:
- 使用 UTF-8 編碼。
- 長(zhǎng)度必須在 1–1023 字節(jié)之間。
- 不能以正斜線(xiàn)(/)或者反斜線(xiàn)(\)開(kāi)頭仙蚜。
2.3此洲、Region(地域)
Region 表示 OSS 的數(shù)據(jù)中心所在物理位置。Region 是在創(chuàng)建 Bucket 的時(shí)候指定的委粉,一旦指定之后就不允許更改呜师。該 Bucket 下所有的 Object 都存儲(chǔ)在對(duì)應(yīng)的數(shù)據(jù)中心,目前不支持 Object 級(jí)別的 Region 設(shè)置贾节。
2.4汁汗、Endpoint(訪(fǎng)問(wèn)域名)
Endpoint 表示 OSS 對(duì)外服務(wù)的訪(fǎng)問(wèn)域名。OSS 以 HTTP RESTful API 的形式對(duì)外提供服務(wù)栗涂,當(dāng)訪(fǎng)問(wèn)不同的 Region 的時(shí)候知牌,需要不同的域名。通過(guò)內(nèi)網(wǎng)和外網(wǎng)訪(fǎng)問(wèn)同一個(gè) Region 所需要的 Endpoint 也是不同的斤程。
2.5角寸、AccessKey(訪(fǎng)問(wèn)密鑰)
AccessKey(簡(jiǎn)稱(chēng) AK)指的是訪(fǎng)問(wèn)身份驗(yàn)證中用到的 AccessKeyId 和 AccessKeySecret。OSS 通過(guò)使用 AccessKeyId 和 AccessKeySecret 對(duì)稱(chēng)加密的方法來(lái)驗(yàn)證某個(gè)請(qǐng)求的發(fā)送者身份忿墅。AccessKeyId 用于標(biāo)識(shí)用戶(hù)扁藕;AccessKeySecret 是用戶(hù)用于加密簽名字符串和 OSS 用來(lái)驗(yàn)證簽名字符串的密鑰,必須保密球匕。對(duì)于 OSS 來(lái)說(shuō)纹磺,AccessKey 的來(lái)源有:
- Bucket 的擁有者申請(qǐng)的 AccessKey帖烘。
- 被 Bucket 的擁有者通過(guò) RAM 授權(quán)給第三方請(qǐng)求者的 AccessKey亮曹。
- 被 Bucket 的擁有者通過(guò) STS 授權(quán)給第三方請(qǐng)求者的 AccessKey。
2.6秘症、強(qiáng)一致性
Object 操作在 OSS 上具有原子性照卦,操作要么成功要么失敗,不會(huì)存在有中間狀態(tài)的 Object乡摹。OSS 保證用戶(hù)一旦上傳完成之后讀到的 Object 是完整的役耕,OSS 不會(huì)返回給用戶(hù)一個(gè)部分上傳成功的 Object。
Object 操作在 OSS 上同樣具有強(qiáng)一致性聪廉,用戶(hù)一旦收到了一個(gè)上傳(PUT)成功的響應(yīng)瞬痘,該上傳的 Object 就已經(jīng)立即可讀,并且 Object 的冗余數(shù)據(jù)已經(jīng)寫(xiě)成功板熊。不存在一種上傳的中間狀態(tài)框全,即 read-after-write 卻無(wú)法讀取到數(shù)據(jù)。對(duì)于刪除操作也是一樣的干签,用戶(hù)刪除指定的 Object 成功之后津辩,該 Object 立即變?yōu)椴淮嬖凇?/p>
2.7、數(shù)據(jù)冗余機(jī)制
OSS 采用數(shù)據(jù)冗余存儲(chǔ)機(jī)制,將每個(gè)對(duì)象的不同冗余存儲(chǔ)在同一個(gè)區(qū)域內(nèi)多個(gè)設(shè)施的多個(gè)設(shè)備上喘沿,確保硬件失效時(shí)的數(shù)據(jù)可靠性和可用性闸度。
- OSS Object 操作具有強(qiáng)一致性,用戶(hù)一旦收到了上傳/復(fù)制成功的響應(yīng)蚜印,則該上傳的 Object 就已經(jīng)立即可讀莺禁,且數(shù)據(jù)已經(jīng)冗余寫(xiě)入到多個(gè)設(shè)備中。
- OSS 會(huì)通過(guò)計(jì)算網(wǎng)絡(luò)流量包的校驗(yàn)和晒哄,驗(yàn)證數(shù)據(jù)包在客戶(hù)端和服務(wù)端之間傳輸中是否出錯(cuò)睁宰,保證數(shù)據(jù)完整傳輸。
- OSS 的冗余存儲(chǔ)機(jī)制寝凌,可支持兩個(gè)存儲(chǔ)設(shè)施并發(fā)損壞時(shí)柒傻,仍維持?jǐn)?shù)據(jù)不丟失。
a.當(dāng)數(shù)據(jù)存入 OSS 后较木,OSS 會(huì)檢測(cè)和修復(fù)丟失的冗余红符,確保數(shù)據(jù)可靠性和可用性。
b. OSS 會(huì)周期性地通過(guò)校驗(yàn)等方式驗(yàn)證數(shù)據(jù)的完整性伐债,及時(shí)發(fā)現(xiàn)因硬件失效等原因造成的數(shù)據(jù)損壞预侯。當(dāng)檢測(cè)到數(shù)據(jù)有部分損壞或丟失時(shí),OSS 會(huì)利用冗余的數(shù)據(jù)峰锁,進(jìn)行重建并修復(fù)損壞數(shù)據(jù)萎馅。
2.8、OSS 與文件系統(tǒng)的對(duì)比
三虹蒋、應(yīng)用場(chǎng)景
3.1糜芳、圖片和音視頻等應(yīng)用的海量存儲(chǔ)
OSS可用于圖片、音視頻魄衅、日志等海量文件的存儲(chǔ)峭竣。各種終端設(shè)備、Web網(wǎng)站程序晃虫、移動(dòng)應(yīng)用可以直接向OSS寫(xiě)入或讀取數(shù)據(jù)皆撩。OSS支持流式寫(xiě)入和文件寫(xiě)入兩種方式。
3.2哲银、網(wǎng)頁(yè)或者移動(dòng)應(yīng)用的靜態(tài)和動(dòng)態(tài)資源分離
利用海量互聯(lián)網(wǎng)帶寬扛吞,OSS可以實(shí)現(xiàn)海量數(shù)據(jù)的互聯(lián)網(wǎng)并發(fā)下載。OSS提供原生的傳輸加速功能荆责,支持上傳加速滥比、下載加速,提升跨國(guó)草巡、跨洋數(shù)據(jù)上傳守呜、下載的體驗(yàn)型酥。
3.3、云端數(shù)據(jù)處理
上傳文件到OSS后查乒,可以配合媒體處理服務(wù)和圖片處理服務(wù)進(jìn)行云端的數(shù)據(jù)處理弥喉。
四、實(shí)戰(zhàn)演練
前提:開(kāi)始使用"對(duì)象存儲(chǔ)OSS"首先要進(jìn)入到阿里云控制臺(tái)玛迄,控制臺(tái)地址:https://oss.console.aliyun.com/overview
4.1由境、創(chuàng)建 Bucket
進(jìn)入控制臺(tái),選擇對(duì)象存儲(chǔ)蓖议。然后點(diǎn)擊創(chuàng)建Bucket虏杰,如下圖所示
4.2、文件管理
進(jìn)入剛才創(chuàng)建的Bucket中勒虾,進(jìn)行文件在線(xiàn)管理纺阔,如圖所示
4.3、SpringBoot整合OSS修然,實(shí)現(xiàn)上傳笛钝,下載以及查看
4.3.1、前期準(zhǔn)備
<dependency>
<groupId>com.aliyun.oss</groupId>
<artifactId>aliyun-sdk-oss</artifactId>
<version>2.8.3</version>
</dependency>
4.3.2愕宋、配置application-oss.properties
##########阿里云對(duì)象存儲(chǔ)OSS###################
aliyun.endpoint=oss-cn-shanghai.aliyuncs.com
aliyun.accessKeyId=*******
aliyun.accessKeySecret=*******
aliyun.bucketName=phone-xby
aliyun.urlPrefix=http://phone-xby.oss-cn-shanghai.aliyuncs.com/
4.3.3玻靡、創(chuàng)建一個(gè)配置類(lèi)
import com.aliyun.oss.OSS;
import com.aliyun.oss.OSSClient;
import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.PropertySource;
/**
*
* @author Xiby
*
*/
@Configuration
@PropertySource(value = {"classpath:application-oss.properties"})
@ConfigurationProperties(prefix = "aliyun")
@Data
public class AliyunConfig {
private String endpoint;
private String accessKeyId;
private String accessKeySecret;
private String bucketName;
private String urlPrefix;
@Bean
public OSS oSSClient() {
return new OSSClient(endpoint, accessKeyId, accessKeySecret);
}
}
4.3.4、文件上傳到OSS
4.3.4.1中贝、Controller類(lèi)
@Controller
public class AiliyunOSSController {
@Autowired
private AiliyunOSSService ailiyunOSSlService;
/**
* @param uploadFile
* @return
* @desc 上傳文件到OOS
*/
@RequestMapping(value = {"/ailiyunOSS/uplodeFile"}, method = RequestMethod.POST)
@ResponseBody
public Message uplodeFile(@RequestParam("file") MultipartFile uploadFile) {
return ailiyunOSSlService.upload( uploadFile );
}
}
4.3.4.2囤捻、Service類(lèi)
import cn.hutool.core.date.DateTime;
import com.aliyun.oss.OSS;
import com.aliyun.oss.model.ListObjectsRequest;
import com.aliyun.oss.model.OSSObject;
import com.aliyun.oss.model.OSSObjectSummary;
import com.aliyun.oss.model.ObjectListing;
import org.apache.commons.lang3.RandomUtils;
import org.apache.commons.lang3.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.web.multipart.MultipartFile;
import javax.servlet.http.HttpServletResponse;
import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.ByteArrayInputStream;
import java.io.InputStream;
import java.net.URLEncoder;
import java.util.List;
@Service
public class AiliyunOSSServiceImpl implements AiliyunOSSService {
private static final Logger logger = LoggerFactory.getLogger( Thread
.currentThread().getStackTrace()[1].getClassName() );
@Autowired
private OSS ossClient;
@Autowired
private AliyunConfig aliyunConfig;
@Override
public Message upload(MultipartFile uploadFile) {
Message m = new Message();
String fileName = uploadFile.getOriginalFilename();
try {
ossClient.putObject( aliyunConfig.getBucketName(), fileName, new
ByteArrayInputStream( uploadFile.getBytes() ) );
} catch (Exception e) {
e.printStackTrace();
//上傳失敗
m.setResult( "002" );
m.setDetail( "文件上傳失敗" );
return m;
}
m.setResult( "001" );
m.setDetail( "文件上傳成功" );
logger.info( "OSS存儲(chǔ)路徑:{URL=" + this.aliyunConfig.getUrlPrefix() + fileName + "}" );
return m;
}
}
4.3.4.3.前端(Layui)
<div class="layui-form-item" style="margin: 10px 0;">
<label class="layui-form-label">所屬階段</label>
<div class="layui-input-block">
<button type="button" class="layui-btn" id="test1">
<i class="layui-icon"></i>導(dǎo)入
</button>
</div>
</div>
var uploadInst = upload.render({
elem: '#test1' //綁定元素
,url: '/ailiyunOSS/uplodeFile' //上傳接口
,exts:'jpg|png|gif|bmp|jpeg|txt|word|docx|mp4|pdf|doc|xlsx|xls|pptx|ppt|wmv'
,size:0
,done:function () {
initTable();
}
});
4.3.5、從OSS下載到本地
4.3.5.1邻寿、Controller類(lèi)
/**
*
* @author Xiby
*
* @desc 根據(jù)文件名下載oss上的文件
*
* @Param fileNames
*/
@RequestMapping(value = {"/ailiyunOSS/exportFile/{fileNames:.*}"}, method = RequestMethod.GET)
@ResponseBody
public void downloadFile(@PathVariable("fileNames") String fileNames,HttpServletResponse response){
HttpHeaders headers = new HttpHeaders();
headers.setContentType( MediaType.APPLICATION_OCTET_STREAM );
ailiyunOSSlService.downloadFile(fileNames,response);
}
4.3.5.2蝎土、Servicel類(lèi)
@Override
public void downloadFile(String fileNames, HttpServletResponse response) {
try {
OSSObject ossObject = ossClient.getObject( aliyunConfig.getBucketName(), fileNames );
BufferedInputStream in = new BufferedInputStream( ossObject.getObjectContent() );
BufferedOutputStream out = new BufferedOutputStream( response.getOutputStream() );
response.setHeader( "Content-Disposition", "attachment;filename=" + URLEncoder.encode( fileNames, "utf-8" ) );
byte[] car = new byte[1024];
int L = 0;
while ((L = in.read( car )) != -1) {
out.write( car, 0, L );
}
if (out != null) {
out.flush();
out.close();
}
if (in != null) {
in.close();
}
ossClient.shutdown();
} catch (Exception e) {
e.printStackTrace();
}
}
4.3.5.3、前端
<a class="layui-btn layui-btn-xs export" lay-event="exportCsv">下載</a>
var $form = $('<form method="GET"></form>');
$form.attr('action', '/ailiyunOSS/exportFile/'+ encodeURI(fileNames));
$form.appendTo($('body'));
$form.submit();
4.3.6老厌、查看OSS存在的文件
4.3.6.1瘟则、Controller類(lèi)
@RequestMapping("/ailiyunOSS/queryFile")
@ResponseBody
public GriddataPageinfo list()
throws Exception {
return this.ailiyunOSSlService.list();
}
4.3.6.2黎炉、Service類(lèi)
@Override
public GriddataPageinfo list() {
final int maxKeys = 100;
ObjectListing objectListing = ossClient.listObjects( new ListObjectsRequest( aliyunConfig.getBucketName() ).withMaxKeys( maxKeys ) );
List<OSSObjectSummary> sums = objectListing.getObjectSummaries();
return new GriddataPageinfo( sums.size(), sums );
}
4.3.6.3枝秤、前端
var initTable = function () {
tObj = table.render({
id:'testReload',
elem: '#datagrid',
height: 500,
url: web_path + '/ailiyunOSS/queryFile',
response: {
countName: 'total',
dataName: 'rows'
},
page: true,
cols: [[
{field: 'bucketName',width: 200, title: '文件管理'},
{field: 'lastModified',width: 200, title: '上傳時(shí)間'},
{field: 'key',width: 800, title: '文件存儲(chǔ)路徑'},
{field: 'size',width: 225, title: '文件大小(B)'},
{field: 'tools',fixed: 'right', title: '操作', align: 'center', toolbar: '#showBar',width:150}
]]
});
};
目前文章就介紹到這里了,想要查看了解更多更詳細(xì)的對(duì)象存儲(chǔ)OSS的操作慷嗜,請(qǐng)查看官方文檔
本文參考文獻(xiàn):https://help.aliyun.com/document_detail/31817.html?spm=a2c4g.11186623.6.543.1fa66820dbcDTj