圖片處理操作方式
您可以通過文件URL、API、SDK對(duì)OSS內(nèi)圖片進(jìn)行處理,本文介紹如何使用這三種方式進(jìn)行圖片處理。
通過文件URL處理圖片
通過文件URL處理圖片有兩種方式,一種是添加圖片處理參數(shù),另一種是添加圖片樣式參數(shù)。
對(duì)于允許匿名訪問的公共讀或者公共讀寫文件,可直接在文件URL中通過添加圖片處理參數(shù)或者圖片樣式參數(shù)的方式處理圖片。
對(duì)于不允許匿名訪問的私有圖片文件,不支持通過文件URL直接添加參數(shù)的方式處理圖片,您需要通過SDK的方式將圖片處理操作加入簽名URL中。
通過文件URL訪問圖片時(shí),默認(rèn)是下載行為。如需確保通過文件URL訪問圖片時(shí)是預(yù)覽行為,您需要綁定自定義域名并添加CNAME記錄。具體操作,請(qǐng)參見綁定自定義域名。
公共讀或者公共讀寫圖片文件
通過在文件URL中通過添加圖片處理參數(shù)或者圖片樣式參數(shù)的方式處理圖片的說明如下。
圖片處理方式 | 添加圖片處理參數(shù) | 添加圖片樣式參數(shù) |
圖片處理URL |
|
|
參數(shù)說明 |
|
如果您設(shè)置了自定義分隔符,可使用分隔符代替 |
示例 |
私有圖片文件
以下僅列舉常見SDK的生成帶圖片處理參數(shù)的文件簽名URL的代碼示例。關(guān)于其他SDK的生成帶圖片處理參數(shù)的文件簽名URL的代碼示例,請(qǐng)參見SDK簡(jiǎn)介。
import com.aliyun.oss.*;
import com.aliyun.oss.common.auth.*;
import com.aliyun.oss.model.GeneratePresignedUrlRequest;
import java.net.URL;
import java.util.Date;
public class Demo {
public static void main(String[] args) throws Throwable {
// Endpoint以華東1(杭州)為例,其它Region請(qǐng)按實(shí)際情況填寫。
String endpoint = "https://oss-cn-hangzhou.aliyuncs.com";
// 從環(huán)境變量中獲取訪問憑證。運(yùn)行本代碼示例之前,請(qǐng)確保已設(shè)置環(huán)境變量OSS_ACCESS_KEY_ID和OSS_ACCESS_KEY_SECRET。
EnvironmentVariableCredentialsProvider credentialsProvider = CredentialsProviderFactory.newEnvironmentVariableCredentialsProvider();
// 填寫B(tài)ucket名稱,例如examplebucket。
String bucketName = "examplebucket";
// 填寫Object完整路徑。Object完整路徑中不能包含Bucket名稱。
String objectName = "exampleobject.jpg";
// 填寫B(tài)ucket所在地域。以華東1(杭州)為例,Region填寫為cn-hangzhou。
String region = "cn-hangzhou";
// 創(chuàng)建OSSClient實(shí)例。
ClientBuilderConfiguration clientBuilderConfiguration = new ClientBuilderConfiguration();
clientBuilderConfiguration.setSignatureVersion(SignVersion.V4);
OSS ossClient = OSSClientBuilder.create()
.endpoint(endpoint)
.credentialsProvider(credentialsProvider)
.clientConfiguration(clientBuilderConfiguration)
.region(region)
.build();
try {
// 將圖片縮放為固定寬高100 px后,再旋轉(zhuǎn)90°。
String style = "image/resize,m_fixed,w_100,h_100/rotate,90";
// 指定簽名URL過期時(shí)間為10分鐘。(最長(zhǎng)過期時(shí)間為32400秒)
Date expiration = new Date(new Date().getTime() + 1000 * 60 * 10 );
GeneratePresignedUrlRequest req = new GeneratePresignedUrlRequest(bucketName, objectName, HttpMethod.GET);
req.setExpiration(expiration);
req.setProcess(style);
URL signedUrl = ossClient.generatePresignedUrl(req);
System.out.println(signedUrl);
} catch (OSSException oe) {
System.out.println("Caught an OSSException, which means your request made it to OSS, "
+ "but was rejected with an error response for some reason.");
System.out.println("Error Message:" + oe.getErrorMessage());
System.out.println("Error Code:" + oe.getErrorCode());
System.out.println("Request ID:" + oe.getRequestId());
System.out.println("Host ID:" + oe.getHostId());
} catch (ClientException ce) {
System.out.println("Caught an ClientException, which means the client encountered "
+ "a serious internal problem while trying to communicate with OSS, "
+ "such as not being able to access the network.");
System.out.println("Error Message:" + ce.getMessage());
} finally {
if (ossClient != null) {
ossClient.shutdown();
}
}
}
}
<?php
if (is_file(__DIR__ . '/../autoload.php')) {
require_once __DIR__ . '/../autoload.php';
}
if (is_file(__DIR__ . '/../vendor/autoload.php')) {
require_once __DIR__ . '/../vendor/autoload.php';
}
use OSS\Credentials\EnvironmentVariableCredentialsProvider;
use OSS\OssClient;
// 從環(huán)境變量中獲取訪問憑證。運(yùn)行本代碼示例之前,請(qǐng)確保已設(shè)置環(huán)境變量OSS_ACCESS_KEY_ID和OSS_ACCESS_KEY_SECRET。
$provider = new EnvironmentVariableCredentialsProvider();
// yourEndpoint填寫B(tài)ucket所在地域?qū)?yīng)的Endpoint。以華東1(杭州)為例,Endpoint填寫為https://oss-cn-hangzhou.aliyuncs.com。
$endpoint = "yourEndpoint";
// 填寫B(tài)ucket名稱,例如examplebucket。
$bucket= "examplebucket";
// 填寫Object完整路徑,例如exampledir/exampleobject.jpg。Object完整路徑中不能包含Bucket名稱。
$object = "exampledir/exampleobject.jpg";
$config = array(
"provider" => $provider,
"endpoint" => $endpoint,
"signatureVersion" => OssClient::OSS_SIGNATURE_VERSION_V4,
"region"=> "cn-hangzhou"
);
$ossClient = new OssClient($config);
// 生成一個(gè)帶圖片處理參數(shù)的簽名的URL,有效期是3600秒,可以直接使用瀏覽器訪問。
$timeout = 3600;
$options = array(
// 將圖片縮放為固定寬高100 px。
OssClient::OSS_PROCESS => "image/resize,m_fixed,h_100,w_100" );
$signedUrl = $ossClient->signUrl($bucket, $object, $timeout, "GET", $options);
print("rtmp url: \n" . $signedUrl);
const OSS = require("ali-oss");
const client = new OSS({
// yourregion填寫B(tài)ucket所在地域。以華東1(杭州)為例,Region填寫為oss-cn-hangzhou。
region: "oss-cn-hangzhou",
// 從環(huán)境變量中獲取訪問憑證。運(yùn)行本代碼示例之前,請(qǐng)確保已設(shè)置環(huán)境變量OSS_ACCESS_KEY_ID和OSS_ACCESS_KEY_SECRET。
accessKeyId: process.env.OSS_ACCESS_KEY_ID,
accessKeySecret: process.env.OSS_ACCESS_KEY_SECRET,
authorizationV4: true,
// yourbucketname填寫存儲(chǔ)空間名稱。
bucket: "examplebucket",
});
// 過期時(shí)間10分鐘,圖片處理式樣"image/resize,w_300"。
const signUrl = client.signatureUrl("example.png", {
expires: 600,
process: "image/resize,w_300",
});
console.log("signUrl=" + signUrl);
# -*- coding: utf-8 -*-
import oss2
from oss2.credentials import EnvironmentVariableCredentialsProvider
# 從環(huán)境變量中獲取訪問憑證。運(yùn)行本代碼示例之前,請(qǐng)確保已設(shè)置環(huán)境變量OSS_ACCESS_KEY_ID和OSS_ACCESS_KEY_SECRET。
auth = oss2.ProviderAuthV4(EnvironmentVariableCredentialsProvider())
# 填寫B(tài)ucket所在地域?qū)?yīng)的Endpoint。以華東1(杭州)為例,Endpoint填寫為https://oss-cn-hangzhou.aliyuncs.com。
endpoint = "https://oss-cn-hangzhou.aliyuncs.com"
# 填寫Endpoint對(duì)應(yīng)的Region信息,例如cn-hangzhou。注意,v4簽名下,必須填寫該參數(shù)
region = "cn-hangzhou"
# examplebucket填寫存儲(chǔ)空間名稱。
bucket = oss2.Bucket(auth, endpoint, "examplebucket", region=region)
# 填寫B(tài)ucket名稱,例如examplebucket。
bucket_name = 'examplebucket'
# 指定圖片所在Bucket的名稱。如果圖片不在Bucket根目錄,需攜帶文件完整路徑,例如exampledir/example.jpg。
key = 'exampledir/example.jpg'
# 如果圖片不在指定Bucket內(nèi),需將該圖片到目標(biāo)Bucket。
# bucket.put_object_from_file(key, 'D:\\localpath\\example.jpg')
# 將圖片縮放為固定寬高100 px后,再旋轉(zhuǎn)90°。
style = 'image/resize,m_fixed,w_100,h_100/rotate,90'
# 生成帶簽名的URL,并指定過期時(shí)間為10分鐘。過期時(shí)間單位為秒。
url = bucket.sign_url('GET', key, 10 * 60, params={'x-oss-process': style})
print(url)
using Aliyun.OSS;
using Aliyun.OSS.Common;
// yourEndpoint填寫B(tài)ucket所在地域?qū)?yīng)的Endpoint。以華東1(杭州)為例,Endpoint填寫為https://oss-cn-hangzhou.aliyuncs.com。
var endpoint = "yourEndpoint";
// 從環(huán)境變量中獲取訪問憑證。運(yùn)行本代碼示例之前,請(qǐng)確保已設(shè)置環(huán)境變量OSS_ACCESS_KEY_ID和OSS_ACCESS_KEY_SECRET。
var accessKeyId = Environment.GetEnvironmentVariable("OSS_ACCESS_KEY_ID");
var accessKeySecret = Environment.GetEnvironmentVariable("OSS_ACCESS_KEY_SECRET");
// 指定圖片所在Bucket的名稱,例如examplebucket。
var bucketName = "examplebucket";
// 指定圖片名稱。如果圖片不在Bucket根目錄,需攜帶文件完整路徑,例如exampledir/example.jpg。
var objectName = "exampledir/exampledir.jpg";
// 填寫B(tài)ucket所在地域?qū)?yīng)的Region。以華東1(杭州)為例,Region填寫為cn-hangzhou。
const string region = "cn-hangzhou";
// 創(chuàng)建ClientConfiguration實(shí)例,按照您的需要修改默認(rèn)參數(shù)。
var conf = new ClientConfiguration();
// 設(shè)置v4簽名。
conf.SignatureVersion = SignatureVersion.V4;
// 創(chuàng)建OssClient實(shí)例。
var client = new OssClient(endpoint, accessKeyId, accessKeySecret, conf);
c.SetRegion(region);
try
{
// 將圖片縮放為固定寬高100 px。
var process = "image/resize,m_fixed,w_100,h_100";
var req = new GeneratePresignedUriRequest(bucketName, objectName, SignHttpMethod.Get)
{
Expiration = DateTime.Now.AddHours(1),
Process = process
};
// 生成帶有簽名的URI。
var uri = client.GeneratePresignedUri(req);
Console.WriteLine("Generate Presigned Uri:{0} with process:{1} succeeded ", uri, process);
}
catch (OssException ex)
{
Console.WriteLine("Failed with error code: {0}; Error info: {1}. \nRequestID:{2}\tHostID:{3}",
ex.ErrorCode, ex.Message, ex.RequestId, ex.HostId);
}
catch (Exception ex)
{
Console.WriteLine("Failed with error info: {0}", ex.Message);
}
package main
import (
"fmt"
"os"
"github.com/aliyun/aliyun-oss-go-sdk/oss"
)
func HandleError(err error) {
fmt.Println("Error:", err)
os.Exit(-1)
}
func main() {
// 從環(huán)境變量中獲取訪問憑證。運(yùn)行本代碼示例之前,請(qǐng)確保已設(shè)置環(huán)境變量OSS_ACCESS_KEY_ID和OSS_ACCESS_KEY_SECRET。
provider, err := oss.NewEnvironmentVariableCredentialsProvider()
if err != nil {
fmt.Println("Error:", err)
os.Exit(-1)
}
// 創(chuàng)建OSSClient實(shí)例。
// yourEndpoint填寫B(tài)ucket對(duì)應(yīng)的Endpoint,以華東1(杭州)為例,填寫為https://oss-cn-hangzhou.aliyuncs.com。其它Region請(qǐng)按實(shí)際情況填寫。
// yourRegion填寫B(tài)ucket所在地域,以華東1(杭州)為例,填寫為cn-hangzhou。其它Region請(qǐng)按實(shí)際情況填寫。
clientOptions := []oss.ClientOption{oss.SetCredentialsProvider(&provider)}
clientOptions = append(clientOptions, oss.Region("yourRegion"))
// 設(shè)置簽名版本
clientOptions = append(clientOptions, oss.AuthVersion(oss.AuthV4))
client, err := oss.New("yourEndpoint", "", "", clientOptions...)
if err != nil {
HandleError(err)
}
// 指定圖片所在Bucket的名稱,例如examplebucket。
bucketName := "examplebucket"
bucket, err := client.Bucket(bucketName)
if err != nil {
HandleError(err)
}
// 指定圖片名稱。如果圖片不在Bucket根目錄,需攜帶文件完整路徑,例如exampledir/example.jpg。
ossImageName := "exampledir/example.jpg"
// 生成帶簽名的URL,并指定過期時(shí)間為600s。(最長(zhǎng)有效時(shí)間為32400秒)
signedURL, err := bucket.SignURL(ossImageName, oss.HTTPGet, 600, oss.Process("image/format,png"))
if err != nil {
HandleError(err)
} else {
fmt.Println(signedURL)
}
}
#include <alibabacloud/oss/OssClient.h>
using namespace AlibabaCloud::OSS;
int main(void)
{
/* 初始化OSS賬號(hào)信息。*/
/* yourEndpoint填寫B(tài)ucket所在地域?qū)?yīng)的Endpoint。以華東1(杭州)為例,Endpoint填寫為https://oss-cn-hangzhou.aliyuncs.com。*/
std::string Endpoint = "yourEndpoint";
/* yourRegion填寫B(tài)ucket所在地域?qū)?yīng)的Region。以華東1(杭州)為例,Region填寫為cn-hangzhou。*/
std::string Region = "yourRegion";
/* 填寫圖片所在的Bucket名稱,例如examplebucket。*/
std::string BucketName = "examplebucket";
/* 指定圖片名稱。如果圖片不在Bucket根目錄,需攜帶文件完整路徑,例如exampledir/example.jpg。*/
std::string ObjectName = "exampledir/example.jpg";
/* 初始化網(wǎng)絡(luò)等資源。*/
InitializeSdk();
ClientConfiguration conf;
conf.signatureVersion = SignatureVersionType::V4;
/* 從環(huán)境變量中獲取訪問憑證。運(yùn)行本代碼示例之前,請(qǐng)確保已設(shè)置環(huán)境變量OSS_ACCESS_KEY_ID和OSS_ACCESS_KEY_SECRET。*/
auto credentialsProvider = std::make_shared<EnvironmentVariableCredentialsProvider>();
OssClient client(Endpoint, credentialsProvider, conf);
client.SetRegion(Region);
/* 生成帶圖片處理參數(shù)的文件簽名URL。*/
std::string Process = "image/resize,m_fixed,w_100,h_100";
GeneratePresignedUrlRequest request(BucketName, ObjectName, Http::Get);
request.setProcess(Process);
/* 使用URL的最大時(shí)間限制為32400。*/
auto outcome = client.GeneratePresignedUrl(request);
if (outcome.isSuccess()) {
std::cout << "Generated presigned URL: " << outcome.result() << std::endl;
} else {
std::cout << "Failed to generate presigned URL. Error code: " << outcome.error().Code()
<< ", Message: " << outcome.error().Message()
<< ", RequestId: " << outcome.error().RequestId() << std::endl;
}
/* 釋放網(wǎng)絡(luò)等資源。*/
ShutdownSdk();
return 0;
}
#include "oss_api.h"
#include "aos_http_io.h"
/* yourEndpoint填寫B(tài)ucket所在地域?qū)?yīng)的Endpoint。以華東1(杭州)為例,Endpoint填寫為https://oss-cn-hangzhou.aliyuncs.com。*/
const char *endpoint = "yourEndpoint";
/* 填寫B(tài)ucket名稱,例如examplebucket。*/
const char *bucket_name = "examplebucket";
/* 填寫Object完整路徑,完整路徑中不能包含Bucket名稱,例如exampledir/exampleobject.txt。*/
const char *object_name = "exampledir/exampleobject.txt";
/* yourRegion填寫B(tài)ucket所在地域?qū)?yīng)的Region。以華東1(杭州)為例,Region填寫為cn-hangzhou。*/
const char *region = "yourRegion";
void init_options(oss_request_options_t *options)
{
options->config = oss_config_create(options->pool);
/* 用char*類型的字符串初始化aos_string_t類型。*/
aos_str_set(&options->config->endpoint, endpoint);
/* 從環(huán)境變量中獲取訪問憑證。運(yùn)行本代碼示例之前,請(qǐng)確保已設(shè)置環(huán)境變量OSS_ACCESS_KEY_ID和OSS_ACCESS_KEY_SECRET。*/
aos_str_set(&options->config->access_key_id, getenv("OSS_ACCESS_KEY_ID"));
aos_str_set(&options->config->access_key_secret, getenv("OSS_ACCESS_KEY_SECRET"));
//需要額外配置以下兩個(gè)參數(shù)
aos_str_set(&options->config->region, region);
options->config->signature_version = 4;
/* 是否使用了CNAME。0表示不使用。*/
options->config->is_cname = 0;
/* 設(shè)置網(wǎng)絡(luò)相關(guān)參數(shù),比如超時(shí)時(shí)間等。*/
options->ctl = aos_http_controller_create(options->pool, 0);
}
int main(int argc, char *argv[])
{
/* 在程序入口調(diào)用aos_http_io_initialize方法來初始化網(wǎng)絡(luò)、內(nèi)存等全局資源。*/
if (aos_http_io_initialize(NULL, 0) != AOSE_OK) {
exit(1);
}
/* 用于內(nèi)存管理的內(nèi)存池(pool),等價(jià)于apr_pool_t。其實(shí)現(xiàn)代碼在apr庫(kù)中。*/
aos_pool_t *pool;
/* 重新創(chuàng)建一個(gè)內(nèi)存池,第二個(gè)參數(shù)是NULL,表示沒有繼承其它內(nèi)存池。*/
aos_pool_create(&pool, NULL);
/* 創(chuàng)建并初始化options,該參數(shù)包括endpoint、access_key_id、acces_key_secret、is_cname、curl等全局配置信息。*/
oss_request_options_t *oss_client_options;
/* 在內(nèi)存池中分配內(nèi)存給options。*/
oss_client_options = oss_request_options_create(pool);
/* 初始化Client的選項(xiàng)oss_client_options。*/
init_options(oss_client_options);
/* 初始化參數(shù)。*/
aos_string_t bucket;
aos_string_t object;
aos_table_t *params = NULL;
aos_http_request_t *req;
char *url_str;
apr_time_t now;
int64_t expire_time;
aos_str_set(&bucket, bucket_name);
aos_str_set(&object, object_name);
/* 將圖片縮放為固定寬高100 px。*/
params = aos_table_make(pool, 1);
apr_table_set(params, OSS_PROCESS, "image/resize,m_fixed,w_100,h_100");
req = aos_http_request_create(pool);
req->method = HTTP_GET;
req->query_params = params;
/* 指定過期時(shí)間(expire_time),單位為秒。*/
now = apr_time_now();
expire_time = now / 1000000 + 10 * 60;
/* 生成簽名url。*/
url_str = oss_gen_signed_url(oss_client_options, &bucket, &object, expire_time, req);
printf("url: %s\n", url_str);
/* 釋放該內(nèi)存池,相當(dāng)于釋放了請(qǐng)求過程中各資源分配的內(nèi)存。*/
aos_pool_destroy(pool);
/* 釋放之前分配的全局資源。*/
aos_http_io_deinitialize();
return 0;
}
// 填寫圖片所在Bucket的名稱。
NSString *bucketName = @"examplebucket";
// 填寫圖片名稱。如果圖片不在Bucket根目錄,需攜帶文件完整路徑,例如exampledir/example.jpg。
NSString *objectKey = @"exampledir/example.jpg";
// 生成帶簽名的URL,并指定過期時(shí)間為1800s。
OSSTask *task = [_client presignConstrainURLWithBucketName:bucketName withObjectKey:objectKey withExpirationInterval:30 * 60 withParameters:@{@"x-oss-process": @"image/resize,w_50"}];
NSLog(@"url: %@", task.result);
使用SDK處理圖片
您可以通過在SDK中添加圖片處理參數(shù)或圖片樣式參數(shù)的方式來處理圖片。
添加圖片處理參數(shù)
通過添加圖片處理參數(shù)的方式處理圖片時(shí),多個(gè)圖片處理參數(shù)之間須以正斜線(/)分隔。以下僅列舉常見SDK的添加圖片處理參數(shù)的代碼示例,關(guān)于其他SDK的添加圖片處理參數(shù)的代碼示例,請(qǐng)參見簡(jiǎn)介。
import com.aliyun.oss.*;
import com.aliyun.oss.common.auth.*;
import com.aliyun.oss.model.GetObjectRequest;
import java.io.File;
public class Demo {
public static void main(String[] args) throws Throwable {
// Endpoint以華東1(杭州)為例,其它Region請(qǐng)按實(shí)際情況填寫。
String endpoint = "https://oss-cn-hangzhou.aliyuncs.com";
// 從環(huán)境變量中獲取訪問憑證。運(yùn)行本代碼示例之前,請(qǐng)確保已設(shè)置環(huán)境變量OSS_ACCESS_KEY_ID和OSS_ACCESS_KEY_SECRET。
EnvironmentVariableCredentialsProvider credentialsProvider = CredentialsProviderFactory.newEnvironmentVariableCredentialsProvider();
// 填寫B(tài)ucket名稱,例如examplebucket。
String bucketName = "examplebucket";
// 填寫Object完整路徑。Object完整路徑中不能包含Bucket名稱。
String objectName = "exampleobject.jpg";
// 填寫本地文件的完整路徑,例如D:\\localpath\\example-new.jpg。如果指定的本地文件存在會(huì)覆蓋,不存在則新建。
String pathName = "D:\\localpath\\example-new.jpg";
// 填寫B(tài)ucket所在地域。以華東1(杭州)為例,Region填寫為cn-hangzhou。
String region = "cn-hangzhou";
// 創(chuàng)建OSSClient實(shí)例。
ClientBuilderConfiguration clientBuilderConfiguration = new ClientBuilderConfiguration();
clientBuilderConfiguration.setSignatureVersion(SignVersion.V4);
OSS ossClient = OSSClientBuilder.create()
.endpoint(endpoint)
.credentialsProvider(credentialsProvider)
.clientConfiguration(clientBuilderConfiguration)
.region(region)
.build();
try {
// 將圖片縮放為固定寬高100 px后,再旋轉(zhuǎn)90°。
String style = "image/resize,m_fixed,w_100,h_100/rotate,90";
GetObjectRequest request = new GetObjectRequest(bucketName, objectName);
request.setProcess(style);
// 將處理后的圖片命名為example-new.jpg并保存到本地。
// 如果未指定本地路徑只填寫了文件名稱(例如example-new.jpg),則文件默認(rèn)保存到示例程序所屬項(xiàng)目對(duì)應(yīng)本地路徑中。
ossClient.getObject(request, new File("D:\\localpath\\example-new.jpg"));
} catch (OSSException oe) {
System.out.println("Caught an OSSException, which means your request made it to OSS, "
+ "but was rejected with an error response for some reason.");
System.out.println("Error Message:" + oe.getErrorMessage());
System.out.println("Error Code:" + oe.getErrorCode());
System.out.println("Request ID:" + oe.getRequestId());
System.out.println("Host ID:" + oe.getHostId());
} catch (ClientException ce) {
System.out.println("Caught an ClientException, which means the client encountered "
+ "a serious internal problem while trying to communicate with OSS, "
+ "such as not being able to access the network.");
System.out.println("Error Message:" + ce.getMessage());
} finally {
if (ossClient != null) {
ossClient.shutdown();
}
}
}
}
<?php
if (is_file(__DIR__ . '/../autoload.php')) {
require_once __DIR__ . '/../autoload.php';
}
if (is_file(__DIR__ . '/../vendor/autoload.php')) {
require_once __DIR__ . '/../vendor/autoload.php';
}
use OSS\Credentials\EnvironmentVariableCredentialsProvider;
use OSS\OssClient;
// 從環(huán)境變量中獲取訪問憑證。運(yùn)行本代碼示例之前,請(qǐng)確保已設(shè)置環(huán)境變量OSS_ACCESS_KEY_ID和OSS_ACCESS_KEY_SECRET。
$provider = new EnvironmentVariableCredentialsProvider();
// yourEndpoint填寫B(tài)ucket所在地域?qū)?yīng)的Endpoint。以華東1(杭州)為例,Endpoint填寫為https://oss-cn-hangzhou.aliyuncs.com。
$endpoint = "yourEndpoint";
// 填寫B(tài)ucket名稱,例如examplebucket。
$bucket= "examplebucket";
// 填寫Object完整路徑,例如exampledir/exampleobject.jpg。Object完整路徑中不能包含Bucket名稱。
$object = "exampledir/exampleobject.jpg";
// 填寫本地文件的完整路徑,例如D:\\localpath\\example-new.jpg。如果指定的本地文件存在會(huì)覆蓋,不存在則新建。
// 如果未指定本地路徑只填寫了本地文件名稱(例如example-new.jpg),則文件默認(rèn)保存到示例程序所屬項(xiàng)目對(duì)應(yīng)本地路徑中。
$download_file = "D:\\localpath\\example-new.jpg";
$config = array(
"provider" => $provider,
"endpoint" => $endpoint,
"signatureVersion" => OssClient::OSS_SIGNATURE_VERSION_V4,
"region"=> "cn-hangzhou"
);
$ossClient = new OssClient($config);
// 如果目標(biāo)圖片不在指定Bucket中,需上傳圖片到目標(biāo)Bucket。
// $ossClient->uploadFile($bucket, $object, "D:\\localpath\\exampleobject.jpg");
// 將圖片縮放為固定寬高100 px后,再旋轉(zhuǎn)90°。
$style = "image/resize,m_fixed,w_100,h_100/rotate,90";
$options = array(
OssClient::OSS_FILE_DOWNLOAD => $download_file,
OssClient::OSS_PROCESS => $style);
// 將處理后的圖片命名為example-new.jpg并保存到本地。
$ossClient->getObject($bucket, $object, $options);
// 圖片處理完成后,如果Bucket中的原圖不再需要,可以刪除原圖。
// $ossClient->deleteObject($bucket, $object);
# -*- coding: utf-8 -*-
import os
import oss2
from oss2.credentials import EnvironmentVariableCredentialsProvider
# 從環(huán)境變量中獲取訪問憑證。運(yùn)行本代碼示例之前,請(qǐng)確保已設(shè)置環(huán)境變量OSS_ACCESS_KEY_ID和OSS_ACCESS_KEY_SECRET。
auth = oss2.ProviderAuthV4(EnvironmentVariableCredentialsProvider())
# 填寫B(tài)ucket所在地域?qū)?yīng)的Endpoint。以華東1(杭州)為例,Endpoint填寫為https://oss-cn-hangzhou.aliyuncs.com。
endpoint = "https://oss-cn-hangzhou.aliyuncs.com"
# 填寫Endpoint對(duì)應(yīng)的Region信息,例如cn-hangzhou。注意,v4簽名下,必須填寫該參數(shù)
region = "cn-hangzhou"
# examplebucket填寫存儲(chǔ)空間名稱。
bucket = oss2.Bucket(auth, endpoint, "examplebucket", region=region)
# 指定原圖所在的Bucket名稱,例如examplebucket。
bucket_name = 'examplebucket'
# 指定原圖名稱。如果圖片不在Bucket根目錄,需攜帶圖片完整路徑,例如exampledir/example.jpg。
key = 'exampledir/example.jpg'
# 指定處理后的圖片名稱。
new_pic = 'exampledir/newexample.jpg'
# 如果圖片不在指定Bucket內(nèi),需將本地路徑下的圖片上傳到指定Bucket。
# bucket.put_object_from_file(key, 'D:\\localpath\\example.jpg')
# 將圖片縮放為固定寬高100 px后,再旋轉(zhuǎn)90°,之后保存至本地。
style = 'image/resize,m_fixed,w_100,h_100/rotate,90'
bucket.get_object_to_file(key, new_pic, process=style)
# 圖片處理完成后,若Bucket內(nèi)的原圖不再需要,可以刪除原圖。
# bucket.delete_object(key)
# 如果處理后的圖片不再需要,可以刪除處理后的圖片。
# os.remove(new_pic)
package main
import (
"fmt"
"os"
"github.com/aliyun/aliyun-oss-go-sdk/oss"
)
func HandleError(err error) {
fmt.Println("Error:", err)
os.Exit(-1)
}
func main() {
// 從環(huán)境變量中獲取訪問憑證。運(yùn)行本代碼示例之前,請(qǐng)確保已設(shè)置環(huán)境變量OSS_ACCESS_KEY_ID和OSS_ACCESS_KEY_SECRET。
provider, err := oss.NewEnvironmentVariableCredentialsProvider()
if err != nil {
fmt.Println("Error:", err)
os.Exit(-1)
}
// 創(chuàng)建OSSClient實(shí)例。
// yourEndpoint填寫B(tài)ucket對(duì)應(yīng)的Endpoint,以華東1(杭州)為例,填寫為https://oss-cn-hangzhou.aliyuncs.com。其它Region請(qǐng)按實(shí)際情況填寫。
// yourRegion填寫B(tài)ucket所在地域,以華東1(杭州)為例,填寫為cn-hangzhou。其它Region請(qǐng)按實(shí)際情況填寫。
clientOptions := []oss.ClientOption{oss.SetCredentialsProvider(&provider)}
clientOptions = append(clientOptions, oss.Region("yourRegion"))
// 設(shè)置簽名版本
clientOptions = append(clientOptions, oss.AuthVersion(oss.AuthV4))
client, err := oss.New("yourEndpoint", "", "", clientOptions...)
if err != nil {
HandleError(err)
}
// 指定原圖所在的Bucket名稱,例如examplebucket。
bucketName := "examplebucket"
bucket, err := client.Bucket(bucketName)
if err != nil {
HandleError(err)
}
// 指定原圖名稱。如果圖片不在Bucket根目錄,需攜帶圖片完整路徑,例如exampledir/example.jpg。
sourceImageName := "exampledir/example.jpg"
// 指定處理后的圖片名稱。
targetImageName := "exampledir/newexample.jpg"
// 將圖片縮放為固定寬高100 px后,再旋轉(zhuǎn)90°,之后保存至本地。
style := "image/resize,m_fixed,w_100,h_100/rotate,90"
err = bucket.GetObjectToFile(sourceImageName, targetImageName, oss.Process(style))
if err != nil {
HandleError(err)
}
}
#include <alibabacloud/oss/OssClient.h>
using namespace AlibabaCloud::OSS;
int main(void)
{
/* 初始化OSS賬號(hào)信息。*/
/* yourEndpoint填寫B(tài)ucket所在地域?qū)?yīng)的Endpoint。以華東1(杭州)為例,Endpoint填寫為https://oss-cn-hangzhou.aliyuncs.com。*/
std::string Endpoint = "yourEndpoint";
/* yourRegion填寫B(tài)ucket所在地域?qū)?yīng)的Region。以華東1(杭州)為例,Region填寫為cn-hangzhou。*/
std::string Region = "yourRegion";
/* 指定原圖所在的Bucket名稱,例如examplebucket。*/
std::string BucketName = "examplebucket";
/* 指定原圖名稱。如果圖片不在Bucket根目錄,需攜帶圖片完整路徑,例如exampledir/example.jpg。*/
std::string ObjectName = "exampledir/example.jpg";
/* 初始化網(wǎng)絡(luò)等資源。*/
InitializeSdk();
ClientConfiguration conf;
conf.signatureVersion = SignatureVersionType::V4;
/* 從環(huán)境變量中獲取訪問憑證。運(yùn)行本代碼示例之前,請(qǐng)確保已設(shè)置環(huán)境變量OSS_ACCESS_KEY_ID和OSS_ACCESS_KEY_SECRET。*/
auto credentialsProvider = std::make_shared<EnvironmentVariableCredentialsProvider>();
OssClient client(Endpoint, credentialsProvider, conf);
client.SetRegion(Region);
/* 將圖片縮放為固定寬高100 px后,再旋轉(zhuǎn)90°,之后保存在本地。*/
std::string Process = "image/resize,m_fixed,w_100,h_100/rotate,90";
GetObjectRequest request(BucketName, ObjectName);
request.setProcess(Process);
auto outcome = client.GetObject(request);
if (outcome.isSuccess()) {
std::cout << "Image processed successfully." << std::endl;
} else {
std::cout << "Failed to process image. Error code: " << outcome.error().Code()
<< ", Message: " << outcome.error().Message()
<< ", RequestId: " << outcome.error().RequestId() << std::endl;
}
/* 釋放網(wǎng)絡(luò)等資源。*/
ShutdownSdk();
return 0;
}
#include "oss_api.h"
#include "aos_http_io.h"
/* yourEndpoint填寫B(tài)ucket所在地域?qū)?yīng)的Endpoint。以華東1(杭州)為例,Endpoint填寫為https://oss-cn-hangzhou.aliyuncs.com。*/
const char *endpoint = "yourEndpoint";
/* 填寫B(tài)ucket名稱,例如examplebucket。*/
const char *bucket_name = "examplebucket";
/* 填寫Object完整路徑,完整路徑中不能包含Bucket名稱,例如exampledir/exampleobject.txt。*/
const char *object_name = "exampledir/exampleobject.txt";
/* yourRegion填寫B(tài)ucket所在地域?qū)?yīng)的Region。以華東1(杭州)為例,Region填寫為cn-hangzhou。*/
const char *region = "yourRegion";
void init_options(oss_request_options_t *options)
{
options->config = oss_config_create(options->pool);
/* 用char*類型的字符串初始化aos_string_t類型。*/
aos_str_set(&options->config->endpoint, endpoint);
/* 從環(huán)境變量中獲取訪問憑證。運(yùn)行本代碼示例之前,請(qǐng)確保已設(shè)置環(huán)境變量OSS_ACCESS_KEY_ID和OSS_ACCESS_KEY_SECRET。*/
aos_str_set(&options->config->access_key_id, getenv("OSS_ACCESS_KEY_ID"));
aos_str_set(&options->config->access_key_secret, getenv("OSS_ACCESS_KEY_SECRET"));
//需要額外配置以下兩個(gè)參數(shù)
aos_str_set(&options->config->region, region);
options->config->signature_version = 4;
/* 是否使用了CNAME。0表示不使用。*/
options->config->is_cname = 0;
/* 用于設(shè)置網(wǎng)絡(luò)相關(guān)參數(shù),比如超時(shí)時(shí)間等。*/
options->ctl = aos_http_controller_create(options->pool, 0);
}
int main(int argc, char *argv[])
{
/* 在程序入口調(diào)用aos_http_io_initialize方法來初始化網(wǎng)絡(luò)、內(nèi)存等全局資源。*/
if (aos_http_io_initialize(NULL, 0) != AOSE_OK) {
exit(1);
}
/* 用于內(nèi)存管理的內(nèi)存池(pool),等價(jià)于apr_pool_t。其實(shí)現(xiàn)代碼在apr庫(kù)中。*/
aos_pool_t *pool;
/* 重新創(chuàng)建一個(gè)內(nèi)存池,第二個(gè)參數(shù)是NULL,表示沒有繼承其它內(nèi)存池。*/
aos_pool_create(&pool, NULL);
/* 創(chuàng)建并初始化options,該參數(shù)包括endpoint、access_key_id、acces_key_secret、is_cname、curl等全局配置信息。*/
oss_request_options_t *oss_client_options;
/* 在內(nèi)存池中分配內(nèi)存給options。*/
oss_client_options = oss_request_options_create(pool);
/* 初始化Client的選項(xiàng)oss_client_options。*/
init_options(oss_client_options);
/* 初始化參數(shù)。*/
aos_string_t bucket;
aos_string_t object;
aos_string_t file;
aos_table_t *headers = NULL;
aos_table_t *params = NULL;
aos_table_t *resp_headers = NULL;
aos_status_t *resp_status = NULL;
aos_str_set(&bucket, bucket_name);
aos_str_set(&object, object_name);
/* 將圖片縮放為固定寬高100 px后,再旋轉(zhuǎn)90°。*/
params = aos_table_make(pool, 1);
apr_table_set(params, OSS_PROCESS, "image/resize,m_fixed,w_100,h_100/rotate,90");
/* 將處理后的圖片保存到本地。*/
aos_str_set(&file, "yourLocalFileName");
resp_status = oss_get_object_to_file(oss_client_options, &bucket, &object, headers, params, &file, &resp_headers);
if (aos_status_is_ok(resp_status)) {
printf("get object to file succeeded\n");
} else {
printf("get object to file failed\n");
}
/* 釋放內(nèi)存池,相當(dāng)于釋放了請(qǐng)求過程中各資源分配的內(nèi)存。*/
aos_pool_destroy(pool);
/* 釋放之前分配的全局資源。*/
aos_http_io_deinitialize();
return 0;
}
OSSGetObjectRequest * request = [OSSGetObjectRequest new];
// 填寫圖片所在Bucket的名稱。
request.bucketName = @"examplebucket";
// 填寫圖片名稱。如果圖片不在Bucket根目錄,需攜帶文件完整路徑,例如exampledir/example.jpg。
request.objectKey = @"exampledir/example.jpg";
// 圖片處理。
request.xOssProcess = @"image/resize,m_lfit,w_100,h_100";
OSSTask * getTask = [client getObject:request];
[getTask continueWithBlock:^id(OSSTask *task) {
if (!task.error) {
NSLog(@"download image success!");
OSSGetObjectResult * getResult = task.result;
NSLog(@"download image data: %@", getResult.downloadedData);
} else {
NSLog(@"download object failed, error: %@" ,task.error);
}
return nil;
}];
// [getTask waitUntilFinished];
// [request cancel];
// 構(gòu)造圖片下載請(qǐng)求。
// 依次填寫B(tài)ucket名稱(例如examplebucket)和Object完整路徑(例如exampledir/exampleobject.txt)。Object完整路徑中不能包含Bucket名稱。
GetObjectRequest request = new GetObjectRequest("examplebucket", "exampledir/exampleobject.txt");
// 圖片處理。
request.setxOssProcess("image/resize,m_fixed,w_100,h_100");
OSSAsyncTask task = oss.asyncGetObject(get, new OSSCompletedCallback<GetObjectRequest, GetObjectResult>() {
@Override
public void onSuccess(GetObjectRequest request, GetObjectResult result) {
// 請(qǐng)求成功。
InputStream inputStream = result.getObjectContent();
byte[] buffer = new byte[2048];
int len;
try {
while ((len = inputStream.read(buffer)) != -1) {
// 處理下載的數(shù)據(jù)。
}
} catch (IOException e) {
e.printStackTrace();
}
}
@Override
public void onFailure(GetObjectRequest request, ClientException clientExcepion, ServiceException serviceException) {
// 處理異常,用戶可自行填寫。
}
});
添加圖片樣式
您可以通過圖片樣式將多個(gè)圖片處理參數(shù)封裝在一個(gè)樣式中,然后使用圖片樣式批量處理圖片。以下僅列舉常見SDK的使用圖片樣式處理圖片的代碼示例,關(guān)于其他SDK的使用圖片樣式處理圖片的代碼示例,請(qǐng)參見簡(jiǎn)介。
import com.aliyun.oss.*;
import com.aliyun.oss.common.auth.*;
import com.aliyun.oss.model.GetObjectRequest;
import java.io.File;
public class Demo {
public static void main(String[] args) throws Throwable {
// Endpoint以華東1(杭州)為例,其它Region請(qǐng)按實(shí)際情況填寫。
String endpoint = "https://oss-cn-hangzhou.aliyuncs.com";
// 從環(huán)境變量中獲取訪問憑證。運(yùn)行本代碼示例之前,請(qǐng)確保已設(shè)置環(huán)境變量OSS_ACCESS_KEY_ID和OSS_ACCESS_KEY_SECRET。
EnvironmentVariableCredentialsProvider credentialsProvider = CredentialsProviderFactory.newEnvironmentVariableCredentialsProvider();
// 填寫B(tài)ucket名稱,例如examplebucket。
String bucketName = "examplebucket";
// 填寫Object完整路徑。Object完整路徑中不能包含Bucket名稱。
String objectName = "exampleobject.jpg";
// 填寫本地文件的完整路徑,例如D:\\localpath\\example-new.jpg。如果指定的本地文件存在會(huì)覆蓋,不存在則新建。
String pathName = "D:\\localpath\\example-new.jpg";
// 填寫B(tài)ucket所在地域。以華東1(杭州)為例,Region填寫為cn-hangzhou。
String region = "cn-hangzhou";
// 創(chuàng)建OSSClient實(shí)例。
ClientBuilderConfiguration clientBuilderConfiguration = new ClientBuilderConfiguration();
clientBuilderConfiguration.setSignatureVersion(SignVersion.V4);
OSS ossClient = OSSClientBuilder.create()
.endpoint(endpoint)
.credentialsProvider(credentialsProvider)
.clientConfiguration(clientBuilderConfiguration)
.region(region)
.build();
try {
// 使用自定義樣式處理圖片。
// yourCustomStyleName填寫通過OSS管理控制臺(tái)創(chuàng)建的圖片樣式名稱。
String style = "style/yourCustomStyleName";
GetObjectRequest request = new GetObjectRequest(bucketName, objectName);
request.setProcess(style);
// 將處理后的圖片命名為example-new.jpg并保存到本地。
// 如果未指定本地路徑只填寫了文件名稱(例如example-new.jpg),則文件默認(rèn)保存到示例程序所屬項(xiàng)目對(duì)應(yīng)本地路徑中。
ossClient.getObject(request, new File(pathName));
} catch (OSSException oe) {
System.out.println("Caught an OSSException, which means your request made it to OSS, "
+ "but was rejected with an error response for some reason.");
System.out.println("Error Message:" + oe.getErrorMessage());
System.out.println("Error Code:" + oe.getErrorCode());
System.out.println("Request ID:" + oe.getRequestId());
System.out.println("Host ID:" + oe.getHostId());
} catch (ClientException ce) {
System.out.println("Caught an ClientException, which means the client encountered "
+ "a serious internal problem while trying to communicate with OSS, "
+ "such as not being able to access the network.");
System.out.println("Error Message:" + ce.getMessage());
} finally {
if (ossClient != null) {
ossClient.shutdown();
}
}
}
}
<?php
if (is_file(__DIR__ . '/../autoload.php')) {
require_once __DIR__ . '/../autoload.php';
}
if (is_file(__DIR__ . '/../vendor/autoload.php')) {
require_once __DIR__ . '/../vendor/autoload.php';
}
use OSS\Credentials\EnvironmentVariableCredentialsProvider;
use OSS\OssClient;
// 從環(huán)境變量中獲取訪問憑證。運(yùn)行本代碼示例之前,請(qǐng)確保已設(shè)置環(huán)境變量OSS_ACCESS_KEY_ID和OSS_ACCESS_KEY_SECRET。
$provider = new EnvironmentVariableCredentialsProvider();
// yourEndpoint填寫B(tài)ucket所在地域?qū)?yīng)的Endpoint。以華東1(杭州)為例,Endpoint填寫為https://oss-cn-hangzhou.aliyuncs.com。
$endpoint = "yourEndpoint";
// 填寫B(tài)ucket名稱,例如examplebucket。
$bucket= "examplebucket";
// 填寫Object完整路徑,例如exampledir/exampleobject.jpg。Object完整路徑中不能包含Bucket名稱。
$object = "exampledir/exampleobject.jpg";
// 填寫本地文件的完整路徑,例如D:\\localpath\\example-new.jpg。如果指定的本地文件存在會(huì)覆蓋,不存在則新建。
// 如果未指定本地路徑只填寫了本地文件名稱(例如example-new.jpg),則文件默認(rèn)保存到示例程序所屬項(xiàng)目對(duì)應(yīng)本地路徑中。
$download_file = "D:\\localpath\\example-new.jpg";
$config = array(
"provider" => $provider,
"endpoint" => $endpoint,
"signatureVersion" => OssClient::OSS_SIGNATURE_VERSION_V4,
"region"=> "cn-hangzhou"
);
$ossClient = new OssClient($config);
// 如果目標(biāo)圖片不在指定Bucket中,需上傳圖片到目標(biāo)Bucket。
// $ossClient->uploadFile($bucket, $object, "D:\\localpath\\exampleobject.jpg");
// 使用自定義樣式處理圖片。
// yourCustomStyleName填寫通過OSS管理控制臺(tái)創(chuàng)建的圖片樣式名稱。
$style = "style/yourCustomStyleName";
$options = array(
OssClient::OSS_FILE_DOWNLOAD => $download_file,
OssClient::OSS_PROCESS => $style);
// 將處理后的圖片命名為example-new.jpg并保存到本地。
$ossClient->getObject($bucket, $object, $options);
// 圖片處理完成后,如果Bucket中的原圖不再需要,可以刪除原圖。
// $ossClient->deleteObject($bucket, $object);
const OSS = require('ali-oss');
const client = new OSS({
// yourregion填寫B(tài)ucket所在地域。以華東1(杭州)為例,Region填寫為oss-cn-hangzhou。
region: 'yourregion',
// 從環(huán)境變量中獲取訪問憑證。運(yùn)行本代碼示例之前,請(qǐng)確保已設(shè)置環(huán)境變量OSS_ACCESS_KEY_ID和OSS_ACCESS_KEY_SECRET。
accessKeyId: process.env.OSS_ACCESS_KEY_ID,
accessKeySecret: process.env.OSS_ACCESS_KEY_SECRET,
authorizationV4: true,
// yourbucketname填寫存儲(chǔ)空間名稱。
bucket: 'yourbucketname'
});
// 將圖片縮放為固定寬高100 px。
async function scale() {
try {
const result = await client.get('example.jpg', './example-resize.jpg', { process: 'image/resize,m_fixed,w_100,h_100'});
} catch (e) {
console.log(e);
}
}
scale()
// 從坐標(biāo)(100,100)開始,將圖片裁剪為寬高100 px。
async function cut() {
try {
const result = await client.get('example.jpg', './example-crop.jpg', { process: 'image/crop,w_100,h_100,x_100,y_100,r_1'});
} catch (e) {
console.log(e)
}
}
cut()
// 將圖片旋轉(zhuǎn)90°。
async function rotate() {
try {
const result = await client.get('example.jpg', './example-rotate.jpg', { process: 'image/rotate,90'});
} catch (e) {
console.log(e);
}
}
rotate()
// 將圖片進(jìn)行銳化,銳化參數(shù)為100。
async function sharpen() {
try {
const result = await client.get('example.jpg', './example-sharpen.jpg', { process: 'image/sharpen,100'});
} catch (e) {
console.log(e);
}
}
sharpen()
// 在圖片中添加水印。
async function watermark() {
try {
const result = await client.get('example.jpg', './example-watermark.jpg', { process: 'image/watermark,text_SGVsbG8g5Zu-54mH5pyN5YqhIQ'});
} catch (e) {
console.log(e);
}
}
watermark()
// 將圖片進(jìn)行格式轉(zhuǎn)換。
async function format() {
try {
const result = await client.get('example.jpg', './example-format.jpg', { process: 'image/format,png'});
} catch (e) {
console.log(e);
}
}
format()
// 獲取圖片信息。
async function info() {
try {
const result = await client.get('example.jpg', './example-info.txt', {process: 'image/info'});
} catch (e) {
console.log(e);
}
}
info()
# -*- coding: utf-8 -*-
import os
import oss2
from oss2.credentials import EnvironmentVariableCredentialsProvider
# 從環(huán)境變量中獲取訪問憑證。運(yùn)行本代碼示例之前,請(qǐng)確保已設(shè)置環(huán)境變量OSS_ACCESS_KEY_ID和OSS_ACCESS_KEY_SECRET。
auth = oss2.ProviderAuthV4(EnvironmentVariableCredentialsProvider())
# 填寫B(tài)ucket所在地域?qū)?yīng)的Endpoint。以華東1(杭州)為例,Endpoint填寫為https://oss-cn-hangzhou.aliyuncs.com。
endpoint = "https://oss-cn-hangzhou.aliyuncs.com"
# 填寫Endpoint對(duì)應(yīng)的Region信息,例如cn-hangzhou。注意,v4簽名下,必須填寫該參數(shù)
region = "cn-hangzhou"
# examplebucket填寫存儲(chǔ)空間名稱。
bucket = oss2.Bucket(auth, endpoint, "examplebucket", region=region)
# 指定原圖所在的Bucket名稱,例如examplebucket。
bucket_name = 'examplebucket'
# 指定原圖名稱。如果圖片不在Bucket根目錄,需攜帶圖片完整路徑,例如exampledir/example.jpg。
key = 'exampledir/example.jpg'
# 指定處理后的圖片名稱。
new_pic = 'exampledir/newexample.jpg'
# 如果圖片不在指定Bucket內(nèi),需將本地路徑下的圖片上傳到指定Bucket。
# bucket.put_object_from_file(key, 'D:\\localpath\\example.jpg')
# 使用自定義樣式處理圖片。其中,yourCustomStyleName填寫通過OSS管理控制臺(tái)創(chuàng)建的圖片樣式名稱。
style = 'style/yourCustomStyleName'
# 將處理后的圖片保存在本地。
bucket.get_object_to_file(key, new_pic, process=style)
# 圖片處理完成后,如果Bucket內(nèi)的原圖不再需要,可將其刪除。
# bucket.delete_object(key)
# 如果處理后的圖片不再需要,可將其刪除。
# os.remove(new_pic)
package main
import (
"fmt"
"os"
"github.com/aliyun/aliyun-oss-go-sdk/oss"
)
func HandleError(err error) {
fmt.Println("Error:", err)
os.Exit(-1)
}
func main() {
// 從環(huán)境變量中獲取訪問憑證。運(yùn)行本代碼示例之前,請(qǐng)確保已設(shè)置環(huán)境變量OSS_ACCESS_KEY_ID和OSS_ACCESS_KEY_SECRET。
provider, err := oss.NewEnvironmentVariableCredentialsProvider()
if err != nil {
fmt.Println("Error:", err)
os.Exit(-1)
}
// 創(chuàng)建OSSClient實(shí)例。
// yourEndpoint填寫B(tài)ucket對(duì)應(yīng)的Endpoint,以華東1(杭州)為例,填寫為https://oss-cn-hangzhou.aliyuncs.com。其它Region請(qǐng)按實(shí)際情況填寫。
// yourRegion填寫B(tài)ucket所在地域,以華東1(杭州)為例,填寫為cn-hangzhou。其它Region請(qǐng)按實(shí)際情況填寫。
clientOptions := []oss.ClientOption{oss.SetCredentialsProvider(&provider)}
clientOptions = append(clientOptions, oss.Region("yourRegion"))
// 設(shè)置簽名版本
clientOptions = append(clientOptions, oss.AuthVersion(oss.AuthV4))
client, err := oss.New("yourEndpoint", "", "", clientOptions...)
if err != nil {
fmt.Println("Error:", err)
os.Exit(-1)
}
// 指定原圖所在的Bucket名稱,例如examplebucket。
bucketName := "examplebucket"
bucket, err := client.Bucket(bucketName)
if err != nil {
HandleError(err)
}
// 指定原圖名稱。如果圖片不在Bucket根目錄,需攜帶文件完整路徑,例如example/example.jpg。
sourceImageName := "example/example.jpg"
// 將處理后的圖片命名為newexample.jpg并保存到本地。
targetImageName := "D:\\localpath\\newexample.jpg"
// 使用圖片樣式處理圖片。其中,yourCustomStyleName填寫通過OSS管理控制臺(tái)創(chuàng)建的圖片樣式名稱。
style := "style/yourCustomStyleName"
// 將處理后的圖片保存在本地。
err = bucket.GetObjectToFile(sourceImageName, targetImageName, oss.Process(style))
if err != nil {
HandleError(err)
}
}
#include <alibabacloud/oss/OssClient.h>
using namespace AlibabaCloud::OSS;
int main(void)
{
/* 初始化OSS賬號(hào)信息。*/
/* yourEndpoint填寫B(tài)ucket所在地域?qū)?yīng)的Endpoint。以華東1(杭州)為例,Endpoint填寫為https://oss-cn-hangzhou.aliyuncs.com。*/
std::string Endpoint = "yourEndpoint";
/* yourRegion填寫B(tài)ucket所在地域?qū)?yīng)的Region。以華東1(杭州)為例,Region填寫為cn-hangzhou。*/
std::string Region = "yourRegion";
/* 指定原圖所在的Bucket名稱,例如examplebucket。*/
std::string BucketName = "examplebucket";
/* 指定原圖名稱。如果圖片不在Bucket根目錄,需攜帶圖片完整路徑,例如exampledir/example.jpg。*/
std::string ObjectName = "exampledir/example.jpg";
/* 初始化網(wǎng)絡(luò)等資源。*/
InitializeSdk();
ClientConfiguration conf;
conf.signatureVersion = SignatureVersionType::V4;
/* 從環(huán)境變量中獲取訪問憑證。運(yùn)行本代碼示例之前,請(qǐng)確保已設(shè)置環(huán)境變量OSS_ACCESS_KEY_ID和OSS_ACCESS_KEY_SECRET。*/
auto credentialsProvider = std::make_shared<EnvironmentVariableCredentialsProvider>();
OssClient client(Endpoint, credentialsProvider, conf);
client.SetRegion(Region);
/* 使用圖片樣式處理圖片。其中,yourCustomStyleName填寫步驟1創(chuàng)建的圖片樣式名稱。*/
std::string Process = "style/yourCustomStyleName";
GetObjectRequest request(BucketName, ObjectName);
request.setProcess(Process);
auto outcome = client.GetObject(request);
if (outcome.isSuccess()) {
std::cout << "Image processed successfully." << std::endl;
} else {
std::cout << "Failed to process image. Error code: " << outcome.error().Code()
<< ", Message: " << outcome.error().Message()
<< ", RequestId: " << outcome.error().RequestId() << std::endl;
}
/* 釋放網(wǎng)絡(luò)等資源。*/
ShutdownSdk();
return 0;
}
#include "oss_api.h"
#include "aos_http_io.h"
/* yourEndpoint填寫B(tài)ucket所在地域?qū)?yīng)的Endpoint。以華東1(杭州)為例,Endpoint填寫為https://oss-cn-hangzhou.aliyuncs.com。*/
const char *endpoint = "yourEndpoint";
/* 填寫B(tài)ucket名稱,例如examplebucket。*/
const char *bucket_name = "examplebucket";
/* 填寫Object完整路徑,完整路徑中不能包含Bucket名稱,例如exampledir/exampleobject.txt。*/
const char *object_name = "exampledir/exampleobject.txt";
/* yourRegion填寫B(tài)ucket所在地域?qū)?yīng)的Region。以華東1(杭州)為例,Region填寫為cn-hangzhou。*/
const char *region = "yourRegion";
void init_options(oss_request_options_t *options)
{
options->config = oss_config_create(options->pool);
/* 用char*類型的字符串初始化aos_string_t類型。*/
aos_str_set(&options->config->endpoint, endpoint);
/* 從環(huán)境變量中獲取訪問憑證。運(yùn)行本代碼示例之前,請(qǐng)確保已設(shè)置環(huán)境變量OSS_ACCESS_KEY_ID和OSS_ACCESS_KEY_SECRET。*/
aos_str_set(&options->config->access_key_id, getenv("OSS_ACCESS_KEY_ID"));
aos_str_set(&options->config->access_key_secret, getenv("OSS_ACCESS_KEY_SECRET"));
//需要額外配置以下兩個(gè)參數(shù)
aos_str_set(&options->config->region, region);
options->config->signature_version = 4;
/* 是否使用了CNAME。0表示不使用。*/
options->config->is_cname = 0;
/* 用于設(shè)置網(wǎng)絡(luò)相關(guān)參數(shù),比如超時(shí)時(shí)間等。*/
options->ctl = aos_http_controller_create(options->pool, 0);
}
int main(int argc, char *argv[])
{
/* 在程序入口調(diào)用aos_http_io_initialize方法來初始化網(wǎng)絡(luò)、內(nèi)存等全局資源。*/
if (aos_http_io_initialize(NULL, 0) != AOSE_OK) {
exit(1);
}
/* 用于內(nèi)存管理的內(nèi)存池(pool),等價(jià)于apr_pool_t。其實(shí)現(xiàn)代碼在apr庫(kù)中。*/
aos_pool_t *pool;
/* 重新創(chuàng)建一個(gè)內(nèi)存池,第二個(gè)參數(shù)是NULL,表示沒有繼承其它內(nèi)存池。*/
aos_pool_create(&pool, NULL);
/* 創(chuàng)建并初始化options,該參數(shù)包括endpoint、access_key_id、acces_key_secret、is_cname、curl等全局配置信息。*/
oss_request_options_t *oss_client_options;
/* 在內(nèi)存池中分配內(nèi)存給options。*/
oss_client_options = oss_request_options_create(pool);
/* 初始化Client的選項(xiàng)oss_client_options。*/
init_options(oss_client_options);
/* 初始化參數(shù)。*/
aos_string_t bucket;
aos_string_t object;
aos_string_t file;
aos_table_t *headers = NULL;
aos_table_t *params = NULL;
aos_table_t *resp_headers = NULL;
aos_status_t *resp_status = NULL;
aos_str_set(&bucket, bucket_name);
aos_str_set(&object, object_name);
/* 指定圖片樣式。*/
params = aos_table_make(pool, 1);
/* yourCustomStyleName填寫步驟1創(chuàng)建的圖片樣式名稱。*/
apr_table_set(params, OSS_PROCESS, "style/yourCustomStyleName");
/* 將處理后的圖片保存到本地。*/
aos_str_set(&file, "yourLocalFileName");
resp_status = oss_get_object_to_file(oss_client_options, &bucket, &object, headers, params, &file, &resp_headers);
if (aos_status_is_ok(resp_status)) {
printf("get object to file succeeded\n");
} else {
printf("get object to file failed\n");
}
/* 釋放內(nèi)存池,相當(dāng)于釋放了請(qǐng)求過程中各資源分配的內(nèi)存。*/
aos_pool_destroy(pool);
/* 釋放之前分配的全局資源。*/
aos_http_io_deinitialize();
return 0;
}
使用REST API
如果您的程序自定義要求較高,您可以直接發(fā)起REST API請(qǐng)求。直接發(fā)起REST API請(qǐng)求需要手動(dòng)編寫代碼計(jì)算簽名。
您可以通過在GetObject接口中添加圖片處理參數(shù)或圖片樣式參數(shù)的方式來處理圖片。更多信息,請(qǐng)參見GetObject。
添加圖片處理參數(shù)
請(qǐng)求示例如下:
GET /oss.jpg?x-oss-process=image/resize,w_100 HTTP/1.1 Host: oss-example.oss-cn-hangzhou.aliyuncs.com Date: Fri, 28 Oct 2022 06:40:10 GMT Authorization: AuthorizationValue
添加圖片樣式參數(shù)
請(qǐng)求示例如下:
GET /oss.jpg?x-oss-process=style/styleexample HTTP/1.1 Host: oss-example.oss-cn-hangzhou.aliyuncs.com Date: Fri, 28 Oct 2022 06:40:10 GMT Authorization: AuthorizationValue
更多參考
圖片處理服務(wù)默認(rèn)不保存處理后的圖片。您可以在圖片處理的請(qǐng)求內(nèi)添加轉(zhuǎn)存參數(shù),將處理后的圖片作為Object保存至指定的Bucket內(nèi)。具體操作,請(qǐng)參見圖片處理持久化。