OBS Browser+、obsutil以及OBS SDK都支持在下载对象时进行一致性校验,您可以根 据自己的业务选择任意一种方式进行校验,本文就几种方式如何使用一致性校验进行
obsutil stat obs://test-bucket/test.txt
● 返回的对象基本信息中,包含MD5信息,如下图所示,执行步骤2。
● 不包含MD5信息,下载对象时无法进行一致性校验。
步骤2 执行以下命令,下载对象。
obsutil cp obs://mytestbucket/test.txt D:\test.txt -vmd5
● 对象下载成功且通过一致性校验,回显信息如下:
● 如果桶中对象没有MD5值,对象能够下载成功,但不会校验一致性,回显信息如 下:
----结束
使用 OBS Browser 校验下载对象的一致性
OBS Browser+默认关闭MD5校验,在OBS Browser+上启用MD5校验一致性并下载对 象的步骤如下:
步骤1 登录OBS Browser+。
步骤2 单击客户端右上方的 ,并选择“高级设置”。
步骤3 勾选“MD5校验”,如图9-4所示。
最佳实践 9 OBS 数据一致性校验
图9-4 配置 MD5 校验
步骤4 单击“确定”。
步骤5 选择待下载文件的桶,下载文件。
● 若MD5校验成功,则文件下载成功。
● 若MD5校验失败,则文件下载失败,且在任务管理中提示失败原因:校验文件 MD5失败。
----结束
使用 OBS SDK 校验下载对象的一致性
OBS SDK对待下载对象的自定义元数据中的MD5值和下载到本地的对象的MD5值进行 对比,通过对比结果判断下载对象的一致性。
此处以使用OBS Java SDK下载mytestbucket桶中一个名为test.txt的文本文件为例,下 载过程使用MD5值校验数据一致性的示例代码如下:
String endPoint = "https://your-endpoint";
String ak = "*** Provide your Access Key ***";
String sk = "*** Provide your Secret Key ***";
// 创建ObsClient实例
final ObsClient obsClient = new ObsClient(ak, sk, endPoint);
// 获取对象的MD5值
ObjectMetadata metadata = obsClient.getObjectMetadata("mytestbucket", "test.txt");
String md5Origin = metadata.getUserMetadata("contentMd5");
// 计算下载后对象的MD5值
Obsobject obsobject = obsClient.getObject("mytestbucket", "test.txt");
String md5Download = obsClient.base64Md5(obsobject.getObjectContent());
// 对比MD5值
if(md5Origin.contentEquals(md5Download))
System.out.println("Object MD5 validation passes!\n");
else System.out.println("Object MD5 validation failed!\n");
说明
在以上示例代码中,获取对象MD5值时的contentMd5是在上传时设置的自定义元数据,实际开 发中需要根据自定义的元数据名称修改。
10 性能优化最佳实践
OBS按照对象名的UTF-8编码范围来进行分区管理,对系统进行水平扩展与动态负载均 衡。如果用户在对象命名规则上使用了顺序前缀(如时间戳或字母顺序),可能导致 大量对象的请求访问集中于某个特定分区,造成访问热点。热点分区上的请求速率受 限,访问时延上升。
推荐使用随机前缀对象名,这样请求就会均匀分布在多个分区,达到水平扩展的效 果。
示例:
比如典型的日志归档场景,可能上传的对象名都是如下形式:
yourbucket/obslog/20190610-01.log.tar.gz yourbucket/obslog/20190610-02.log.tar.gz yourbucket/obslog/20190610-03.log.tar.gz yourbucket/obslog/20190610-04.log.tar.gz ...yourbucket/obslog/20190611-01.log.tar.gz yourbucket/obslog/20190611-02.log.tar.gz yourbucket/obslog/20190611-03.log.tar.gz yourbucket/obslog/20190611-04.log.tar.gz
建议为对象名添加3位以上16进制哈希前缀:
yourbucket/6ac-obslog/20140610-01.log.tar.gz yourbucket/b42-obslog/20140610-02.log.tar.gz yourbucket/17f-obslog/20140610-03.log.tar.gz yourbucket/ac9-obslog/20140610-04.log.tar.gz ...yourbucket/95d-obslog/20140611-01.log.tar.gz yourbucket/4a5-obslog/20140611-02.log.tar.gz yourbucket/ea2-obslog/20140611-03.log.tar.gz yourbucket/ba3-obslog/20140611-04.log.tar.gz
最佳实践 10 性能优化最佳实践
11 将 WordPress 远程附件存储到 OBS
背景信息
WordPress是一个基于PHP语言和MySQL数据库开发的博客平台,并逐步演化成一款 内容管理系统软件,具有广泛的应用场景。
本文介绍如何通过插件,将WordPress远程附件存储到华为云OBS。OBS提供海量、稳 定、安全的云存储能力,无需事先规划存储容量,存储资源可线性无限扩展。
插件支持的功能如下:
● 支持自定义附件在桶的存储位置。
● 支持OBS图片处理特性。
● 支持在WordPress后台编辑图片。
● 支持OBS图片处理采用样式请求功能。
● 支持WordPress4.4+在不同分辨率设备上加载不同大小图片。
前提条件
● 已搭建好WordPress,下载及搭建请参考WordPress官网。
● 已创建OBS桶,并确保帐号具有OBS桶的上传权限,准备好帐号对应的AK/SK。
● 已安装PHP 5.6或以上版本。
● 已经下载插件zip包,并将其解压上传至WordPress安装目录的“/wp-content/
plugins/”目录中。
下载链接:release
操作步骤
步骤1 打开WordPress,安装插件。
1. 选择左侧导航栏“插件”页签,进入“插件”页面。
2. 单击“安装插件”,选择上传本地的插件zip文件。
上传完成后,可以插件列表中看到已上传的插件。
步骤2 选择左侧导航栏“设置”页签。
进入“华为云OBS设置”页面,设置插件的使用参数。
配置项 参数设置
AccessKey 用户访问密钥中的AK。
AccessKeySecret 用户访问密钥中的SK。
终端节点 连接OBS的region信息,当前支持华北-北京一、华 东-上海二、华南-广州、中国-香港。
桶设置 桶名 保存上传文件至该指定桶中。
访问域名 桶对应的桶的访问域名。
存储路径 选填。置空时WordPress的附件将直接传至OBS桶 根目录;填写后WordPress的附件将传至OBS桶的 指定目录下。
最佳实践 11 将 WordPress 远程附件存储到 OBS
配置项 参数设置 OBS图片处理
设置
图片处理 启用后,每次获取图片进行预览时,将根据原图通 过调用图片处理接口获取不同尺寸的目标缩略图。
图片样式 选填,启用后,可以通过设置样式内容获取更加灵 活多样的图片处理结果。具体操作请参见创建图片 样式。
须知
请谨慎开启“更多选项 > 清理服务器存储”功能。
开启“清理服务器存储”后,上传至媒体库的图片和其他附件在上传到OBS后会在本 地删除,因此在停用插件后,无法利用本地数据做恢复和替换。
步骤3 单击“保存配置”,完成配置。
步骤4 测试配置是否成功。
1. 新建文章进行测试,在文章中插入图片,插入成功后发布文章。
2. 在图片右键复制图片地址,可以查看当前图片URL域名部分对应步骤2中配置的桶 访问域名,说明配置成功。
----结束
12 Web 端通过 PostObject 接口直传 OBS
背景信息
常见的Web端上传方法是用户通过浏览器上传文件至应用服务器,再由应用服务器上 传至OBS,数据需要在应用服务器中转,传输效率较低,且多任务同时上传时应用服 务器压力大。
本文介绍一种在Web端利用PostObject接口直传文件至OBS的方法,即使用表单上传 方式上传文件至OBS。如图12-1所示,该方案省去了应用服务器这一步骤,提高了传 输效率,不会对服务器产生压力,且服务端签名后直传可以保证传输的安全性。
最佳实践 12 Web 端通过 PostObject 接口直传 OBS
图12-1 Web 端 PostObject 直传流程图
前提条件
已创建桶。具体操作请参见创建桶。
操作步骤
配置分为两大步:配置跨域资源共享和使用表单上传。
第一步:配置跨域资源共享
在通常的网页请求中,由于同源安全策略SOP的存在,不同域之间的网站脚本和内容 是无法进行交互的。
跨域资源共享CORS是一种网络浏览器的规范机制,定义了一个域中加载的客户端Web 应用程序与另一个域中的资源交互的方式。OBS支持CORS规范,允许跨域请求访问 OBS中的资源。
步骤1 在OBS管理控制台左侧导航栏选择“对象存储”。
步骤2 在桶列表单击待操作的桶,进入“概览”页面。
步骤3 在左侧导航栏,单击“访问权限控制 > CORS规则”。
步骤4 单击“创建”,系统弹出“创建CORS规则”对话框,如图12-2所示。
说明
一个桶最多可设置100条CORS规则。
图12-2 创建 CORS 规则
步骤5 在“CORS规则”中配置“允许的来源”、“允许的方法”、“允许的头域”、“补充 头域”和“缓存时间”。
说明
若该OBS桶同时开启了CDN加速,CDN需配置HTTP header,详见HTTP header配置。
表12-1 CORS 规则
参数 说明 配置建议
允许的来 源
必选参数,指定允许的跨域请求的来 源,即允许来自该域名下的请求访问该 桶。
允许多条匹配规则,以回车换行为间 隔。每个匹配规则允许使用最多一个
“*”通配符。例如:
http://rds.example.com https://*.vbs.example.com
*
允许的方 法
必选参数,指定允许的跨域请求方法,
即桶和对象的几种操作类型。包括:
Get、Post、Put、Delete、Head。
全选
最佳实践 12 Web 端通过 PostObject 接口直传 OBS
参数 说明 配置建议
● x-obs-request-id
● x-obs-api
● Content-Type
● Content-Length
● Cache-Control
● Content-Disposition
● Content-Encoding
● Content-Language
● Expires
● x-obs-id-2
● x-reserved-indicator
● x-obs-version-id
● x-obs-copy-source-version-id
● x-obs-storage-class
● x-obs-delete-marker
● x-obs-expiration
● x-obs-website-redirect-location
● x-obs-restore
● x-obs-version
● x-obs-object-type
● x-obs-next-append-position
CORS配置成功后,便仅允许跨域请求来源的地址通过允许的方法访问OBS的桶。例
步骤1 使用ObsClient.createPostSignatureSync生成用于鉴权的请求参数。
使用SDK生成用于鉴权的请求参数包括两个:
● Policy:对应表单中policy字段。
● Signature:对应表单中的signature字段。
代码示例如下:
// 创建ObsClient实例
var obsClient = new ObsClient({
access_key_id: '*** Provide your Access Key ***', secret_access_key: '*** Provide your Secret Key ***', server : 'https://your-endpoint',
signature : 'obs' });
// 设置表单参数 var formParams = {
// 设置对象访问权限为公共读 var expires = 3600;
var res = obsClient.createPostSignatureSync({Expires:expires, FormParams: formParams});
// 获取表单上传请求参数 console.log('\t' + res.Policy);
console.log('\t' + res.Signature);
步骤2 准备表单HTML页面。
表单HTML代码示例如下:
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
</head>
<body>
<form action="http://bucketname.your-endpoint/" method="post" enctype="multipart/form-data">
Object key
<!-- 对象名 -->
最佳实践 12 Web 端通过 PostObject 接口直传 OBS
<input type="text" name="key" value="objectname" />
<p>
ACL<!-- 对象ACL权限 -->
<input type="text" name="x-obs-acl" value="public-read" />
<p>
Content-Type
<!-- 对象MIME类型 -->
<input type="text" name="content-type" value="text/plain" />
<p>
<!-- policy的base64编码值 -->
<input type="hidden" name="policy" value="*** Provide your policy ***" />
<!-- AK -->
<input type="hidden" name="AccessKeyId" value="*** Provide your access key ***"/>
<!-- 签名串信息 -->
<input type="hidden" name="signature" value="*** Provide your signature ***"/>
<input name="file" type="file" />
<input name="submit" value="Upload" type="submit" />
</form>
</body>
</html>
说明
● HTML表单中的policy,signature的值均是从ObsClient.createPostSignatureSync的返回结果 中获取。
● 表单HTML示例可单击此处下载:PostDemo。
步骤3 将生成的请求参数填入HTML页面。
步骤4 选择本地文件,进行表单上传。
----结束
知识扩展
采用BrowserJS SDK直接计算签名时,AK/SK可能会展现在前端界面,有一定风险。
您还可以采用客户端-服务端模型,服务端可以采用Java、Python等SDK计算POST上 传签名,客户端采用JavaScript向服务端获取签名信息后利用签名信息访问OBS。
其中,计算POST上传签名信息请参考各SDK语言:
● Java
● Python
● PHP
● BrowserJS
● Node.js
除POST上传外,在其他场景中,为了避免前端代码直接使用AK/SK访问OBS造成敏感 信息泄露,可以通过后台计算临时URL,前端使用临时URL授权访问OBS。
利用GO SDK计算临时URL,前端JS使用临时URL列举OBS桶内对象。示例如下:
1. GO SDK后台计算列举桶临时URL。
1. GO SDK后台计算列举桶临时URL。