对象存储 OSS

对象存储 OSS


前言


提示:以下是本篇文章正文内容,下面案例可供参考

一、OSS是什么?

对象存储(Object Storage Service,简称 OSS)是海量、安全、低成本、高可靠的云存储服务,具有与平台无关 RESTful API,能从互联网任何位置访问。OSS 提供标准、低频、归档等类型选择,全面优化存储成本。

一、OSS原理?

数据以对象(Object)的形式存储在OSS的存储空间(Bucket )中。如果要使用OSS存储数据,您需要先创建Bucket,并指定Bucket的地域、访问权限、存储类型等属性。创建Bucket后,您可以将数据以Object的形式上传到Bucket,并指定Object的文件名(Key)作为其唯一标识。

OSS以HTTP RESTful API的形式对外提供服务,访问不同地域需要不同的访问域名Endpoint)。当您请求访问OSS时,OSS通过使用访问密钥(AccessKey IDAccessKey Secret)对称加密的方法来验证某个请求的发送者身份。

Object操作在OSS上具有原子性和强一致性。

存储空间

存储空间是用户用于存储对象(Object)的容器,所有的对象都必须隶属于某个存储空间。存储空间具有各种配置属性,包括地域、访问权限、存储类型等。用户可以根据实际需求,创建不同类型的存储空间来存储不同的数据。

对象

对象是OSS存储数据的基本单元,也被称为OSS的文件。和传统的文件系统不同,对象没有文件目录层级结构的关系。对象由元数据(Object Meta)、用户数据(Data)和文件名(Key)组成,并且由存储空间内部唯一的Key来标识。对象元数据是一组键值对,表示了对象的一些属性,例如文件类型、编码方式等信息,同时用户也可以在元数据中存储一些自定义的信息。

对象名称

在各语言SDK中,ObjectKey、Key以及ObjectName是同一概念,均表示对Object执行相关操作时需要填写的Object名称。例如向某一存储空间上传Object时,ObjectKey表示上传的Object所在存储空间的完整名称,即包含文件后缀在内的完整路径,如填写为abc/efg/123.jpg。

地域

Region表示OSS的数据中心所在物理位置。用户可以根据费用、请求来源等选择合适的地域创建Bucket。一般来说,距离用户更近的Region访问速度更快。更多信息,请参见OSS已经开通的Region。

访问域名

Endpoint表示OSS对外服务的访问域名。OSS以HTTP RESTful API的形式对外提供服务,当访问不同的Region的时候,需要不同的域名。通过内网和外网访问同一个Region所需要的Endpoint也是不同的。例如杭州Region的外网Endpoint是oss-cn-hangzhou.aliyuncs.com,内网Endpoint是oss-cn-hangzhou-internal.aliyuncs.com。具体的内容请参见各个Region对应的Endpoint。

访问密钥

AccessKey简称AK,指的是访问身份验证中用到的AccessKey ID和AccessKey Secret。OSS通过使用AccessKey ID和AccessKey Secret对称加密的方法来验证某个请求的发送者身份。AccessKey ID用于标识用户AccessKey Secret是用户用于加密签名字符串OSS用来验证签名字符串的密钥,必须保密。对于OSS来说,AccessKey的来源有:

Bucket的拥有者申请的AccessKey。

被Bucket的拥有者通过RAM授权给第三方请求者的AccessKey。

被Bucket的拥有者通过STS授权给第三方请求者的AccessKey。

更多AccessKey介绍请参见创建AccessKey。

原子性和强一致性

Object操作在OSS上具有原子性,操作要么成功要么失败,不存在中间状态的Object。当Object上传完成时,OSS即可保证读到的Object是完整的,OSS不会返回给用户一个部分上传成功的Object。

Object操作在OSS同样具有强一致性,当用户收到了上传(PUT)成功的响应时,该上传的Object进入立即可读状态,并且Object的冗余数据已经写入成功。不存在上传的中间状态,即执行read-after-write,却无法读取到数据。对于删除操作,用户删除指定的Object成功之后,该Object立即不存在。

二、使用步骤

1.封装一个工具类

