前端玩转阿里云对象存储 OSS

lxf2023-12-29 17:00:01

什么是对象存储 OSS?

对象存储(Object Storage Service,OSS),也叫基于对象的存储,是一种解决和处理离散单元的方法,可提供基于分布式系统之上的对象形式的数据存储服务,具有可拓展、可管理、低成本等特点,支持中心和边缘存储,能够实现存储需求的弹性伸缩,主要应用于海量数据管理的各类场景。

为什么选择对象存储?

作为一种新型的存储类型,对象存储有哪些优势呢,为什么要选择对象存储?这可能是很多企业关心的话题。要揭开这个迷题,或许要详细讲讲对象存储的几个优势:

  1. 高可靠:纠删码存储方案,能够提供更好的可靠性。跨数据中心的副本冗余,能够保障服务的高可用性。

  2. 易扩展:利用对象存储,存储空间无上限限制,也无需担心扩容问题。能够实现存储需求的弹性伸缩,从而提高业务灵活性。

  3. 低成本:无需前期投入。对象存储按需使用、按需付费的便捷性,能够有效避免存储及带宽资源的闲置浪费。

  4. 数据智能化:与其他产品紧密协同,提供标准 HDFS 访问方式,为大数据和机器学习的海量高速读写场景提供了标准平台。

  5. 存储加速:边缘存储可充分利用可用链路带宽,数据在边缘节点上传和下载可平均提速 60% 以上。

  6. 边缘计算:就近集成边缘计算及边缘缓存服务,边缘存储节点具备本地数据处理能力。

总结一下就四个字省事省心

快速开始

前提条件

已设置跨域资源共享(CORS)规则。详情请参见设置跨域访问。

通过浏览器直接访问OSS时,CORS配置规则要求如下:

  • 来源:设置为*。
  • 允许 Methods:选中GET、POST、PUT、DELETE以及HEAD。
  • 允许 Headers:设置为*。
  • 暴露 Headers:设置为ETag、x-oss-request-id和x-oss-version-id。 前端玩转阿里云对象存储 OSS

STS临时授权访问OSS

云账号AccessKey拥有所有API访问权限,建议使用STS方式给客户端授权。通过STS,您可以为第三方应用或子用户(即用户身份由您自己管理的用户)颁发一个自定义时效和权限的访问凭证。详情请参见STS临时授权访问OSS。

浏览器的使用请参见浏览器应用。

示例工程请参见example。

使用SDK

目前浏览器中不允许执行Bucket相关的操作,例如GetBucket (ListObjects)、GetBucketLogging、GetBucketReferer等。但允许您执行Object相关的操作,例如PutObject、GetObject等。

  • 引入SDK
<script src="http://gosspublic.alicdn.com/aliyun-oss-sdk-4.4.4.min.js"></script>

有关其他引入方式,请参见安装详解。 github直通车

  • 获取STS临时授权访问OSS

我是通过java获取,前端请求接口

获取方式有很多更多方式

/**
 * 获取阿里云登录凭证,同时添加定时器处理
 * @param {Object} UpdateForAliSts  凭证存储对象
 */
const UpdateForAliSts = {};
// 获取阿里云上传凭证
function proveForAli_pub() {
	let sts = JSON.parse(localStorage.getItem('sts'));
	if (sts) {
		let now = new Date().getTime();
		if (now - sts.timeout > 50 * 60 * 1000) {
			getAliSts();
		} else {
			let obj = JSON.parse(localStorage.getItem('sts')).data;
			UpdateForAliSts.accessKeyId = obj.accessKeyId;
			UpdateForAliSts.region = 'oss-cn-shanghai';
			UpdateForAliSts.bucket = obj.bucketName;
			UpdateForAliSts.stsToken = obj.securityToken;
			UpdateForAliSts.accessKeySecret = obj.accessKeySecret;
		}
	} else {
		getAliSts();
	}
}
function getAliSts() {
	$.ajax({
		type: "post",
		url: adders + "/ly-manage/api/oss/getSTSCredentials",
		dataType: "json",
		xhrFields: { withCredentials: true },
		success: function (response) {
			if (response.succeed) {
				recentTime()
				response.timeout = new Date().getTime();
				UpdateForAliSts.accessKeyId = response.data.accessKeyId
				UpdateForAliSts.region = 'oss-cn-shanghai';
				UpdateForAliSts.bucket = response.data.bucketName;
				UpdateForAliSts.stsToken = response.data.securityToken;
				UpdateForAliSts.accessKeySecret = response.data.accessKeySecret;
				let str = JSON.stringify(response)
				localStorage.setItem('sts', str)
			} else {
				if (response.errCode == 403) {
					localStorage.removeItem('recentTime')
					document.location.href = '../../login.html';
				} else {
					$.message({
						type: 'error',
						message: response.errMsg
					})
				}
			}
		}
	});
}
  • 上传文件 使用multipartUpload接口来上传文件。有关multipartUpload详情,请参见分片上传。
/**
 * 阿里云上传函数
 * @param {string} name      上传的文件路径名
 * @param {object} file      文件
 * @param {string} key		上传参数对象属性
 * @param {string} parmas    上传参数对象
 * @param {object} clientData 阿里云凭证sts
 */
async function UploadPicturesForAli_pub(clientData, file, name, parmas, key) {
	let client = new OSS.Wrapper(UpdateForAliSts);
	let flieType = 'jpg';
	let contentType = 'image/jpeg';
	// png、jpg、jpeg...图片一律转化为image/jpeg
	if (file.type == 'image/gif') {
		flieType = 'gif';
		contentType = 'image/gif'
	} else if (file.type == 'video/mp4') {
		flieType = 'mp4';
		contentType = 'video/mp4'
	}
	// 图片存放在阿里云中路径
	let storeName = `${name}/${new Date().getFullYear()}/${addZero(new Date().getMonth() + 1)}/${addZero(new Date().getDate())}/${new Date().getFullYear()
		+ addZero(new Date().getMonth() + 1) + addZero(new Date().getDate()) + addZero(new Date().getHours()) + addZero(new Date().getMinutes()) + addZero(new Date().getSeconds()) +
		addMinZroe(new Date().getMilliseconds()) + String(Math.random()).substr(2, 8)}.${flieType}`;
	// 分片上传
	await client.multipartUpload(storeName, file, { mime: contentType }, {
		progress: function* (percentage) {
			// 上传文件进度
			let fileloadingNum = Math.ceil(percentage * 100) + '%';
			console.log(fileloadingNum); 
		}
	}).then(res => {
		// 上传完成后把路径加入提交给后端的参数里
		parmas[key] = '/' + res.name;
	});
}

同时上传多个文件怎么办呢?把异步上传事件创建一个同步队列?如果是你你会怎么办?欢迎分享你的方法!!!