本文介绍一些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;
    }
}