• 沒有找到結果。

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。