代码如下(示例):


import com.aliyun.oss.ClientException;
import com.aliyun.oss.OSSClient;
import com.aliyun.oss.OSSException;
import com.aliyun.oss.model.OSSObject;
import com.aliyun.oss.model.ObjectMetadata;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;

import javax.annotation.PostConstruct;
import javax.imageio.ImageIO;
import java.awt.image.BufferedImage;
import java.io.IOException;
import java.io.InputStream;


/**
 * This sample demonstrates how to upload an object by append mode
 * to Aliyun OSS using the OSS SDK for Java.
 */
@Component
public class OssClientUtil {


    @Value("${aliOss.endpoint}")
    private String endpointStr;

    @Value("${aliOss.accessKeyId}")
    private String accessKeyIdStr;

    @Value("${aliOss.accessKeySecret}")
    private String accessKeySecretStr;


    public static String endpoint;
    public static String accessKeyId;
    public static String accessKeySecret;

    @PostConstruct
    public void init(){
        endpoint = endpointStr;
        accessKeyId = accessKeyIdStr;
        accessKeySecret = accessKeySecretStr;
    }


    /**
     * 上传图片到ali-oss
     *
     * @param uploadFileName
     * @param in
     * @return
     */
    public static void uploadImages(String uploadFileName, InputStream in,String bucketName) throws OSSException, ClientException {
        OSSClient ossClient = new OSSClient(endpoint, accessKeyId, accessKeySecret);
        ossClient.putObject(bucketName, uploadFileName, in);
        ossClient.shutdown();
    }


    /**
     * 上传图片到ali-oss
     *
     * @param uploadFileName
     * @param uploadFileNameThumb
     * @param in
     * @param contentType
     * @return
     */
    public static void uploadImages(String uploadFileName, String uploadFileNameThumb, InputStream in, InputStream in_thumb, String contentType, String bucketName) throws OSSException, ClientException {
        OSSClient ossClient = new OSSClient(endpoint, accessKeyId, accessKeySecret);
        ObjectMetadata objectMetadata = new ObjectMetadata();
        objectMetadata.setContentType(contentType);
        ossClient.putObject(bucketName, uploadFileName, in, objectMetadata);
        ossClient.putObject(bucketName, uploadFileNameThumb, in_thumb, objectMetadata);
        ossClient.shutdown();
    }

    /**
     * 上传文件到ali-oss
     *
     * @param uploadFileName
     * @param in
     * @param contentType
     * @return
     */
    public static void uploadFile(String uploadFileName, InputStream in, String contentType, String bucketName) throws OSSException, ClientException {
        OSSClient ossClient = new OSSClient(endpoint, accessKeyId, accessKeySecret);
        ObjectMetadata objectMetadata = new ObjectMetadata();
        objectMetadata.setContentType(contentType);
        ossClient.putObject(bucketName, uploadFileName, in, objectMetadata);
        ossClient.shutdown();
    }

    /**
     * 删除ali-oss文件
     *
     * @param uploadFileName
     * @return
     */
    public static void deleteFile(String uploadFileName, String bucketName) {
        OSSClient ossClient = new OSSClient(endpoint, accessKeyId, accessKeySecret);
        ossClient.deleteObject(bucketName, uploadFileName);
        ossClient.shutdown();
    }


   /**
     * 获取图片格式的对象
     *
     * @param bucketName,objectName
     * @return
     */
    public static BufferedImage getBufferedImage(String bucketName, String objectName) {
        OSSClient ossClient = new OSSClient(endpoint, accessKeyId, accessKeySecret);
        // 获取指定Object的元信息和内容
        OSSObject object = ossClient.getObject(bucketName, objectName);
        InputStream inputStream = object.getObjectContent();
        try {
            BufferedImage image = ImageIO.read(inputStream);
            return image;
        } catch (Exception e) {
            e.printStackTrace();
        }finally {
            try {
                inputStream.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
            // 关闭OSS连接
            ossClient.shutdown();
        }
        return null;
    }



}

总结

先上传图片/文件,等到业务需要使用的时候再获取上传后的图片/文件

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值