本文是开发工具篇第八讲:阿里云对象存储服务(Object Storage Service,简称 OSS),具有与平台无关的RESTful API接口,您可以在任何应用、任何时间、任何地点存储和访问任意类型的数据,在我们公司用于上传图片,访问图片

文章目录

  • 1、相关概念
  • 2、快速接入
  • 3、常见问题
  • 4、原理分析
  • 5、自助工具
  • 6、OSS使用踩坑 review

1、相关概念

1、存储类型(Storage Class)

  • OSS按数据存储场景从热到冷提供标准、低频访问、归档三种存储类型。其中标准存储类型提供高可靠、高可用、高性能的对象存储服务,能够支持频繁的数据访问;低频访问存储类型适合长期保存不经常访问的数据(平均每月访问频率1到2次);归档存储类型适合需要长期保存(建议半年以上)的归档数据。

2、存储空间(Bucket)

  • 存储空间是用于存储对象(Object)的容器,所有的对象都必须隶属于某个存储空间。可以设置和修改存储空间属性用来控制地域、访问权限、生命周期等,这些属性设置直接作用于该存储空间内所有对象,因此可以通过灵活创建不同的存储空间来完成不同的管理功能。

3、对象/文件(Object)

  • 对象是 OSS 存储数据的基本单元,也被称为OSS的文件。对象由元信息(Object Meta),用户数据(Data)和文件名(Key)组成。对象由存储空间内部唯一的Key来标识。对象元信息是一个键值对,表示了对象的一些属性,比如最后修改时间、大小等信息,同时也可以在元信息中存储一些自定义的信息。

4、地域(Region)

  • 地域表示 OSS 的数据中心所在物理位置。您可以根据费用、请求来源等综合选择数据存储的地域。

5、访问域名(Endpoint)

  • Endpoint 表示OSS对外服务的访问域名。OSS以HTTP RESTful API的形式对外提供服务,当访问不同地域的时候,需要不同的域名。通过内网和外网访问同一个地域所需要的域名也是不同的。

6、访问密钥(AccessKey)

  • AccessKey,简称 AK,指的是访问身份验证中用到的AccessKeyId 和AccessKeySecret。OSS通过使用AccessKeyId 和AccessKeySecret对称加密的方法来验证某个请求的发送者身份。AccessKeyId用于标识用户,AccessKeySecret是用户用于加密签名字符串和OSS用来验证签名字符串的密钥,其中AccessKeySecret 必须保密。

2、快速接入

一、申请业务枚举值
当我们在做业务开发时,在业务场景中需要上传文件,此时可以借助前端公用上传组件进行上传,使用公用上传组件,必须要告诉前端同时文件上传业务枚举值,也即bizCode。 如果是新业务,bizCode需要申请,并说明上传文件读权限【公共读 或 私有读】。 我们如何判断我们要上传的文件应该是私有读还是公共读,业务方自行根据要上传的文件是否具备以下两个特征:

  • 1、待上传文件是否涉及保密性要求高的信息?
  • 2、待上传文件是否只属于上传者所有,其他用户是否有权读取?
    如满足其中之一,均需要使用私有读权限的枚举值。在每次访问私有读文件时,由平台为访问者分配临时文件url进行下载,默认使15分钟有效期。
    通过此步骤,业务开发者已经申请到一个可用的OSS业务枚举值。

二、前端上传
前端可使用由【一、申请业务枚举值】步骤得到的bizCode,利用前端公共上传组件进行上传

三、后端上传 (商品中心并没有这样的场景)
有时候我们上传文件的过程中,可能需要先由后端web服务接收进行业务处理后,再传至OSS,此时我们需要使用后端java文件流方式上传文件至OSS。那么,我们需要使用zcy-ossinner组件来完成。

zcy-ossinner java后端文件流上传下载快速接入教程
随着公司业务需求不断的变更,方便各业务模块快速接入OSS上传文件,现提供统一规范的util工具类给大家。该工具类也会根据各业务不断变化的需求,持续提供新的需求实现。

使用ZOssInnerClientUtil,只需简单三个步骤就可以使用
1、引入pom.xml中jar包依赖

<dependency><groupId>cn.gov.zcy</groupId><artifactId>zcy-ossinner</artifactId><version>2.0.6-RELEASE</version>
</dependency>

2、引入工具依赖的dubbo服务

<!-- Zoss dc Service -->
<dubbo:reference check="false" id="documentCenterPlugService" interface="cn.gov.zcy.dc.plug.service.DocumentCenterPlugService" retries="0" timeout="1500" version="1.0.0"/>

