阿里云对象存储服务(Object Storage Service,简称 OSS),是阿里云提供的海量、安全、低成本、高可靠的云存储服务。其数据设计持久性不低于 99.9999999999%(12 个 9),服务设计可用性(或业务连续性)不低于 99.995%。
OSS 具有与平台无关的 RESTful API 接口,您可以在任何应用、任何时间、任何地点存储和访问任意类型的数据。
您可以使用阿里云提供的 API、SDK 接口或者 OSS 迁移工具轻松地将海量数据移入或移出阿里云 OSS。数据存储到阿里云 OSS 以后,您可以选择标准存储(Standard)作为移动应用、大型网站、图片分享或热点音视频的主要存储方式,也可以选择成本更低、存储期限更长的低频访问存储(Infrequent Access)和归档存储(Archive)作为不经常访问数据的存储方式。
相关概念
- 存储类型(Storage Class)
OSS 提供标准、低频访问、归档三种存储类型,全面覆盖从热到冷的各种数据存储场景。其中标准存储类型提供高可靠、高可用、高性能的对象存储服务,能够支持频繁的数据访问;低频访问存储类型适合长期保存不经常访问的数据(平均每月访问频率 1 到 2 次),存储单价低于标准类型;归档存储类型适合需要长期保存(建议半年以上)的归档数据,在三种存储类型中单价最低。详情请参见存储类型介绍。
- 存储空间(Bucket)
存储空间是您用于存储对象(Object)的容器,所有的对象都必须隶属于某个存储空间。存储空间具有各种配置属性,包括地域、访问权限、存储类型等。您可以根据实际需求,创建不同类型的存储空间来存储不同的数据。创建存储空间请参见创建存储空间。
- 对象/文件(Object)
对象是 OSS 存储数据的基本单元,也被称为 OSS 的文件。对象由元信息(Object Meta)、用户数据(Data)和文件名(Key)组成。对象由存储空间内部唯一的 Key 来标识。对象元信息是一组键值对,表示了对象的一些属性,比如最后修改时间、大小等信息,同时您也可以在元信息中存储一些自定义的信息。
- 地域(Region)
地域表示 OSS 的数据中心所在物理位置。您可以根据费用、请求来源等选择合适的地域创建 Bucket。详情请参见 OSS 已开通的Region。
- 访问域名(Endpoint)
Endpoint 表示 OSS 对外服务的访问域名。OSS 以 HTTP RESTful API 的形式对外提供服务,当访问不同地域的时候,需要不同的域名。通过内网和外网访问同一个地域所需要的域名也是不同的。具体的内容请参见各个 Region 对应的 Endpoint。
- 访问密钥(AccessKey)
AccessKey(简称 AK)指的是访问身份验证中用到的 AccessKeyId 和 AccessKeySecret。OSS 通过使用 AccessKeyId 和 AccessKeySecret 对称加密的方法来验证某个请求的发送者身份。AccessKeyId 用于标识用户;AccessKeySecret 是用户用于加密签名字符串和 OSS 用来验证签名字符串的密钥,必须保密。获取 AccessKey 的方法请参见创建 AccessKey。
以下介绍阿里云常用的api,具体api的可以参考阿里云官方文档:https://helpcdn.aliyun.com/document_detail/31817.html
转载一篇阿里云在实际运行中的坑:https://www.cnblogs.com/wggj/p/9172202.html
package utils; import java.io.File; import java.io.IOException; import java.io.InputStream; import java.net.URL; import java.util.List; import org.apache.log4j.Logger; import com.aliyun.oss.OSSClient; import com.aliyun.oss.model.Bucket; import com.aliyun.oss.model.BucketList; import com.aliyun.oss.model.ListBucketsRequest; import com.aliyun.oss.model.ListObjectsRequest; import com.aliyun.oss.model.OSSObject; import com.aliyun.oss.model.OSSObjectSummary; import com.aliyun.oss.model.ObjectListing; public class OssUtil { public static Logger logger = Logger.getLogger(OssUtil.class); public static OSSClient ossClient = null; /** * @Title: getOSSClient * @Description: 获取oss客户端 * @return OSSClient oss客户端 */ public static OSSClient getOSSClient() { try { if (null == ossClient) { //endpoint,域名地址 String endpoint = "http://oss-cn-shenzhen.aliyuncs.com"; //阿里云主账号AccessKey拥有所有API的访问权限,风险很高。 //强烈建议您创建并使用RAM账号进行API访问或日常运维,请登录https://ram.console.aliyun.com 创建RAM账号。 String accessKeyId = "你的accessKeyId"; String accessKeySecret = "你的accessKeySecret"; ossClient = new OSSClient(endpoint, accessKeyId, accessKeySecret); } } catch (Exception e) { logger.error("获取ossClient异常", e); } return ossClient; } /** * getBucketListWithPrefixAndMarker * 存储空间(Bucket)是存储对象(Object)的容器。对象都隶属于存储空间。 * 列举指定前缀(prefix)、指定标记(marker)之后的存储空间(bucket)信息 */ public BucketList getBucketList(){ // Endpoint以杭州为例,其它Region请按实际情况填写。 String endpoint = "http://oss-cn-hangzhou.aliyuncs.com"; // 阿里云主账号AccessKey拥有所有API的访问权限,风险很高。 // 强烈建议您创建并使用RAM账号进行API访问或日常运维,请登录 https://ram.console.aliyun.com 创建RAM账号。 String accessKeyId = "<yourAccessKeyId>"; String accessKeySecret = "<yourAccessKeySecret>"; // 创建OSSClient实例。 OSSClient ossClient = new OSSClient(endpoint, accessKeyId, accessKeySecret); ListBucketsRequest listBucketsRequest = new ListBucketsRequest(); // 列举指定前缀的存储空间。 listBucketsRequest.setPrefix("<yourBucketPrefix>"); // 列举指定marker之后的存储空间。 listBucketsRequest.setMarker("<yourBucketMarker>"); BucketList bucketList = ossClient.listBuckets(listBucketsRequest); for (Bucket bucket : bucketList.getBucketList()) { System.out.println(" - " + bucket.getName()); } // 关闭OSSClient。 ossClient.shutdown(); return bucketList; } /** * OSS文件按照字母顺序排列。您可以通过ossClient.listObjects列出存储空间下的文件。listObjects有以下三类参数格式: * ObjectListing listObjects(String bucketName):列举存储空间下的文件。最多列举100个文件。 * ObjectListing listObjects(String bucketName, String prefix): 列举存储空间下指定前缀的文件。最多列举100个文件。 * ObjectListing listObjects(ListObjectsRequest listObjectsRequest):提供多种过滤功能,实现灵活的查询功能。 * * ObjectListing的参数如下: * objectSummaries 限定返回的文件元信息。 List<OSSObjectSummary> getObjectSummaries() * prefix 本次查询结果的前缀。 String getPrefix() * delimiter 对文件名称进行分组的一个字符。 String getDelimiter() * marker 标明本次列举文件的起点。 String getMarker() * maxKeys 列举文件的最大个数。 int getMaxKeys() * nextMarker 下一次列举文件的起点。 String getNextMarker() * isTruncated 指明列举文件是否被截断。列举完没有截断,返回值为false。没列举完就有截断,返回值为true。boolean isTruncated() * commonPrefixes 以delimiter结尾,且有共同前缀的文件集合。 List<String> getCommonPrefixes() * encodingType 指明返回结果中编码使用的类型。 String getEncodingType() */ public ObjectListing getObjectList(){ // Endpoint以杭州为例,其它Region请按实际情况填写。 String endpoint = "http://oss-cn-hangzhou.aliyuncs.com"; // 阿里云主账号AccessKey拥有所有API的访问权限,风险很高。强烈建议您创建并使用RAM账号进行API访问或日常运维,请登录 https://ram.console.aliyun.com 创建RAM账号。 String accessKeyId = "<yourAccessKeyId>"; String accessKeySecret = "<yourAccessKeySecret>"; String bucketName = "<yourBucketName>"; // 创建OSSClient实例。 OSSClient ossClient = new OSSClient(endpoint, accessKeyId, accessKeySecret); // 指定每页200个文件。 final int maxKeys = 200; final String keyPrefix = "<yourkeyPrefix>"; String nextMarker = null; ObjectListing objectListing; do { objectListing = ossClient.listObjects(new ListObjectsRequest(bucketName). withPrefix(keyPrefix).withMarker(nextMarker).withMaxKeys(maxKeys)); List<OSSObjectSummary> sums = objectListing.getObjectSummaries(); for (OSSObjectSummary s : sums) { System.out.println("\t" + s.getKey()); } nextMarker = objectListing.getNextMarker(); } while (objectListing.isTruncated()); // 关闭OSSClient。 ossClient.shutdown(); return objectListing; } /** * * @Title: uploadByNetworkStream * @Description: 通过网络流上传文件 * @param ossClient oss客户端 * @param url URL * @param bucketName bucket名称 * @param objectName 上传文件目录和(包括文件名)例如“test/index.html” * @return void 返回类型 * @throws */ public static void uploadByNetworkStream(OSSClient ossClient, URL url, String bucketName, String objectName) { try { InputStream inputStream = url.openStream(); ossClient.putObject(bucketName, objectName, inputStream); ossClient.shutdown(); } catch (IOException e) { e.printStackTrace(); } finally { if (ossClient != null) { ossClient.shutdown(); } } } /** * @Title: uploadByInputStream * @Description: 通过输入流上传文件 * @param ossClient oss客户端 * @param inputStream 输入流 * @param bucketName bucket名称 * @param objectName 上传文件目录和(包括文件名) 例如“test/a.jpg” * @return void 返回类型 * @throws */ public static void uploadByInputStream(OSSClient ossClient, InputStream inputStream, String bucketName, String objectName) { try { ossClient.putObject(bucketName, objectName, inputStream); } catch (Exception e) { e.printStackTrace(); } finally { if (ossClient != null) { ossClient.shutdown(); } } } /** * @Title: uploadByFile * @Description: 通过file上传文件 * @param ossClient oss客户端 * @param file 上传的文件 * @param bucketName bucket名称 * @param objectName 上传文件目录和(包括文件名) 例如“test/a.jpg” * @return void 返回类型 */ public static void uploadByFile(OSSClient ossClient, File file, String bucketName, String objectName) { try { ossClient.putObject(bucketName, objectName, file); } catch (Exception e) { e.printStackTrace(); } finally { if (ossClient != null) { ossClient.shutdown(); } } } /** * @Title: deleteFile * @Description: 根据key删除oss服务器上的文件 * @param ossClient oss客户端 * @param bucketName bucket名称 * @param key 文件路径/名称,例如“test/a.txt” * @return void 返回类型 */ public static void deleteFile(OSSClient ossClient, String bucketName, String key) { ossClient.deleteObject(bucketName, key); } /** * @Title: getInputStreamByOSS * @Description:根据key获取服务器上的文件的输入流 * @param ossClient oss客户端 * @param bucketName bucket名称 * @param key 文件路径和名称 * @return InputStream 文件输入流 */ public static InputStream getInputStreamByOSS(OSSClient ossClient, String bucketName, String key) { InputStream content = null; try { OSSObject ossObj = ossClient.getObject(bucketName, key); content = ossObj.getObjectContent(); } catch (Exception e) { e.printStackTrace(); } return content; } }