本文介绍一些OSS常用的api使用方法,具体api查看阿里云官方文档:https://helpcdn.aliyun.com/document_detail/31817.html
阿里云对象存储服务(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。
package utils;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.net.URL;
import java.util.ArrayList;
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.DeleteObjectsRequest;
import com.aliyun.oss.model.DeleteObjectsResult;
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;
}
/**
* 批量删除文件,每次最多删除1000个文件。有两种返回模式:
* 详细(verbose)模式:返回删除成功的文件列表。默认为详细模式。
* 简单(quiet)模式:返回删除失败的文件列表。
*
* DeleteObjectsRequest的参数如下:
* Keys 需要删除的文件。 setKeys(List<String>)
* quiet 返回模式。true表示简单模式,false表示详细模式。默认为详细模式。 setQuiet(boolean)
* encodingType 对返回的文件名称进行编码。编码类型目前仅支持url。 setEncodingType(String)
*
* DeleteObjectsResult的参数如下:
* deletedObjects 删除结果。详细模式下为删除成功的文件列表,简单模式下为删除失败的文件列表。 List<String> getDeletedObjects()
* encodingType deletedObjects中文件名称的编码,为空表示没有编码。 getEncodingType()
*/
public void deleteObjectBatch(){
// 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);
// 删除文件。key等同于ObjectName,表示删除OSS文件时需要指定包含文件后缀在内的完整路径,例如abc/efg/123.jpg。
List<String> keys = new ArrayList<String>();
keys.add("key0");
keys.add("key1");
keys.add("key2");
DeleteObjectsResult deleteObjectsResult = ossClient.deleteObjects(new DeleteObjectsRequest(bucketName).withKeys(keys));
List<String> deletedObjects = deleteObjectsResult.getDeletedObjects();
// 关闭OSSClient。
ossClient.shutdown();
}
/**
*
* @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;
}
}