阿里云OSS学习

扫码查看

阿里云对象存储服务(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;
    }
}
01-07 01:48
查看更多