累成一条狗

使用阿里云 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)再次测试

 

 

 

posted on 2020-04-29 21:45  累成一条狗  阅读(26354)  评论(2编辑  收藏  举报

导航