本文介紹在不提供資源擁有者所屬賬號的訪問密鑰(AccessKey)的情況下,通過臨時訪問憑證以及簽名URL的方式授權第三方下載文件(Object)。
臨時訪問憑證
OSS可以通過阿里云STS(Security Token Service)進行臨時授權訪問。阿里云STS是為云計算用戶提供臨時訪問令牌的Web服務。通過STS,您可以為第三方應用或子用戶(即用戶身份由您自己管理的用戶)頒發一個自定義時效和權限的訪問憑證。關于STS的更多信息,請參見STS介紹。
STS的優勢如下:
您無需透露您的長期密鑰(AccessKey)給第三方應用,只需生成一個訪問令牌并將令牌交給第三方應用。您可以自定義這個令牌的訪問權限及有效期限。
您無需關心權限撤銷問題,訪問令牌過期后自動失效。
您可以通過調用STS服務的AssumeRole接口或者使用各語言STS SDK來獲取臨時訪問憑證。臨時訪問憑證包括臨時訪問密鑰(AccessKeyId和AccessKeySecret)和安全令牌(SecurityToken)。臨時訪問憑證有效時間單位為秒,最小值為900,最大值以當前角色設定的最大會話時間為準。更多信息,請參見設置角色最大會話時間。
以下僅列舉常見SDK的通過STS臨時授權第三方下載文件的代碼示例。關于其他SDK的通過STS臨時授權第三方下載文件的代碼示例,請參見SDK簡介。
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 {
// 以華東1(杭州)的外網Endpoint為例,其他Region請按實際情況填寫。
String endpoint = "https://oss-cn-hangzhou.aliyuncs.com";
// 從環境變量中獲取訪問憑證。運行本代碼示例之前,請確保已通過環境變量設置臨時訪問密鑰(OSS_ACCESS_KEY_ID和OSS_ACCESS_KEY_SECRET)以及安全令牌(OSS_SESSION_TOKEN)。
EnvironmentVariableCredentialsProvider credentialsProvider = CredentialsProviderFactory.newEnvironmentVariableCredentialsProvider();
// 填寫Bucket名稱,例如examplebucket。
String bucketName = "examplebucket";
// 填寫Object完整路徑,例如exampleobject.txt。Object完整路徑中不能包含Bucket名稱。
String objectName = "exampleobject.txt";
String pathName = "D:\\examplefile.txt";
// 從STS服務獲取臨時訪問憑證后,您可以通過臨時訪問密鑰和安全令牌生成OSSClient。
// 創建OSSClient實例。
OSS ossClient = new OSSClientBuilder().build(endpoint, credentialsProvider);
try {
// 下載OSS文件到本地文件。如果指定的本地文件存在則覆蓋,不存在則新建。
// 如果未指定本地路徑,則下載后的文件默認保存到示例程序所屬項目對應本地路徑中。
ossClient.getObject(new GetObjectRequest(bucketName, objectName), 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\OssClient;
use OSS\Core\OssException;
// 運行本代碼示例之前,請確保已通過環境變量配置從STS服務獲取的臨時訪問密鑰(OSS_ACCESS_KEY_ID和OSS_ACCESS_KEY_SECRET)以及安全令牌(OSS_SESSION_TOKEN)。
$accessKeyId = getenv("OSS_ACCESS_KEY_ID");
$accessKeySecret = getenv("OSS_ACCESS_KEY_SECRET");
$securityToken = getenv("OSS_SESSION_TOKEN");
// 填寫Bucket所在地域對應的Endpoint。以華東1(杭州)為例,Endpoint填寫為https://oss-cn-hangzhou.aliyuncs.com。
$endpoint = "https://oss-cn-hangzhou.aliyuncs.com";
// 填寫Bucket名稱,例如examplebucket。
$bucket = "examplebucket";
// 填寫不包含Bucket名稱在內的Object完整路徑。
$object = "exampledir/exampleobject.txt";
try {
$ossClient = new OssClient($accessKeyId, $accessKeySecret, $endpoint, false, $securityToken);
// 通過STS臨時授權下載文件。
$content = $ossClient->getObject($bucket, $object);
var_dump($content);
} catch (OssException $e) {
print $e->getMessage();
}
const axios = require("axios");
const OSS = require("ali-oss");
// 在客戶端使用臨時訪問憑證初始化OSS客戶端,用于臨時授權訪問OSS資源。
const getToken = async () => {
const token = await axios.get("http://localhost:9999/sts");
const client = new OSS({
// yourRegion填寫Bucket所在地域。以華東1(杭州)為例,yourRegion填寫為oss-cn-hangzhou。
region: "oss-cn-hangzhou",
// 通過STS服務生成臨時訪問憑證。臨時訪問憑證包括臨時訪問密鑰(AccessKeyId和AccessKeySecret)和安全令牌(SecurityToken)。
accessKeyId: token.data.AccessKeyId,
accessKeySecret: token.data.AccessKeySecret,
stsToken: token.data.SecurityToken,
// 填寫Bucket名稱,例如examplebucket。
bucket: "examplebucket",
refreshSTSToken: async () => {
const refreshToken = await axios.get("http://127.0.0.1:9999/sts");
return {
accessKeyId: refreshToken.data.AccessKeyId,
accessKeySecret: refreshToken.data.AccessKeySecret,
stsToken: refreshToken.data.SecurityToken,
};
},
});
return client;
};
// 獲取對象實例。
getToken().then((client) => {
// 通過STS臨時授權下載文件。
const url = client.signatureUrl("exampleobject.txt");
console.log(url);
});
# -*- coding: utf-8 -*-
import oss2
from oss2.credentials import EnvironmentVariableCredentialsProvider
# 從環境變量中獲取訪問憑證。運行本代碼示例之前,請確保已通過環境變量設置臨時訪問密鑰(OSS_ACCESS_KEY_ID和OSS_ACCESS_KEY_SECRET)以及安全令牌OSS_SESSION_TOKEN。
auth = oss2.ProviderAuth(EnvironmentVariableCredentialsProvider())
# 填寫Bucket所在地域對應的Endpoint。以華東1(杭州)為例,Endpoint填寫為https://oss-cn-hangzhou.aliyuncs.com。
# 填寫Bucket名稱,例如examplebucket。
bucket = oss2.Bucket(auth, 'https://oss-cn-hangzhou.aliyuncs.com', 'examplebucket')
# 填寫Object完整路徑和字符串。Object完整路徑中不能包含Bucket名稱。
object_name = 'exampleobject.txt'
# 下載Object。
read_obj = bucket.get_object(object_name)
print(read_obj.read())
package main
import (
"fmt"
"github.com/aliyun/aliyun-oss-go-sdk/oss"
"os"
)
func main() {
// 從環境變量中獲取臨時訪問憑證。運行本代碼示例之前,請確保已設置環境變量OSS_ACCESS_KEY_ID、OSS_ACCESS_KEY_SECRET、OSS_SESSION_TOKEN。
provider, err := oss.NewEnvironmentVariableCredentialsProvider()
if err != nil {
fmt.Println("Error:", err)
os.Exit(-1)
}
// 創建OSSClient實例。
// yourEndpoint填寫Bucket對應的Endpoint,以華東1(杭州)為例,填寫為https://oss-cn-hangzhou.aliyuncs.com。其它Region請按實際情況填寫。
client, err := oss.New("yourEndpoint", "", "", oss.SetCredentialsProvider(&provider))
if err != nil {
fmt.Println("Error:", err)
os.Exit(-1)
}
// 填寫Bucket名稱,例如examplebucket。
bucketName := "examplebucket"
// 填寫Object的完整路徑,完整路徑中不能包含Bucket名稱,例如exampledir/exampleobject.txt。
objectName := "exampledir/exampleobject.txt"
// 填寫本地文件的完整路徑,例如D:\\localpath\\examplefile.txt。
filepath := "D:\\localpath\\examplefile.txt"
bucket,err := client.Bucket(bucketName)
// 通過STS授權第三方下載文件。
err = bucket.GetObjectToFile(objectName,filepath)
if err != nil {
fmt.Println("Error:", err)
os.Exit(-1)
}
fmt.Println("download success")
}
using Aliyun.OSS;
// yourEndpoint填寫Bucket所在地域對應的Endpoint。以華東1(杭州)為例,Endpoint填寫為https://oss-cn-hangzhou.aliyuncs.com。
var endpoint = "yourEndpoint";
// 從環境變量中獲取訪問憑證。運行本代碼示例之前,請確保已通過環境變量設置臨時訪問密鑰(OSS_ACCESS_KEY_ID和OSS_ACCESS_KEY_SECRET)以及安全令牌OSS_SESSION_TOKEN。
var accessKeyId = Environment.GetEnvironmentVariable("OSS_ACCESS_KEY_ID");
var accessKeySecret = Environment.GetEnvironmentVariable("OSS_ACCESS_KEY_SECRET");
var securityToken = Environment.GetEnvironmentVariable("OSS_SESSION_TOKEN");
// 填寫Bucket名稱,例如examplebucket。
var bucketName = "examplebucket";
// 填寫Object完整路徑,完整路徑中不能包含Bucket名稱,例如exampledir/exampleobject.txt。
var objectName = "exampledir/exampleobject.txt";
// 填寫本地文件的完整路徑,例如D:\\localpath\\examplefile.txt。
var downloadFilename = "D:\\localpath\\examplefile.txt";
// 創建OSSClient實例。
var ossStsClient = new OssClient(endpoint, accessKeyId, accessKeySecret, securityToken);
try
{
// 下載文件到流。OssObject包含了文件的各種信息,如文件所在的存儲空間、文件名、元數據以及一個輸入流。
var obj = client.GetObject(bucketName, objectName);
using (var requestStream = obj.Content)
{
byte[] buf = new byte[1024];
var fs = File.Open(downloadFilename, FileMode.OpenOrCreate);
var len = 0;
// 通過輸入流將文件的內容讀取到文件或者內存中。
while ((len = requestStream.Read(buf, 0, 1024)) != 0)
{
fs.Write(buf, 0, len);
}
fs.Close();
}
Console.WriteLine("Get object succeeded");
}
catch (Exception ex)
{
Console.WriteLine("Get object failed. {0}", ex.Message);
}
簽名URL
由于STS臨時賬號以及簽名URL均需設置有效時長,當您使用STS臨時賬號生成簽名URL執行相關操作(例如上傳、下載文件)時,以最小的有效時長為準。例如您的STS臨時賬號的有效時長設置為1200秒、簽名URL設置為3600秒時,當有效時長超過1200秒后,您無法使用此STS臨時賬號生成的簽名URL上傳文件。
您可以將生成的簽名URL提供給訪客進行臨時訪問。生成簽名URL時,您可以自定義URL的過期時間來限制訪客的訪問時長。
在URL中加入簽名信息,以便將該URL轉給第三方實現授權訪問。更多信息,請參見在URL中包含簽名。
通過以下示例生成的簽名URL中如果包含特殊符號+
,可能出現無法正常訪問該簽名URL的現象。如需正常訪問該簽名URL,請將簽名URL中的+
替換為%2B
。
登錄OSS管理控制臺。
單擊Bucket 列表,然后單擊目標Bucket名稱。
在左側導航欄,選擇
。獲取文件URL。
獲取單個文件URL
單擊目標文件名稱。
在詳情面板配置以下參數,然后單擊復制文件URL。
參數
說明
過期時間
當目標文件為私有文件時,需設置文件URL的有效時間。
取值范圍:60~32400
單位:秒
如果您希望獲取更長時效的文件URL,建議使用命令行工具ossutil或圖形化工具ossbrowser。
自有域名
如需確保第三方訪問圖片或網頁文件時是預覽行為,請使用Bucket綁定的自定義域名生成文件URL。
僅當Bucket綁定自定義域名后可配置此項。更多信息,請參見綁定自定義域名。
使用HTTPS
默認使用HTTPS協議生成文件URL。如需使用HTTP協議生成文件URL,請關閉使用HTTPS開關。
批量獲取文件URL
選中多個目標文件,然后單擊導出URL列表。
在導出URL列表面板配置以下參數:
參數
說明
是否編碼
選擇是否對導出的文件URL進行URL編碼。通過URL編碼可以避免URL中包含特殊符號(例如+)時無法正常訪問URL的情況。
使用HTTPS
默認使用HTTPS協議生成文件URL。如需使用HTTP協議生成文件URL,請關閉使用HTTPS開關。
過期時間
當目標文件為私有文件時,需設置文件URL的有效時間。
取值范圍:60~32400
單位:秒
如果您希望獲取更長時效的文件URL,建議使用命令行工具ossutil或圖形化工具ossbrowser。
自有域名
如需確保第三方訪問圖片或網頁文件時是預覽行為,請使用Bucket綁定的自定義域名生成文件URL。
僅當Bucket綁定自定義域名后可配置此項。更多信息,請參見綁定自定義域名。
傳輸加速域名
如果第三方涉及跨國或跨洋等超遠距離文件訪問場景時,建議使用傳輸加速域名生成文件URL。
僅當Bucket開啟傳輸加速后可配置此項。更多信息,請參見開啟傳輸加速。
單擊確定,然后將URL列表文件保存到本地。
將文件URL分享給第三方進行下載。
以下僅列舉常見SDK的通過簽名URL授權第三方下載文件的代碼示例。關于其他SDK的通過簽名URL授權第三方下載文件的代碼示例,請參見SDK簡介。
<?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\OssClient;
use OSS\Core\OssException;
use OSS\Http\RequestCore;
use OSS\Http\ResponseCore;
// 從環境變量中獲取訪問憑證。運行本代碼示例之前,請確保已設置環境變量OSS_ACCESS_KEY_ID和OSS_ACCESS_KEY_SECRET。
$accessKeyId = getenv("OSS_ACCESS_KEY_ID");
$accessKeySecret = getenv("OSS_ACCESS_KEY_SECRET");
// yourEndpoint填寫Bucket所在地域對應的Endpoint。以華東1(杭州)為例,Endpoint填寫為https://oss-cn-hangzhou.aliyuncs.com。
$endpoint = "yourEndpoint";
// 填寫Bucket名稱。
$bucket= "examplebucket";
// 填寫不包含Bucket名稱在內的Object完整路徑。
$object = "exampleobject.txt";
// 設置簽名URL的有效時長為3600秒。
$timeout = 3600;
// 生成預覽的簽名URL,然后使用Bucket綁定的自定義域名進行訪問。
$options= array(
"response-content-disposition"=>"inline",);
// 生成下載的簽名URL。
/*$options = array(
"response-content-disposition"=>"attachment",
);*/
try {
$ossClient = new OssClient($accessKeyId, $accessKeySecret, $endpoint, false);
$signedUrl = $ossClient->signUrl($bucket, $object, $timeout,'GET',$options);
} catch (OssException $e) {
printf(__FUNCTION__ . ": FAILED\n");
printf($e->getMessage() . "\n");
return;
}
print(__FUNCTION__ . ": signedUrl: " . $signedUrl . "\n");
const OSS = require("ali-oss");
const client = new OSS({
// yourRegion填寫Bucket所在地域。以華東1(杭州)為例,yourRegion填寫為oss-cn-hangzhou。
region: "oss-cn-hangzhou",
// 從環境變量中獲取訪問憑證。運行本代碼示例之前,請確保已設置環境變量OSS_ACCESS_KEY_ID和OSS_ACCESS_KEY_SECRET。
accessKeyId: process.env.OSS_ACCESS_KEY_ID,
accessKeySecret: process.env.OSS_ACCESS_KEY_SECRET,
// 填寫Bucket名稱,例如examplebucket。
bucket: "examplebucket",
});
// 配置exampleobject.txt文件HTTP頭中的Content-Disposition為attachment,實現瀏覽器訪問時自動下載文件,并自定義下載后的文件名稱。
// 如果您希望直接在瀏覽器中預覽文件,配置文件HTTP頭中的Content-Disposition為inline并使用Bucket綁定的自定義域名進行訪問。
const filename = "ossdemo.txt"; // 自定義下載后的文件名稱。
const response = {
"content-disposition": `attachment; filename=${encodeURIComponent(filename)}`,
};
// 填寫待下載Object的完整路徑,完整路徑中不能包含Bucket名稱。
const url = client.signatureUrl("exampleobject.txt", {
// 設置過期時間為3600s。
expires: 3600,
response,
});
console.log(url);
# -*- coding: utf-8 -*-
import oss2
from oss2.credentials import EnvironmentVariableCredentialsProvider
# 從環境變量中獲取訪問憑證。運行本代碼示例之前,請確保已設置環境變量OSS_ACCESS_KEY_ID和OSS_ACCESS_KEY_SECRET。
auth = oss2.ProviderAuth(EnvironmentVariableCredentialsProvider())
# yourEndpoint填寫Bucket所在地域對應的Endpoint。以華東1(杭州)為例,Endpoint填寫為https://oss-cn-hangzhou.aliyuncs.com。
# 填寫Bucket名稱,例如examplebucket。
bucket = oss2.Bucket(auth, 'yourEndpoint', 'examplebucket')
# 填寫Object完整路徑,例如exampledir/exampleobject.txt。Object完整路徑中不能包含Bucket名稱。
object_name = 'exampledir/exampleobject.txt'
# 指定Header。
headers = dict()
# 如果您希望實現瀏覽器訪問時自動下載文件,并自定義下載后的文件名稱,配置文件HTTP頭中的Content-Disposition為attachment
# headers['content-disposition'] = 'attachment'
# 如果您希望直接在瀏覽器中預覽文件,配置文件HTTP頭中的Content-Disposition為inline并使用Bucket綁定的自定義域名進行訪問。
headers['content-disposition'] = 'inline'
# 指定下載文件名。
query_params = {'response-content-disposition': 'attachment; filename=example.txt'}
# 生成下載文件的簽名URL,有效時間為60秒。
# 生成簽名URL時,OSS默認會對Object完整路徑中的正斜線(/)進行轉義,從而導致生成的簽名URL無法直接使用。
# 設置slash_safe為True,OSS不會對Object完整路徑中的正斜線(/)進行轉義,此時生成的簽名URL可以直接使用。
url = bucket.sign_url('GET', object_name, 60, headers=headers, slash_safe=True, params=query_params)
print('簽名url的地址為:', url)
# 使用簽名URL將Object下載到本地。
# 填寫本地文件的完整路徑,例如D:\\localpath\\examplefile.txt。
# 如果未指定本地路徑只設置了本地文件名稱(例如examplefile.txt),則下載后的文件默認保存到示例程序所屬項目對應本地路徑中。
result = bucket.get_object_with_url_to_file(url, 'D:\\localpath\\examplefile.txt')
print(result.read())
package main
import (
"fmt"
"github.com/aliyun/aliyun-oss-go-sdk/oss"
"os"
)
func HandleError(err error) {
fmt.Println("Error:", err)
os.Exit(-1)
}
func main() {
// 從環境變量中獲取訪問憑證。運行本代碼示例之前,請確保已設置環境變量OSS_ACCESS_KEY_ID和OSS_ACCESS_KEY_SECRET。
provider, err := oss.NewEnvironmentVariableCredentialsProvider()
if err != nil {
fmt.Println("Error:", err)
os.Exit(-1)
}
// 創建OSSClient實例。
// yourEndpoint填寫Bucket對應的Endpoint,以華東1(杭州)為例,填寫為https://oss-cn-hangzhou.aliyuncs.com。其它Region請按實際情況填寫。
client, err := oss.New("yourEndpoint", "", "", oss.SetCredentialsProvider(&provider))
if err != nil {
fmt.Println("Error:", err)
os.Exit(-1)
}
// 填寫Bucket名稱,例如examplebucket。
bucketName := "examplebucket"
// 填寫文件完整路徑,例如exampledir/exampleobject.txt。文件完整路徑中不能包含Bucket名稱。
objectName := "exampledir/exampleobject.txt"
// 將Object下載到本地文件,并保存到指定的本地路徑中。如果指定的本地文件存在會覆蓋,不存在則新建。
bucket, err := client.Bucket(bucketName)
if err != nil {
HandleError(err)
}
// 生成用于下載的簽名URL,并指定簽名URL的有效時間為60秒。
signedURL, err := bucket.SignURL(objectName, oss.HTTPGet, 60)
if err != nil {
HandleError(err)
}
fmt.Printf("Sign Url:%s\n", signedURL)
}
using Aliyun.OSS;
using Aliyun.OSS.Common;
// 填寫Bucket所在地域對應的Endpoint。以華東1(杭州)為例,Endpoint填寫為https://oss-cn-hangzhou.aliyuncs.com。
var endpoint = "https://oss-cn-hangzhou.aliyuncs.com";
// 從環境變量中獲取訪問憑證。運行本代碼示例之前,請確保已設置環境變量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";
// 填寫Object完整路徑,完整路徑中不包含Bucket名稱,例如exampledir/exampleobject.txt。
var objectName = "exampledir/exampleobject.txt";
// 填寫Object下載到本地文件的完整路徑。例如D:\\localpath\\examplefile.txt。如果指定的本地文件存在會覆蓋,不存在則新建。
var downloadFilename = "D:\\localpath\\examplefile.txt";
// 創建OSSClient實例。
var client = new OssClient(endpoint, accessKeyId, accessKeySecret);
try
{
var metadata = client.GetObjectMetadata(bucketName, objectName);
var etag = metadata.ETag;
// 生成簽名URL。
var req = new GeneratePresignedUriRequest(bucketName, objectName, SignHttpMethod.Get)
{
// 設置簽名URL過期時間,默認值為3600秒。
Expiration = DateTime.Now.AddHours(1),
};
var uri = client.GeneratePresignedUri(req);
}
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);
}
#include <alibabacloud/oss/OssClient.h>
using namespace AlibabaCloud::OSS;
int main(void)
{
/* 初始化OSS賬號信息。*/
/* yourEndpoint填寫Bucket所在地域對應的Endpoint。以華東1(杭州)為例,Endpoint填寫為https://oss-cn-hangzhou.aliyuncs.com。*/
std::string Endpoint = "yourEndpoint";
/* 填寫Bucket名稱,例如examplebucket。*/
std::string BucketName = "examplebucket";
/* 填寫Object完整路徑,完整路徑中不能包含Bucket名稱,例如exampledir/exampleobject.txt。*/
std::string GetobjectUrlName = "exampledir/exampleobject.txt";
/* 初始化網絡等資源。*/
InitializeSdk();
ClientConfiguration conf;
/* 從環境變量中獲取訪問憑證。運行本代碼示例之前,請確保已設置環境變量OSS_ACCESS_KEY_ID和OSS_ACCESS_KEY_SECRET。*/
auto credentialsProvider = std::make_shared<EnvironmentVariableCredentialsProvider>();
OssClient client(Endpoint, credentialsProvider, conf);
/* 設置簽名URL有效時長。*/
std::time_t t = std::time(nullptr) + 1200;
/* 生成簽名URL。*/
auto genOutcome = client.GeneratePresignedUrl(BucketName, GetobjectUrlName, t, Http::Get);
if (genOutcome.isSuccess()) {
std::cout << "GeneratePresignedUrl success, Gen url:" << genOutcome.result().c_str() << std::endl;
}
else {
/* 異常處理。*/
std::cout << "GeneratePresignedUrl fail" <<
",code:" << genOutcome.error().Code() <<
",message:" << genOutcome.error().Message() <<
",requestId:" << genOutcome.error().RequestId() << std::endl;
ShutdownSdk();
return -1;
}
/* 使用簽名URL下載文件。*/
auto outcome = client.GetObjectByUrl(genOutcome.result());
if (!outcome.isSuccess()) {
/* 異常處理。*/
std::cout << "GetObjectByUrl fail" <<
",code:" << outcome.error().Code() <<
",message:" << outcome.error().Message() <<
",requestId:" << outcome.error().RequestId() << std::endl;
ShutdownSdk();
return -1;
}
/* 釋放網絡等資源。*/
ShutdownSdk();
return 0;
}