zoukankan      html  css  js  c++  java
  • 使用阿里云 OSS 存储、访问图片(Java)

    一、阿里云 OSS

    1、什么是阿里云 OSS?

      OSS 为 Object Storage Service,即对象存储服务。是阿里云提供的海量、安全、低成本、高可靠的云存储服务。
      OSS 具有与平台无关的 RESTful API 接口,可以在任意应用、任意时间、任意地点 存储与访问 任何类型的数据。
     简单地理解:OSS 基于网络提供数据存储服务,通过网络可以随时存储、获取 文本、图片、音频、视频等 非结构化数据。
     比如网站的 图片、视频等文件就可以存放在 OSS 中(海量数据,自己维护起来麻烦,交给其他人去维护),每次从 OSS 中获取即可。

    【官方文档:】
        https://help.aliyun.com/document_detail/31817.html

    2、基本概念认识

      简单介绍几个概念,混个眼熟(详情可参考官方文档)。
    (1)存储类型(Storage Class)
      存储类型分为:标准、低频访问、归档。价格依次下降。
        标准存储:高可靠、高可用、高性能,用于保存频繁访问的数据。
        低频访问存储:用于保存不常被访问的数据。
        归档存储:用于保存需要长期保存的数据。

    (2)存储空间(Bucket)
      用于存储对象(Object)的容器,不同的存储空间可以存储不同的数据。
      存储空间可以定义 地域、访问权限、存储类型等操作。

    (3)对象/文件(Object)
      对象是 OSS 存储的基本单位,由元信息(Object Meta)、数据(Data)、文件名(key)组成。

      其中:
        key 用来标识对象。
        Object Meta 用来保存对象的属性,比如最后修改时间、大小等。
        Data 就是需要保存的数据了,比如图片、视频等。

    (4)地域(Region)
      表示 OSS 存储的物理位置,需要选择合适的地域创建 OSS。

    (5)访问域名(EndPoint)
      表示 OSS 对外服务的访问域名,通过域名去存储、获取对象。

    (6)访问密钥(AccessKey)
      用于身份验证。常用 AccessKeyId 和 AccessKeySecret 验证身份。
      AccessKeyId 用于标识某个用户。
      AccessKeySecret 用户的密钥。

    二、阿里云 OSS 基本使用?

    1、快速使用?

    (1)如何使用?
      Step1:开通 OSS 服务。
      Step2:创建一个 存储空间(bucket)。
      Step3:上传文件。
      Step4:下载文件。
      Step5:删除文件。
      Step6;删除存储空间。

    (2)如何管理?
      可以使用命令行管理工具管理(ossutil)。
      可以使用图形界面工具管理(ossbrowser)。
      可以使用 API 、SDK 管理。(比如 Java SDK)。

    【API 与 SDK 区别:】
        API:Application Programming Interface,即应用程序接口。
        SDK:Software Development Kit,即软件开发工具包。
    
    简单的理解:
        API 用于访问一个函数。
        SDK 是第三方提供的工具包,里面有各种函数,即各种 API。

    2、开通 OSS 服务

    (1)Step1:去官网开通(先注册一个阿里云账号,再去开通 对象存储 OSS 服务)。

    【官网地址:】
        https://www.aliyun.com/

    (2)Step2:勾选协议,并点击开通。

    (3)Step3:开通成功,跳转到控制台。

    3、创建一个 存储空间(bucket)

    (1)Step1:在控制台界面创建一个存储空间。

    (2)Step2:填写 存储空间相关信息。

    4、上传文件

    (1)Step1:进入文件管理页面。


    (2)Step2:可以新建目录、上传文件。

    (3)Step3:上传文件。

    5、下载文件

    (1)Step1:打开文件详情页,或直接打开更多菜单栏直接下载。

    (2)Step2:直接下载,或者复制 URL下载。

    6、删除文件、删除存储空间

    (1)删除文件。

    (2)删除存储空间。

    三、使用 Java SDK 操作 OSS(重点)

    1、首先需要创建 Accesskey

    (1)为什么使用AccessKey ?
      AccessKey 就相当于一个账号和密码,但其使用场景不同,其等同于一个子账号。
    比如:
      你需要一个账号用来登陆 阿里云,此时的用户名、密码可用于访问 OSS,但是如果你在程序中使用这个账号去管理 OSS,那么容易造成你的账号泄露,不安全。
      AccessKey 就相当于一个子账号,其专门用来访问 OSS或者其他服务,不能用于登陆阿里云,这样就可以避免阿里云账号泄露。

    (2)创建 Accesskey
    Step1:进入控制台

    Step2:点击头像,选择 Accesskey 管理。

    Step3:选择子用户 Accesskey

    Step4:进入 RAM 访问控制后,选择用户,创建用户。

    Step5:填写相关信息,需要验证手机号。

    Step6:修改权限。

    2、使用 Java SDK 访问 OSS(比如上传文件)

    【参考文档操作:】
        https://help.aliyun.com/document_detail/32008.html?spm=a2c4g.11186623.6.767.6fafc06dbZUvg7

    (1)创建一个 SpringBoot 项目,采用 maven 方式引入 SDK。

    <dependency>
        <groupId>com.aliyun.oss</groupId>
        <artifactId>aliyun-sdk-oss</artifactId>
        <version>3.8.0</version>
    </dependency>

    (2)使用文件流方式上传图片。
      此处未与前端代码结合,直接使用本地指定文件的方式进行测试。

    import com.aliyun.oss.OSS;
    import com.aliyun.oss.OSSClientBuilder;
    import org.junit.jupiter.api.Test;
    import org.springframework.boot.test.context.SpringBootTest;
    
    import java.io.FileInputStream;
    import java.io.FileNotFoundException;
    import java.io.InputStream;
    
    @SpringBootTest
    class TestOssApplicationTests {
    
        @Test
        void testUpdateOss() {
            // Endpoint以杭州为例,其它Region请按实际情况填写。
            String endpoint = "http://oss-cn-hangzhou.aliyuncs.com";
            // 云账号AccessKey有所有API访问权限,建议遵循阿里云安全最佳实践,创建并使用RAM子账号进行API访问或日常运维,请登录 https://ram.console.aliyun.com 创建。
            String accessKeyId = "LTAI4GFaU9tbzYLLDBY2Nyvr";
            String accessKeySecret = "ynSYOKMnRFWd79u9t6VDNJrbrXNtgQ";
    
            // 创建OSSClient实例。
            OSS ossClient = new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret);
    
            // 上传文件流。
            InputStream inputStream = null;
            try {
                inputStream = new FileInputStream("E:\myProject\test\images\2.jpg");
            } catch (FileNotFoundException e) {
                e.printStackTrace();
            }
            ossClient.putObject("test-oss-2020-4-29", "2020-4-29-test-2.jpg", inputStream);
    
            // 关闭OSSClient。
            ossClient.shutdown();
        }
    
    }

    3、Web 端上传数据到 OSS 的方式

    【参考文档地址:】
        https://help.aliyun.com/document_detail/112718.html?spm=a2c4g.11186623.6.1523.572c6e28rWmm2T

    (1)普通方式上传文件
      前端将数据 传输到 后台服务器,再由服务器向 OSS 中传输。
      中间经过了 我们自己的 后台服务器 进行中转,增大了后端服务器的压力、且上传速度慢。

    (2)服务端签名后直传文件
      前端可以直接传输文件到 OSS。
      前端向服务器请求一个签名,服务器返回签名,前端直接传输数据到 OSS(通过签名校验)。

    4、如何操作服务端签名后直传?

    【官方文档地址:】
        https://help.aliyun.com/document_detail/91868.html?spm=a2c4g.11186623.2.15.21e26e28JVnnHT#concept-ahk-rfz-2fb

    (1)Step1:
      提供一个 Controller,用于响应 前端发来的签名请求。
    注意:
      若出现跨域问题,可以在业务方法前,添加上 @CrossOrigin 注解。

    package com.lyh.template.springboot_template.controller;
    
    import com.aliyun.oss.OSS;
    import com.aliyun.oss.OSSClientBuilder;
    import com.aliyun.oss.common.utils.BinaryUtil;
    import com.aliyun.oss.model.MatchMode;
    import com.aliyun.oss.model.PolicyConditions;
    import com.lyh.template.springboot_template.common.util.Result;
    import org.springframework.web.bind.annotation.CrossOrigin;
    import org.springframework.web.bind.annotation.RequestMapping;
    import org.springframework.web.bind.annotation.RestController;
    
    import java.sql.Date;
    import java.time.LocalDateTime;
    import java.time.format.DateTimeFormatter;
    import java.util.LinkedHashMap;
    import java.util.Map;
    
    
    @RestController
    public class PolicyController{
    
        @CrossOrigin
        @RequestMapping("/oss/policy")
        public Result policy() {
            String accessId = "LTAI4GFaU9tbzYLLDBY2Nyvr"; // 请填写您的AccessKeyId。
            String accessKey = "ynSYOKMnRFWd79u9t6VDNJrbrXNtgQ"; // 请填写您的AccessKeySecret。
            String endpoint = "oss-cn-hangzhou.aliyuncs.com"; // 请填写您的 endpoint。
            String bucket = "test-oss-2020-4-29"; // 请填写您的 bucketname 。
            String host = "https://" + bucket + "." + endpoint; // host的格式为 bucketname.endpoint
            // callbackUrl为 上传回调服务器的URL,请将下面的IP和Port配置为您自己的真实信息。
            // String callbackUrl = "http://88.88.88.88:8888";
            String dir = DateTimeFormatter.ofPattern("yyyy年MM月dd日").format(LocalDateTime.now()) + "/"; // 用户上传文件时指定的前缀。
    
            // 创建OSSClient实例。
            OSS ossClient = new OSSClientBuilder().build(endpoint, accessId, accessKey);
            Map<String, String> respMap = new LinkedHashMap<String, String>();
            try {
                long expireTime = 30;
                long expireEndTime = System.currentTimeMillis() + expireTime * 1000;
                Date expiration = new Date(expireEndTime);
                PolicyConditions policyConds = new PolicyConditions();
                policyConds.addConditionItem(PolicyConditions.COND_CONTENT_LENGTH_RANGE, 0, 1048576000);
                policyConds.addConditionItem(MatchMode.StartWith, PolicyConditions.COND_KEY, dir);
    
                String postPolicy = ossClient.generatePostPolicy(expiration, policyConds);
                byte[] binaryData = postPolicy.getBytes("utf-8");
                String encodedPolicy = BinaryUtil.toBase64String(binaryData);
                String postSignature = ossClient.calculatePostSignature(postPolicy);
    
                respMap.put("accessid", accessId);
                respMap.put("policy", encodedPolicy);
                respMap.put("signature", postSignature);
                respMap.put("dir", dir);
                respMap.put("host", host);
                respMap.put("expire", String.valueOf(expireEndTime / 1000));
            } catch (Exception e) {
                System.out.println(e.getMessage());
            }
            return Result.ok().data("items", respMap);
        }
    }

    (2)Step2:
      使用 文档上 提供的前端测试代码,修改并测试。

    【代码地址:】
        http://docs-aliyun.cn-hangzhou.oss.aliyun-inc.com/assets/attach/86983/APP_zh/1537971352825/aliyun-oss-appserver-js-master.zip?spm=a2c4g.11186623.2.15.22ae4c07OsJgbj&file=aliyun-oss-appserver-js-master.zip

    修改代码 (upload.js)。

    测试(index.html)

    (3)OSS 修改 CORS,解决跨域问题。

    (4)再次测试

  • 相关阅读:
    What Apache ZooKeeper is and when should it be used?
    基于Apache Curator框架的ZooKeeper使用详解
    Curator典型应用场景之Master选举
    Curator典型应用场景之事件监听
    Curator典型应用场景之分布式锁
    Zookeeper原生Java API、ZKClient和Apache Curator 区别对比
    IntelliJ IDEA oneline function formatting
    Converting a List to String in Java
    UNIAPP 微信小程序做H5 PDF预览
    Git 常用命令,持续更新
  • 原文地址:https://www.cnblogs.com/l-y-h/p/12805028.html
Copyright © 2011-2022 走看看