更新时间:2025-06-30 GMT+08:00
处理图片持久化
图片处理持久化支持将处理后的图片同步存储至指定的OBS桶中,方便下次直接访问处理后的图片,减少图片处理花费的时间,提升用户体验。
图片处理持久化目前仅支持通过接口调用模式使用。在图片处理请求接口中,以参数名=参数值的格式,发送图片处理持久化请求,具体参数说明如表1所示。
|
参数名 |
参数值 |
说明 |
|---|---|---|
|
x-image-save-object |
objectName |
必填参数。 指定目标对象名称,即处理后的图片存储至桶中的对象名。 对象命名要求如下:
|
|
x-image-save-bucket |
bucketName |
选填参数。 指定目标存储桶,处理后的图片将存储至该桶。如果不指定的话将默认保存至当前桶。 桶名范围为1到64位,且必须是在OBS中已存在的桶。 |
Java示例代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 |
ObsClient obsClient = null; String endPoint = "obs-endpoint"; // 当前所在region // 认证用的ak和sk硬编码到代码中或者明文存储都有很大的安全风险,建议在配置文件或者环境变量中密文存放,使用时解密,确保安全; // 本示例以ak和sk保存在环境变量中为例,运行本示例前请先在本地环境中设置环境变量ACCESS_KEY_ID和SECRET_ACCESS_KEY。 // 您可以登录访问管理控制台获取访问密钥AK/SK。获取方式请参见https://support.huaweicloud.com/intl/zh-cn/usermanual-ca/ca_01_0003.html String ak = System.getenv("ACCESS_KEY_ID"); String sk = System.getenv("SECRET_ACCESS_KEY"); try { ObsConfiguration config = new ObsConfiguration(); config.setEndPoint(endPoint); obsClient = new ObsClient(ak,sk ,config); TemporarySignatureRequest request = new TemporarySignatureRequest(); request.setObjectKey("test.jpeg"); // 处理前的原对象名 Map<String, Object> queryParams = new HashMap<>(); queryParams.put("x-image-process", "image/resize,w_100"); String objectName = "your saves objectName"; // 处理后的对象名 // 非必选参数 String bucketName = "your saves Bucket"; // 处理后保存的桶名 queryParams.put("x-image-save-object", Base64.getUrlEncoder().encodeToString(objectName.getBytes(StandardCharsets.UTF_8))); queryParams.put("x-image-save-bucket", Base64.getUrlEncoder().encodeToString(bucketName.getBytes(StandardCharsets.UTF_8))); request.setQueryParams(queryParams); request.setBucketName("your bucket"); // 原对象的桶 TemporarySignatureResponse response = obsClient.createTemporarySignature(request); // 访问的url response.getSignedUrl(); } catch (Exception e) { // 异常处理 } finally { if (obsClient != null) { obsClient.close(); } } |
Python示例代码:
from obs import ObsClient
import os
import traceback
import requests
import base64
# 推荐通过环境变量获取AKSK,这里也可以使用其他外部引入方式传入,如果使用硬编码可能会存在泄露风险。
# 您可以登录访问管理控制台获取访问密钥AK/SK。获取方式请参见https://support.huaweicloud.com/intl/zh-cn/usermanual-ca/ca_01_0003.html
ak = os.getenv("AccessKeyID")
sk = os.getenv("SecretAccessKey")
# 【可选】如果使用临时AKSK和SecurityToken访问OBS,则同样推荐通过环境变量获取
security_token = os.getenv("SecurityToken")
# server填写Bucket对应的Endpoint, 这里以中国-香港为例,其他地区请按实际情况填写。
server = "https://obs.ap-southeast-1.myhuaweicloud.com"
# 创建obsClient实例
# 如果使用临时AKSK和SecurityToken访问OBS,需要在创建实例时通过security_token参数指定securityToken值
obsClient = ObsClient(access_key_id=ak, secret_access_key=sk, server=server)
try:
# 生成图片持久化处理的带授权信息的URL
# 原对象所在的桶名
bucketName = 'originBucketName';
# 处理前的原对象名
objectKey = 'test.png';
# 处理后的对象名
targetObjectName ="save.png"
# 处理后保存的桶名, 可选参数
targetBucketName ="saveBucketName"
queryParams={}
queryParams["x-image-process"]="image/resize,w_100"
queryParams["x-image-save-object"]=base64.urlsafe_b64encode(targetObjectName.encode()).decode()
# 可选参数
queryParams["x-image-save-bucket"]=base64.urlsafe_b64encode(targetBucketName.encode()).decode()
res = obsClient.createSignedUrl(method='GET', bucketName=bucketName, objectKey=objectKey, queryParams=queryParams, expires=3600)
print('signedUrl:', res.signedUrl)
print('actualSignedRequestHeaders:', res.actualSignedRequestHeaders)
// 使用GET请求处理图片持久化
r = requests.get(resp.signedUrl)
print(r)
except:
print(traceback.format_exc())
nodejs示例代码:
// 引入obs库
const ObsClient = require('esdk-obs-nodejs');
const https = require('https');
const http = require('http');
const urlLib = require('url');
// 认证用的ak和sk硬编码到代码中或者明文存储都有很大的安全风险,建议在配置文件或者环境变量中密文存放,使用时解密,确保安全;
// 本示例以ak和sk保存在环境变量中为例,运行本示例前请先在本地环境中设置环境变量ACCESS_KEY_ID和SECRET_ACCESS_KEY。
// 您可以登录访问管理控制台获取访问密钥AK/SK。获取方式请参见https://support.huaweicloud.com/intl/zh-cn/usermanual-ca/ca_01_0003.html
const ak = process.env.ACCESS_KEY_ID;
const sk = process.env.SECRET_ACCESS_KEY;
const server = "obs-endpoint"; // 当前所在region
// 创建ObsClient实例
const obsClient = new ObsClient({
access_key_id: ak,
secret_access_key: sk,
server: server
});
// 原对象所在的桶名
const bucketName = 'originBucketName';
// 处理前的原对象名
const objectKey = 'test.png';
const method = 'GET';
// 处理后的对象名
const targetObjectName = "save.png";
// 处理后保存的桶名 , 可选参数
const targetBucketName = 'saveBucketName';
// base64编码
function encodeBase64Url(str) {
return Buffer.from(str, 'utf8')
.toString('base64')
.replace(/\+/g, '-')
.replace(/\//g, '_')
.replace(/=+$/g, '')
}
const queryParams = {
"x-image-process": "image/resize,w_100",
"x-image-save-object": encodeBase64Url(targetObjectName),
// 可选参数
"x-image-save-bucket": encodeBase64Url(targetBucketName)
}
const res = obsClient.createSignedUrlSync({
Method: method,
Bucket: bucketName,
Key: objectKey,
QueryParams: queryParams
});
// 使用GET请求处理图片持久化
const url = urlLib.parse(res.SignedUrl);
const request = server.startsWith('http://') ? http : https;
const req = request.request({
method: method,
host: url.hostname,
port: url.port,
path: url.path,
rejectUnauthorized: false,
headers: res.ActualSignedRequestHeaders || {}
});
php示例代码:
// 引入依赖库
require 'vendor/autoload.php';
// 使用源码安装时引入SDK代码库
// require 'obs-autoloader.php';
// 声明命名空间
use Obs\ObsClient;
use GuzzleHttp\Client;
use GuzzleHttp\Exception\ClientException;
// 创建ObsClient实例
$obsClient = new ObsClient ( [
//推荐通过环境变量获取AKSK,这里也可以使用其他外部引入方式传入,如果使用硬编码可能会存在泄露风险。
//您可以登录访问管理控制台获取访问密钥AK/SK,获取方式请参见https://support.huaweicloud.com/intl/zh-cn/usermanual-ca/ca_01_0003.html
'key' => getenv('ACCESS_KEY_ID'),
'secret' => getenv('SECRET_ACCESS_KEY'),
'endpoint' => 'https://your-endpoint',
'signature' => 'obs'
] );
function base64url_encode($data) {
$base64 = base64_encode($data);
$base64url = strtr($base64, '+/', '-_');
return rtrim($base64url, '=');
}
// 原对象所在的桶名
$bucketName = 'originBucketName';
// 处理前的原对象名
$objectKey = 'test.png';
$method = 'GET';
// 处理后的对象名
$targetObjectName = "save.png";
// 处理后保存的桶名 , 可选参数
$targetBucketName = 'saveBucketName';
// URL有效期,3600秒
$expires = 3600;
// 下载对象
$resp = $obsClient->createSignedUrl( [
'Method' => $method,
'Bucket' => bucketname,
'Key' => $objectKey,
'Expires' => $expires,
'QueryParams' => [
"x-image-process" => 'image/resize,w_100',
'x-image-save-object' => base64url_encode($targetObjectName),
'x-image-save-bucket' => base64url_encode($targetBucketName)
]
] );
printf("SignedUrl:%s\n", $resp ['SignedUrl']);
$url = $resp['SignedUrl'];
$httpClient = new Client(['verify' => false ]);
try{
$response = $httpClient -> request('GET', $url, ['headers'=> $resp['ActualSignedRequestHeaders']]);
printf("%s using temporary signature url:\n", 'Get object');
printf("\t%s successfully.\n", $url);
printf("\tStatus:%d\n", $response -> getStatusCode());
printf("\tContent:%s\n", $response -> getBody() -> getContents());
$response -> getBody()-> close();
}catch (ClientException $ex){
printf("%s using temporary signature url:\n", 'Get object');
printf("\t%s failed!\n", $url);
printf('Exception message:%s', $ex ->getMessage());
}
- 对象名和桶名都必须是URL安全base64编码。encodedObject = url_safe_base64_encode(name)。例如对象名为“panda.png”, 编码过后的内容为“cGFuZGEucG5n”。base64编码后如果含有“+”、“/”,需要分别替换为“-”、“_”。
- 如果报签名匹配错误,请检查AK/SK是否正确,以及访问的URL与代码生成的签名URL是否保持一致。
- 当前暂不支持带range头域的持久化。