使用阿里云 OSS 存储、访问图片(Java) 您所在的位置:网站首页 oss是什么软件系统 使用阿里云 OSS 存储、访问图片(Java)

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

2023-07-22 03:33| 来源: 网络整理| 查看: 265

一、阿里云 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)创建 AccesskeyStep1:进入控制台

 

 

 

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。

com.aliyun.oss aliyun-sdk-oss 3.8.0

 

(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 respMap = new LinkedHashMap(); 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)再次测试

 

 

 



【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有