阿里云OSS | 对象存储服务快速入门 | 参考官方文档实现使用JavaSDK上传文件 | 本地上传与web上传案例

参考文档 : 点击查看

文章目录

  • 运行环境
  • 一、OSS相关概念
    • 1.1 Storage Class 存储类型
    • 1.2 Bucket 存储空间
    • 1.3 Object 对象
    • 1.4 Region 地域
    • 1.5 Endpoint 访问域名
    • 1.6 AccessKet 访问密钥
  • 二、使用阿里云OSS服务
    • 2.1 开通OSS服务
    • 2.2 创建 Bucket(存储空间)
    • 2.3 在网页上传文件
    • 2.4 创建用户,生成AccesskeyID与Secret
    • 2.5 为用户添加读权限
  • 三、使用JavaSDK操作OSS
    • 3.1 操作一:测试连接
    • 3.2 操作二:本地上传文件
    • 3.3 操作三:在Web项目里实现OSS上传
      • 设置CORS解决跨域问题

运行环境


  • Chrome
  • JDK8
  • IDEA 2021.3 旗舰版
  • Visual Status Code 2022 带 Live Server插件(可快速解析Web的HTML、CSS、JavaScript)

一、OSS相关概念


官方文档:点击查看

OSS 全称 Object Storage Service,即对象存储服务,是由阿里云提供的海量、安全、低成本、高可靠的云存储服务。

OSS具有与平台无关的RESTful API接口,可在任意应用、任意地点存储与访问任何类型的数据。网站的图片、视频等文件就可以存放在OSS中(海量数据,交给阿里云平台维护,安全可靠)

1.1 Storage Class 存储类型

有标准、低频访问、归档、冷归档四种存储类型,价格依次递减

  • 标准:高持久、高可哦那个、高性能,支持频繁的数据访问

  • 低频访问:适合长期保存不经常访问的数据(平均每月1-2次频率)

  • 归档:适合需长期保存(建议半年以上)的数据

  • 冷归档:适合超长事件存放的极冷数据

1.2 Bucket 存储空间

存储空间是用于存储对象(Object)的容器。

具有各种配置属性,包括地域、访问权限、存储类型等。

1.3 Object 对象

OSS存储数据的基本单元,同时被称作OSS的文件。

Object 由Object Meta、Data和Key组成,即元信息、用户数据和文件名。

Object 由 Bucket内部唯一的Key来表示

Object Meta 元信息是一组键值对,表示了Object的一些属性,比如最后修改时间、大小等信息,同时也可以自定义信息。

1.4 Region 地域

OSS的数据中心所在物理位置,在创建Bucket时徐选择合适的地域。

1.5 Endpoint 访问域名

OSS对外服务的访问域名,通过域名存储、获取对象。

1.6 AccessKet 访问密钥

AccessKey 简称AK,指访问身份验证中用到的AK ID 和 AK Secret,前者用于标识用户,后者表示该用户的密钥。

二、使用阿里云OSS服务


2.1 开通OSS服务

访问阿里云官网:https://oss.console.aliyun.com/

注册账号(过程略)后搜索OSS对象存储服务,点击立即开通

阿里云OSS | 对象存储服务快速入门 | 参考官方文档实现使用JavaSDK上传文件 | 本地上传与web上传案例_第1张图片

2.2 创建 Bucket(存储空间)

在OSS管理页面中创建存储空间(Bucket)

阿里云OSS | 对象存储服务快速入门 | 参考官方文档实现使用JavaSDK上传文件 | 本地上传与web上传案例_第2张图片

按照自己的需求进行设置

2.3 在网页上传文件

用途一:手动上传文件

阿里云OSS | 对象存储服务快速入门 | 参考官方文档实现使用JavaSDK上传文件 | 本地上传与web上传案例_第3张图片

阿里云OSS | 对象存储服务快速入门 | 参考官方文档实现使用JavaSDK上传文件 | 本地上传与web上传案例_第4张图片

点击详情可直接下载文件或者复制文件的URL
阿里云OSS | 对象存储服务快速入门 | 参考官方文档实现使用JavaSDK上传文件 | 本地上传与web上传案例_第5张图片

2.4 创建用户,生成AccesskeyID与Secret

AccessKey就相当于一个账号和密码,可以视为小号,这里主要用于访问之前创建的存储空间。

将鼠标移至阿里云网站右上角的头像,选择访问控制,

阿里云OSS | 对象存储服务快速入门 | 参考官方文档实现使用JavaSDK上传文件 | 本地上传与web上传案例_第6张图片

第二步,点击创建用户

阿里云OSS | 对象存储服务快速入门 | 参考官方文档实现使用JavaSDK上传文件 | 本地上传与web上传案例_第7张图片

第三步,设置登录名称和显示名称后,选中Open API 调用访问选择框

阿里云OSS | 对象存储服务快速入门 | 参考官方文档实现使用JavaSDK上传文件 | 本地上传与web上传案例_第8张图片

第四步,创建用户成功,自动生成了AccessKey对应的ID和Secret
阿里云OSS | 对象存储服务快速入门 | 参考官方文档实现使用JavaSDK上传文件 | 本地上传与web上传案例_第9张图片