3、在业务代码中引入spring bean

        @Autowiredprivate ZOssInnerClientUtil zossInnerClientUtil;

使用如下 然后就可以像一般的工具类一样使用ZossInnerClient了, Demo如下

package test;
import io.terminus.common.model.Response;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.MediaType;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.ResponseBody;
import javax.servlet.http.HttpServletResponse;
import java.io.*;/*** @Author xxx* @Time 17/6/7.* @Desc 文件上传下载示例*/
@Controller
@RequestMapping(value = "/api/test")
public class TestInnerOssController {@Autowiredprivate ZOssInnerClientUtil zOssInnerClientUtil;@RequestMapping(value = "/upload", method = RequestMethod.GET, produces = MediaType.APPLICATION_JSON_UTF8_VALUE)@ResponseBodypublic Response<String> upload(){InputStream fileInputStream = null;try {File file = new File("/var/tmp/redis-use.png");//本地需要有该文件fileInputStream = new FileInputStream(file);ZossInnerRequest request = new ZossInnerRequest();request.setInputStream(fileInputStream);//文件流request.setBizCode(ZcyOssBusiEnum.Others);//文件所属业务编码request.setSecondBusiPath("test"); //文件上传至OSS二级目录request.setUserId("23007");//用户IDrequest.setDescription("测试内网平台上传文件");//文件描述request.setFileName("redis-use.png");//文件真实名称request.setIsAttachment(true);//是否设置附件标识,设置为true,下载时浏览器将不会预览,直接下载request.setFileType("img/jpg");//文件mimeypereturn zOssInnerClientUtil.putObject(ZcyBucetEnum.DOC_WRITE, request);//说明: ZcyBucetEnum.DOC_WRITE  该枚举值表示文件将要上传到哪个bucket} catch (FileNotFoundException e) {e.printStackTrace();}finally {if(fileInputStream!=null){try {fileInputStream.close();} catch (IOException e) {e.printStackTrace();}}}return Response.ok("正常不应该走到这里哦.赶快排查错误吧");}@RequestMapping(value = "/download", method = RequestMethod.GET, produces = MediaType.APPLICATION_JSON_UTF8_VALUE)@ResponseBodypublic void downloadFile(String fileId, HttpServletResponse response) {response.setContentType("application/force-download");// 设置强制下载不打开response.addHeader("Content-Disposition","attachment;fileName=测试文件.jpg");// 设置文件名byte[] buffer = new byte[1024];//根据文件ID获取到文件流InputStream fis = zOssInnerClientUtil.getOSSObject(ZcyBucetEnum.DOC_WRITE, fileId).getResult().getObjectContent();BufferedInputStream bis = null;try {bis = new BufferedInputStream(fis);OutputStream os = response.getOutputStream();int i = bis.read(buffer);while (i != -1) {os.write(buffer, 0, i);i = bis.read(buffer);}} catch (Exception e) {e.printStackTrace();} finally {if (bis != null) {try {bis.close();} catch (IOException e) {e.printStackTrace();}}if (fis != null) {try {fis.close();} catch (IOException e) {e.printStackTrace();}}}}
}

上传文件返回值:

{"result": "1099OT/99999/d4a5d6c8-d23ebbd-5d8bdca52cbf","success": true,"error": ""
}

返回值说明:

  • success :是否成功标识
  • result: 上传成功,返回文件id
  • error:上传发生错误,返回错误信息

3、常见问题

1、为什么我的文件访问不了? 也即下载不了?

  • 答:首先,需要确定错误信息,如果报错信息如下所示,则说明目标文件是一个空文件,不存在的文件。可能是上传时未成功,或者保存fileId时,fileId弄错了。
<Error><Code>NoSuchKey</Code><Message>The specified key does not exist.</Message><RequestId>5C243BDFD06EF854F514045B</RequestId><HostId>zcy-gov-open-doc.oss-cn-north-2-gov-1.aliyuncs.com</HostId><Key>1014AN/00017b27-0a80-8b93451.jpg</Key>
</Error>
  • 其次,如果文件是存在的,以前能够访问,只是现在访问不了,那么请确认文件的读权限,是属于私有读还是公共读?对于私有读的文件,每次从平台获取到的url是临时url,此临时url有效期是15分钟。 如果你在页面上停留时间过长,此时再点击页面上的文件进行下载,则会报如下错误,说明私有读的文件授权有效期已过,需要刷新页面重新获取授权url。
<Error><Code>AccessDenied</Code><Message>Request has expired.</Message><RequestId>5C243B9D8C697FC71D147551</RequestId><HostId>zcy-gov-doc.oss-cn-north-2-gov-1.aliyuncs.com</HostId><Expires>2018-12-21T07:05:31.000Z</Expires><ServerTime>2018-12-27T02:40:29.000Z</ServerTime>
</Error>
  • 最后,对于新的网站接入使用政采云bucket中的文件,如有访问不到的,可能是CDN或者OSS防盗链拦截所致,请联系运维进行添加refer网站白名单。

2、为什么我的文件上传不了?

