本文介绍一些OSS经常使用的api使用方法,具体api查看阿里云官方文档:https://helpcdn.aliyun.com/document_detail/31817.htmlhtml
转载一篇阿里云oss的坑:http://www.javashuo.com/article/p-unywlevw-nb.htmljava
阿里云对象存储服务(Object Storage Service,简称 OSS),是阿里云提供的海量、安全、低成本、高可靠的云存储服务。其数据设计持久性不低于 99.9999999999%(12 个 9),服务设计可用性(或业务连续性)不低于 99.995%。apache
OSS 具备与平台无关的 RESTful API 接口,您能够在任何应用、任什么时候间、任何地点存储和访问任意类型的数据。api
您可使用阿里云提供的 API、SDK 接口或者 OSS 迁移工具轻松地将海量数据移入或移出阿里云 OSS。数据存储到阿里云 OSS 之后,您能够选择标准存储(Standard)做为移动应用、大型网站、图片分享或热点音视频的主要存储方式,也能够选择成本更低、存储期限更长的低频访问存储(Infrequent Access)和归档存储(Archive)做为不常常访问数据的存储方式。安全
OSS 提供标准、低频访问、归档三种存储类型,全面覆盖从热到冷的各类数据存储场景。其中标准存储类型提供高可靠、高可用、高性能的对象存储服务,可以支持频繁的数据访问;低频访问存储类型适合长期保存不常常访问的数据(平均每个月访问频率 1 到 2 次),存储单价低于标准类型;归档存储类型适合须要长期保存(建议半年以上)的归档数据,在三种存储类型中单价最低。详情请参见存储类型介绍。服务器
存储空间是您用于存储对象(Object)的容器,全部的对象都必须隶属于某个存储空间。存储空间具备各类配置属性,包括地域、访问权限、存储类型等。您能够根据实际需求,建立不一样类型的存储空间来存储不一样的数据。建立存储空间请参见建立存储空间。网络
对象是 OSS 存储数据的基本单元,也被称为 OSS 的文件。对象由元信息(Object Meta)、用户数据(Data)和文件名(Key)组成。对象由存储空间内部惟一的 Key 来标识。对象元信息是一组键值对,表示了对象的一些属性,好比最后修改时间、大小等信息,同时您也能够在元信息中存储一些自定义的信息。运维
地域表示 OSS 的数据中心所在物理位置。您能够根据费用、请求来源等选择合适的地域建立 Bucket。详情请参见 OSS 已开通的Region。工具
Endpoint 表示 OSS 对外服务的访问域名。OSS 以 HTTP RESTful API 的形式对外提供服务,当访问不一样地域的时候,须要不一样的域名。经过内网和外网访问同一个地域所须要的域名也是不一样的。具体的内容请参见各个 Region 对应的 Endpoint。性能
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; } }