2.5 为用户添加读权限

第一步,选中当前的用户,点击添加权限
阿里云OSS | 对象存储服务快速入门 | 参考官方文档实现使用JavaSDK上传文件 | 本地上传与web上传案例_第10张图片

第二步,根据需要添加权限,比如管理OSS权限还有只读OSS的权限

阿里云OSS | 对象存储服务快速入门 | 参考官方文档实现使用JavaSDK上传文件 | 本地上传与web上传案例_第11张图片

三、使用JavaSDK操作OSS


3.1 操作一:测试连接

官方文档:点击查看

第一步,Maven引入依赖

pom.xml

<dependency>
    <groupId>com.aliyun.ossgroupId>
    <artifactId>aliyun-sdk-ossartifactId>
    <version>3.13.2version>
dependency>

第二步,编写Java代码,(其他地域的访问映射 点击访问)

package com.uni;

import com.aliyun.oss.ClientException;
import com.aliyun.oss.OSS;
import com.aliyun.oss.OSSClientBuilder;
import com.aliyun.oss.OSSException;

public class testOSS {

    public static void main(String[] args) throws Exception {
        // Endpoint以华东1(杭州)为例,其它Region请按实际情况填写。关于其他Region对应的Endpoint信息,请参见访问域名和数据中心。
        String endpoint = "https://oss-cn-hangzhou.aliyuncs.com";
        // 阿里云账号AccessKey拥有所有API的访问权限,风险很高。强烈建议您创建并使用RAM用户进行API访问或日常运维,请登录RAM控制台创建RAM用户。
        String accessKeyId = "创建用户时生成的Bucket ID";
        String accessKeySecret = "创建用于时生成的Bucket Secret";
        String bucketName = "创建的用户";

        // 创建OSSClient实例。
        OSS ossClient = new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret);

        try {
            // 创建存储空间。
            ossClient.createBucket(bucketName);

        } catch (OSSException oe) {
            System.out.println("Caught an OSSException, which means your request made it to OSS, "
                    + "but was rejected with an error response for some reason.");
            System.out.println("Error Message:" + oe.getErrorMessage());
            System.out.println("Error Code:" + oe.getErrorCode());
            System.out.println("Request ID:" + oe.getRequestId());
            System.out.println("Host ID:" + oe.getHostId());
        } catch (ClientException ce) {
            System.out.println("Caught an ClientException, which means the client encountered "
                    + "a serious internal problem while trying to communicate with OSS, "
                    + "such as not being able to access the network.");
            System.out.println("Error Message:" + ce.getMessage());
        } finally {
            if (ossClient != null) {
                ossClient.shutdown();
            }
        }
    }
}

执行结果:
阿里云OSS | 对象存储服务快速入门 | 参考官方文档实现使用JavaSDK上传文件 | 本地上传与web上传案例_第12张图片
至此,OSS与Java连接成功。

3.2 操作二:本地上传文件

参考官方文档:点击查看

第一步,导入Maven依赖(和之前一样)

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

官方服务端下载地址:(用于参考)点击下载
阿里云OSS | 对象存储服务快速入门 | 参考官方文档实现使用JavaSDK上传文件 | 本地上传与web上传案例_第13张图片

第二步,参考官方提供的代码,编写JavaWeb上传文件的Java代码

package com.uni;

import com.aliyun.oss.ClientException;
import com.aliyun.oss.OSS;
import com.aliyun.oss.OSSClientBuilder;
import com.aliyun.oss.OSSException;
import com.aliyun.oss.model.PutObjectRequest;

import java.io.File;

public class testOSS {

    public static void main(String[] args) throws Exception {
        // Endpoint以华东1(杭州)为例,其它Region请按实际情况填写。
        String endpoint = "https://oss-cn-hangzhou.aliyuncs.com";
        // 阿里云账号AccessKey拥有所有API的访问权限,风险很高。强烈建议您创建并使用RAM用户进行API访问或日常运维,请登录RAM控制台创建RAM用户。
        String accessKeyId = "你的Bucket ID";
        String accessKeySecret = "你的 Bucket Secret";
        // 填写Bucket名称,例如examplebucket。
        String bucketName = "unirithe";
        // 填写Object完整路径,例如exampledir/exampleobject.txt。Object完整路径中不能包含Bucket名称。
        String objectName = "pom.xml";
        // 填写本地文件的完整路径,例如D:\\localpath\\examplefile.txt。
        // 如果未指定本地路径,则默认从示例程序所属项目对应本地路径中上传文件。
        String filePath= "D:\\pom.xml";

        // 创建OSSClient实例。
        OSS ossClient = new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret);