  • 答:如果是采用前端上传组件上传不了文件,请先联系前端架构组进行排查,确定是后端接口有问题后,再联系长乐进行排查

3、我司 CDN 加速域名都有哪些?

  • ①.通用CDN域名sitecdn.zcy.gov.cn 使用场景:即使OSS中文件发生变化了,CDN端依然使用改变前已缓存好的文件。
  • ②.有更改则重新拉取文件的CDN域名cdn.zcy.gov.cn,使用场景:对于偶尔会有更新的文件,比如前段公共组件,当OSS端有改变后,CDN会去OSS拉取最新文件进行返回。
  • ③.商品图片域名itemcdn.zcy.gov.cn, 使用场景:专门用于网超商品图片类加速。

4、原理分析

1、名词解释
OSS: 阿里云对象存储服务(Object Storage Service,简称 OSS),是阿里云提供的海量、安全、低成本、高可靠的云存储服务。OSS 适合存放任意类型的文件,您可以通过调用 API,在任何应用、任何时间、任何地点上传和下载数据,也可以通过 Web 管理控制台对数据进行简单的管理。

bucket: 桶,OSS存放文件的容器,文件按照不同使用性质存放在不同的桶,便于管理和分类,同时针对不同的桶,可以设置不同的访问权限。

STS: 阿里云STS (Security Token Service) 是为阿里云账号(或RAM用户)提供短期访问权限管理的云服务,通过STS,您可以为联盟用户(您的本地账号系统所管理的用户)颁发一个自定义时效和访问权限的访问凭证。

公共读: 公共读权限的文件,在公网可以被所有人访问,无需授权,只要知道文件ID即可。例如商品图片:http://zcy-item.img-cn-hangzhou.aliyuncs.com//2017040616575772459633.png

私有读: 私有读权限的文件,需要通过STS授权的临时url才能访问。

文档中心: 为管理政采云各种业务文件的服务,主要提供文件的上传或下载,一般需要经过下面这样的流程

(1).政采云业务平台向文档中心请求授权。

(2).政采云文档中心生成上传下载授权策略。

(3).业务平台通过授权策略,利用SDK直传文件阿里云OSS平台。

3、bucket使用详述
业务解读
文档中心,主要是为管理政采云各种业务文件而服务,目前主要提供文件的上传或下载的,支持批量上传和下载,同时兼容IE8文件上传,开放平台文件上传。

接入文档中心进行文件上传下载之前,务必搞懂以上对bucket,文件访问权限公共读和私有读的理解。

我们根据文件的使用,设置了两大类bucket,公共读和私有读的bucket,公共读的bucket设置了四个bucket,

1.商品图片,量大,使用频率高,独享*-item;

2.平台业务公共读文件,文件不涉及私密性或泄露安全性等问题,可以被公开的文件*-pub-doc;

3.公共读模板文件bucket,zcy-template;

4.用于前端静态资源cdn加速的bucket,zcy-cdn;

⚠️注意:对于私有读性质的文件,我们设置了一个私有读文件的bucket,*-doc.

关于文件按使用性质分类的设计
我们将文件按照公共读或私有读的性质,规划存储在不同的bucket,然后按照文件使用场景和性质,进一步在bucket中细分规划顶级目录。

例如:对于一个私有的,比如是合同附件的文件,我们将首先将其规划到*-doc bucket中,然后为其分配一个业务编码bizeCode枚举值,根据业务编码枚举值,就可以映射到具体的顶级目录下。

关于现有bucket 枚举值,业务编码枚举值的使用,请参考下文:

5、自助工具

待补充

6、OSS使用踩坑 review

1、OSS云岛模式

2、待补充

done

开发工具篇第八讲:阿里云OSS对象存储服务相关推荐

  1. 阿里云OSS——对象存储服务(工具)

