使用阿里云 OSS 存储、访问图片(Java)

2020-04-30 00:00:00 阿里 图片 访问

一、阿里云 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/

《使用阿里云 OSS 存储、访问图片(Java)》

 

 

 

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

《使用阿里云 OSS 存储、访问图片(Java)》

 

 

 

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

《使用阿里云 OSS 存储、访问图片(Java)》

 

 

 

《使用阿里云 OSS 存储、访问图片(Java)》

 

 

 

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

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

《使用阿里云 OSS 存储、访问图片(Java)》

 

 

 

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

《使用阿里云 OSS 存储、访问图片(Java)》

 

 

 

4、上传文件

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

《使用阿里云 OSS 存储、访问图片(Java)》

 

 

 

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

《使用阿里云 OSS 存储、访问图片(Java)》

 

 

 

(3)Step3:上传文件。

《使用阿里云 OSS 存储、访问图片(Java)》

 

 

 

5、下载文件

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

《使用阿里云 OSS 存储、访问图片(Java)》

 

 

 

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

《使用阿里云 OSS 存储、访问图片(Java)》

 

 

 

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

(1)删除文件。

《使用阿里云 OSS 存储、访问图片(Java)》

 

 

 

(2)删除存储空间。

《使用阿里云 OSS 存储、访问图片(Java)》

 

 

 

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

1、首先需要创建 Accesskey

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

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

《使用阿里云 OSS 存储、访问图片(Java)》

 

 

 

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

《使用阿里云 OSS 存储、访问图片(Java)》

 

 

 

Step3:选择子用户 Accesskey

《使用阿里云 OSS 存储、访问图片(Java)》

 

 

 

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

《使用阿里云 OSS 存储、访问图片(Java)》

 

 

 

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

《使用阿里云 OSS 存储、访问图片(Java)》

 

 

 

《使用阿里云 OSS 存储、访问图片(Java)》

 

 

 

Step6:修改权限。

《使用阿里云 OSS 存储、访问图片(Java)》

 

 

 

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();
    }

}

《使用阿里云 OSS 存储、访问图片(Java)》

 

 

 

《使用阿里云 OSS 存储、访问图片(Java)》

 

 

 

《使用阿里云 OSS 存储、访问图片(Java)》

 

 

 

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

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

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

《使用阿里云 OSS 存储、访问图片(Java)》

 

 

 

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

《使用阿里云 OSS 存储、访问图片(Java)》

 

 

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);
    }
}

《使用阿里云 OSS 存储、访问图片(Java)》

 

 

(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

《使用阿里云 OSS 存储、访问图片(Java)》

 

 

修改代码 (upload.js)。

《使用阿里云 OSS 存储、访问图片(Java)》

 

 

《使用阿里云 OSS 存储、访问图片(Java)》

 

 

测试(index.html)

《使用阿里云 OSS 存储、访问图片(Java)》

 

 

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

《使用阿里云 OSS 存储、访问图片(Java)》

 

 

《使用阿里云 OSS 存储、访问图片(Java)》

 

 

《使用阿里云 OSS 存储、访问图片(Java)》

 

 

(4)再次测试

《使用阿里云 OSS 存储、访问图片(Java)》

 

 

《使用阿里云 OSS 存储、访问图片(Java)》

 

相关文章