        try {
            // 创建PutObjectRequest对象。
            PutObjectRequest putObjectRequest = new PutObjectRequest(bucketName, objectName, new File(filePath));
            // 如果需要上传时设置存储类型和访问权限,请参考以下示例代码。
            // ObjectMetadata metadata = new ObjectMetadata();
            // metadata.setHeader(OSSHeaders.OSS_STORAGE_CLASS, StorageClass.Standard.toString());
            // metadata.setObjectAcl(CannedAccessControlList.Private);
            // putObjectRequest.setMetadata(metadata);

            // 上传文件。
            ossClient.putObject(putObjectRequest);
        } catch (OSSException oe) {
            System.out.println("Caught an OSSException, which means your request made it to OSS, "
                    + "but was rejected with an error response for some reason.");
            System.out.println("Error Message:" + oe.getErrorMessage());
            System.out.println("Error Code:" + oe.getErrorCode());
            System.out.println("Request ID:" + oe.getRequestId());
            System.out.println("Host ID:" + oe.getHostId());
        } catch (ClientException ce) {
            System.out.println("Caught an ClientException, which means the client encountered "
                    + "a serious internal problem while trying to communicate with OSS, "
                    + "such as not being able to access the network.");
            System.out.println("Error Message:" + ce.getMessage());
        } finally {
            if (ossClient != null) {
                ossClient.shutdown();
            }
        }
    }
}

阿里云OSS | 对象存储服务快速入门 | 参考官方文档实现使用JavaSDK上传文件 | 本地上传与web上传案例_第14张图片

3.3 操作三:在Web项目里实现OSS上传

本次案例采取直接在后端传输文件到OSS,还有一种方法是从后端发送签名到前端,由前端进行发送,后者效率更高,这里没有继续深入,暂时用后端实现简单的上传。

由于函数回调需要用到公网IP,这里就不测试了。

官方参考文档:点击查看

第一步,导入SDK Maven依赖(Web相关的依赖这里忽略了,请自行添加)
pom.xml

<dependency>
    <groupId>com.aliyun.ossgroupId>
    <artifactId>aliyun-sdk-ossartifactId>
    <version>3.13.2version>
dependency>

第二步,编写Controller层代码

package com.uni.controller;

import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.aliyun.oss.OSS;
import com.aliyun.oss.OSSClient;
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 org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RestController;

import javax.servlet.http.HttpServletResponse;
import java.nio.charset.StandardCharsets;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.*;

@RestController
public class OssController {
    @GetMapping("/oss/test")
    public String testOss(){
        String accessId = "待填写"; // 请填写您的AccessKeyId。
        String accessKey = "待填写"; // 请填写您的AccessKeySecret。
        String endpoint = "待填写"; // 请填写您的 endpoint,比如杭州oss-cn-hangzhou.aliyuncs.com。
        String bucket = "待填写"; // 请填写您的 bucketname 。
        String host = "https://" + bucket + "." + endpoint; // host的格式为 bucketname.endpoint
        // jasonCallback 上传回调服务器的URL,请将下面的IP和Port配置为您自己的真实信息。
//        String callbackUrl = "http://localhost:8080/oss/test";
        String dir = DateTimeFormatter.ofPattern("yyyy-MM-dd-").format(LocalDateTime.now()) + "/"; // 用户上传文件时指定的前缀。

        Map<String, String> respMap = new LinkedHashMap<String, String>();
        JSONObject jasonCallback = new JSONObject();

        // 创建OSSClient实例
        OSS client = new OSSClientBuilder().build(endpoint, accessId, accessKey);
        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 = client.generatePostPolicy(expiration, policyConds);
            byte[] binaryData = postPolicy.getBytes(StandardCharsets.UTF_8);
            String encodedPolicy = BinaryUtil.toBase64String(binaryData);
            String postSignature = client.calculatePostSignature(postPolicy);

            System.out.println("policy:" + Arrays.toString(binaryData));
            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));

//            jasonCallback.put("callbackUrl", callbackUrl);
//            jasonCallback.put("callbackBody",
//                    "filename=${object}&size=${size}&mimeType=${mimeType}&height=${imageInfo.height}&width=${imageInfo.width}");
//            jasonCallback.put("callbackBodyType", "application/x-www-form-urlencoded");
//            String base64CallbackBody = BinaryUtil.toBase64String(jasonCallback.toString().getBytes());
//            respMap.put("callback", base64CallbackBody);
//            response.setHeader("Access-Control-Allow-Origin", "*");
//            response.setHeader("Access-Control-Allow-Methods", "POST");
        } catch (Exception e) {
            System.out.println(e.getMessage());
        }
        return JSON.toJSONString(new HashMap<String, Object>(){{
            put("Code", 1);
            put("Status", "success");
            put("items" ,respMap);
//            put("jasonCallback", jasonCallback);
        }});
    }
}

第三步,下载客户端进行回调测试

官方下载地址:点击下载
阿里云OSS | 对象存储服务快速入门 | 参考官方文档实现使用JavaSDK上传文件 | 本地上传与web上传案例_第15张图片

选择本地文件,点击开始上传,出现跨域错误
阿里云OSS | 对象存储服务快速入门 | 参考官方文档实现使用JavaSDK上传文件 | 本地上传与web上传案例_第16张图片

设置CORS解决跨域问题

OSS 修改 CORS,解决跨域问题

根据自身需要设置跨域规则

再次访问前端项目,上传成功!

你可能感兴趣的:(笔记,阿里云)