    阿里云OSS--对象存储服务(工具) 一.依赖 二.yaml配置 三.OSS工具类 四.demo演示 4.1 SpringBoot启动类 4.2 Controller接口 4.3 swagger测试 ...

  2. 配置阿里云OSS对象存储服务

    配置阿里云OSS对象存储服务 导入阿里云OSS依赖 <dependency><groupId>com.aliyun.oss</groupId><artifac ...

  3. 阿里云OSS(对象存储服务)简介

    最近公司想要使用阿里云OSS来存储精准客流图片,所以提前熟悉一下,做一个记录 注:阿里云官方文档已经很详细的阐述了OSS.以及开发流程,本文大多都是参考官方文档 OSS官方介绍地址:https://h ...

  4. 阿里云OSS对象存储服务上传失败问题之一

    简介: OSS是阿里云提供一个对象存储服务,有着稳定高效的特点,但在操作时有些问题还是必须要注意一下的 今天在进行上传头像的操作时,发生了一个OSS连接时出现的问题,导致头像上传失败,问题的样式如下图 ...

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

    参考文档 : 点击查看 文章目录 运行环境 一.OSS相关概念 1.1 Storage Class 存储类型 1.2 Bucket 存储空间 1.3 Object 对象 1.4 Region 地域 1 ...

  6. 阿里云OSS对象存储服务购买与基础使用指南

    对象存储服务(Object Storage Service,简称OSS),是基于阿里云飞天分布式系统的海量.安全和高可靠的云存储服务.简单来说,OSS就是一个可以上传.下载.分享文件的服务,这一点从实 ...

  7. 阿里云OSS对象存储服务的使用

    使用阿里云对象OSS存储服务 由服务器进行上传 在阿里云官网进行开通OSS对象服务 创建你的Bucket 开启跨域功能 创建秘钥且添加权限以及服务器端配置 代码 由客户端进行上传(服务器Base64加 ...

  8. ossfs挂载百度对象存储_Linux利用OSSFS工具挂载阿里云OSS对象存储

    在前面的文章中,我们了解了腾讯云的COS对象存储的挂载,这次我们来了解阿里云OSS对象存储的挂载以及两者的优缺点. 同腾讯云的CVM和COS一样,阿里云的OSS不仅可以挂载在自己的ECS上,也可以挂载 ...

  9. Java使用阿里云OSS对象存储上传图片

    示例说明   该案例是OSS Java SDK的示例程序,您可以修改endpoint.accessKeyId.accessKeySecret.bucketName后直接运行. 本示例中的并不包括OSS ...

最新文章

  1. [BZOJ2653]middle
  2. ios在textview禁用tab的代码
  3. LeetCode 17. Letter Combinations of a Phone Number
  4. 题目11 数值的整数次方
  5. linux环境下创建postgis数据库,linux下搭建postgresql、postgis、pg_pathman环境步骤详解...
  6. POI EXCEL读取 性能问题
  7. java swing 选项卡_java – 如何通过单击按钮在jTabbedPane中切换选项卡?
  8. 动态参数 maven_Spring Security 动态url权限控制(三)
  9. jdbc心得-2-数据库与java相结合
  10. 软件项目管理流程总结
  11. Visual Studio 2022配置GAMP出现 LNK2019无法解析外部符号_imp_timeGetTime@0
  12. Linux磁盘ext3变成ext4,从Ext3迁移到Ext4
  13. MySQL安装配置教程(超详细!)
  14. 小学生计算机教室注意事项,小学生安全注意事项
  15. 微软C++团队将出席ACCU 2021
  16. matlab股票分析系统,matlab股票预测系统,matlab股票决策
  17. 关于「付费合集」的说明
  18. SAP中供应商寄售库存返回操作实例
  19. 邮政平邮批量查询未签收物流的方法
  20. PXE安装Centos65 postfix+exmail+mysql实现基于 虚拟用户的web邮件系统

热门文章

  1. Flutter入门进阶之旅(十二)Flutter 数据存储
  2. 魔兽世界盗贼开锁技能哪练_百度知道
  3. ANSYS和Nastran单元对应关系
  4. 基于对WalkGIS 的地形数据建库处理模式的探讨 来自建筑工程与设计 2015(15)
  5. 这样掌控财务状况 让你牛年变牛
  6. 小米游戏本安装linux_redhat7系统
  7. Google Play发布应用注意事项
  8. 怎样将自己的工程上传到Github作为依赖供他人使用
  9. Qt 崩溃 corrupted double-linked list Aborted
  10. 运用java--模拟实现保皇发牌功能