在下載檔案時,通過使用條件如最後修改時間或ETag來限制下載,可以確保只有在檔案有更新時才執行下載。如果條件不滿足,系統將返回錯誤而不會下載檔案。這種方法可以避免重複下載未更改的檔案,從而減少網路流量和資源使用,提高下載效率。
前提條件
已上傳檔案到OSS。具體操作,請參見上傳檔案。
如果要下載Archive Storage類型的Object,請確保該Object已進入解凍狀態或Bucket已開啟歸檔直讀。具體操作,請參見解凍Object和歸檔直讀。
如果要下載冷Archive Storage或者深度冷Archive Storage類型的Object,請確保該Object已進入解凍狀態。具體操作,請參見解凍Object。
已具有
oss:GetObject許可權。具體操作,請參見RAM Policy常見樣本。
使用情境
應用資源更新:應用僅在檢測到OSS檔案ETag變更或最後修改時間更新時下載新資源,最小化資料使用,最佳化使用者體驗。
資料同步與增量備份:基於OSS的最後修改時間或ETag,確保只同步或備份更改過的檔案,節省頻寬,保障資料的時效性和一致性。
檔案分享權限設定和同步:使用ETag或最後修改時間進行驗證,僅在必要時同步檔案,加速協作,降低資料消耗。
限定條件
OSS支援的限定條件如下:
參數 | 描述 |
If-Modified-Since | 如果指定的時間早於實際修改時間或指定的時間不符合規範,則直接返回Object,並返回200 OK;如果指定的時間等於或者晚於實際修改時間,則返回304 Not Modified。 時間格式:GMT,例如 預設值:無 |
If-Unmodified-Since | 如果指定的時間等於或者晚於Object實際修改時間,則正常傳輸Object,並返回200 OK;如果指定的時間早於實際修改時間,則返回412 Precondition Failed。 時間格式:GMT,例如 If-Modified-Since和If-Unmodified-Since可以同時使用。 預設值:無 |
If-Match | 如果傳入的ETag和Object的ETag匹配,則正常傳輸Object,並返回200 OK;如果傳入的ETag和Object的ETag不匹配,則返回412 Precondition Failed。 Object的ETag值用於驗證資料是否發生了更改,您可以基於ETag值驗證資料完整性。 預設值:無 |
If-None-Match | 如果傳入的ETag值和Object的ETag不匹配,則正常傳輸Object,並返回200 OK;如果傳入的ETag和Object的ETag匹配,則返回304 Not Modified。 If-Match和If-None-Match可以同時使用。 預設值:無 |
OSS控制台、命令列工具ossutil不支援限定條件下載。
操作步驟
使用阿里雲SDK
以下僅列舉部分SDK使用GetObject介面限定條件下載的程式碼範例。關於其他限定條件下載的程式碼範例,請參見SDK簡介。
Java
import com.aliyun.oss.*;
import com.aliyun.oss.common.auth.*;
import com.aliyun.oss.common.comm.SignVersion;
import com.aliyun.oss.model.GetObjectRequest;
import java.io.File;
import java.util.Date;
public class Demo {
public static void main(String[] args) throws Exception {
// Endpoint以華東1(杭州)為例,其它Region請按實際情況填寫。
String endpoint = "https://oss-cn-hangzhou.aliyuncs.com";
// 從環境變數中擷取訪問憑證。運行本程式碼範例之前,請確保已設定環境變數OSS_ACCESS_KEY_ID和OSS_ACCESS_KEY_SECRET。
EnvironmentVariableCredentialsProvider credentialsProvider = CredentialsProviderFactory.newEnvironmentVariableCredentialsProvider();
// 填寫Bucket名稱,例如examplebucket。
String bucketName = "examplebucket";
// 填寫不包含Bucket名稱在內的Object完整路徑,例如testfolder/exampleobject.txt。
String objectName = "testfolder/exampleobject.txt";
String pathName = "D:\\localpath\\examplefile.txt";
// 填寫Bucket所在地區。以華東1(杭州)為例,Region填寫為cn-hangzhou。
String region = "cn-hangzhou";
// 建立OSSClient執行個體。
ClientBuilderConfiguration clientBuilderConfiguration = new ClientBuilderConfiguration();
clientBuilderConfiguration.setSignatureVersion(SignVersion.V4);
OSS ossClient = OSSClientBuilder.create()
.endpoint(endpoint)
.credentialsProvider(credentialsProvider)
.clientConfiguration(clientBuilderConfiguration)
.region(region)
.build();
try {
GetObjectRequest request = new GetObjectRequest(bucketName, objectName);
// 假設Object最後修改時間為2023年9月26日13:27:04,當填寫早於該時間的Data對象時(例如Tue Sep 25 13:27:04 CST 2023),將滿足If-Modified-Since的限定條件,並觸發下載行為。
request.setModifiedSinceConstraint(new Date("Tue Sep 25 13:27:04 CST 2023"));
// 下載OSS檔案到本地檔案。
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
<?php
// 引入自動負載檔案,確保依賴庫能夠正確載入
require_once __DIR__ . '/../vendor/autoload.php';
use AlibabaCloud\Oss\V2 as Oss;
// 定義命令列參數的描述資訊
$optsdesc = [
"region" => ['help' => 'The region in which the bucket is located.', 'required' => True], // Bucket所在的地區(必填)
"endpoint" => ['help' => 'The domain names that other services can use to access OSS.', 'required' => False], // 訪問網域名稱(可選)
"bucket" => ['help' => 'The name of the bucket', 'required' => True], // Bucket名稱(必填)
"key" => ['help' => 'The name of the object', 'required' => True], // 對象名稱(必填)
];
// 將參數描述轉換為getopt所需的長選項格式
// 每個參數後面加上":"表示該參數需要值
$longopts = \array_map(function ($key) {
return "$key:";
}, array_keys($optsdesc));
// 解析命令列參數
$options = getopt("", $longopts);
// 驗證必填參數是否存在
foreach ($optsdesc as $key => $value) {
if ($value['required'] === True && empty($options[$key])) {
$help = $value['help']; // 擷取參數的協助資訊
echo "Error: the following arguments are required: --$key, $help" . PHP_EOL;
exit(1); // 如果必填參數缺失,則退出程式
}
}
// 從解析的參數中提取值
$region = $options["region"]; // Bucket所在的地區
$bucket = $options["bucket"]; // Bucket名稱
$key = $options["key"]; // 對象名稱
// 載入環境變數中的憑證資訊
// 使用EnvironmentVariableCredentialsProvider從環境變數中讀取Access Key ID和Access Key Secret
$credentialsProvider = new Oss\Credentials\EnvironmentVariableCredentialsProvider();
// 使用SDK的預設配置
$cfg = Oss\Config::loadDefault();
$cfg->setCredentialsProvider($credentialsProvider); // 設定憑證提供者
$cfg->setRegion($region); // 設定Bucket所在的地區
if (isset($options["endpoint"])) {
$cfg->setEndpoint($options["endpoint"]); // 如果提供了訪問網域名稱,則設定endpoint
}
// 建立OSS用戶端執行個體
$client = new Oss\Client($cfg);
// 假設Object最後修改時間為2024年10月21日18:43:02,則填寫的UTC早於該時間時,將滿足IfModifiedSince的限定條件,並觸發下載行為
$ifModifiedSince = "Sun, 21 Oct 2024 18:43:02 GMT";
// 假設ETag為e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855,則填寫的ETag與Object的ETag值相等時,將滿足IfMatch的限定條件,並觸發下載行為
$etag = "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855";
// 建立GetObjectRequest對象,用於擷取指定對象的內容
$request = new Oss\Models\GetObjectRequest(
bucket: $bucket,
key: $key,
ifModifiedSince: $ifModifiedSince,
ifMatch: $etag);
// 執行擷取對象操作
$result = $client->getObject($request);
// 列印擷取結果
// 輸出HTTP狀態代碼、請求ID以及對象的內容
printf(
'status code:' . $result->statusCode . PHP_EOL . // HTTP狀態代碼,例如200表示成功
'request id:' . $result->requestId . PHP_EOL . // 請求ID,用於調試或追蹤請求
'object content:' . $result->body->getContents() . PHP_EOL // 對象的內容
);
Node.js
const OSS = require('ali-oss');
const client = new OSS({
// yourregion填寫Bucket所在地區。以華東1(杭州)為例,Region填寫為oss-cn-hangzhou。
region: 'yourRegion',
// 從環境變數中擷取訪問憑證。運行本程式碼範例之前,請確保已設定環境變數OSS_ACCESS_KEY_ID和OSS_ACCESS_KEY_SECRET。
accessKeyId: process.env.OSS_ACCESS_KEY_ID,
accessKeySecret: process.env.OSS_ACCESS_KEY_SECRET,
authorizationV4: true,
// 填寫Bucket名稱。
bucket: 'examplebucket'
});
async function main() {
try {
// 向目標Bucket上傳名為exampleobject.txt的檔案,檔案內容自訂。
await client.put("exampleobject.txt", Buffer.from("contenttest"));
// 在要求標頭If-Modified-Since中指定時間,如果指定的時間早於檔案實際修改時間,則下載檔案。
let result = await client.get("exampleobject.txt", {
headers: {
"If-Modified-Since": new Date("1970-01-01").toGMTString(),
},
});
console.log(result.content.toString() === "contenttest");
console.log(result.res.status === 200);
// 如果指定的時間等於或者晚於檔案實際修改時間,則返回304 Not Modified。
result = await client.get("exampleobject.txt", {
headers: {
"If-Modified-Since": new Date().toGMTString(),
},
});
console.log(result.content.toString() === "");
console.log(result.res.status === 304);
} catch (e) {
console.log(e.code === "Not Modified");
}
}
main();Python
import argparse
import alibabacloud_oss_v2 as oss
from datetime import datetime, timezone
# 建立一個命令列參數解析器,並描述指令碼用途:擷取對象並儲存到檔案樣本
parser = argparse.ArgumentParser(description="get object to file sample")
# 添加命令列參數 --region,表示儲存空間所在的地區,必需參數
parser.add_argument('--region', help='The region in which the bucket is located.', required=True)
# 添加命令列參數 --bucket,表示要擷取對象的儲存空間名稱,必需參數
parser.add_argument('--bucket', help='The name of the bucket.', required=True)
# 添加命令列參數 --endpoint,表示其他服務可用來訪問OSS的網域名稱,非必需參數
parser.add_argument('--endpoint', help='The domain names that other services can use to access OSS')
# 添加命令列參數 --key,表示對象(檔案)在OSS中的鍵名,必需參數
parser.add_argument('--key', help='The name of the object.', required=True)
# 添加命令列參數 --file_path,表示下載檔案的本地路徑,必需參數
parser.add_argument('--file_path', help='The path of the file to save the downloaded content.', required=True)
def main():
# 解析命令列提供的參數,擷取使用者輸入的值
args = parser.parse_args()
# 從環境變數中載入訪問OSS所需的認證資訊,用於身分識別驗證
credentials_provider = oss.credentials.EnvironmentVariableCredentialsProvider()
# 使用SDK的預設配置建立設定物件,並設定認證提供者
cfg = oss.config.load_default()
cfg.credentials_provider = credentials_provider
# 設定設定物件的地區屬性,根據使用者提供的命令列參數
cfg.region = args.region
# 如果提供了自訂endpoint,則更新設定物件中的endpoint屬性
if args.endpoint is not None:
cfg.endpoint = args.endpoint
# 使用上述配置初始化OSS用戶端,準備與OSS互動
client = oss.Client(cfg)
# 定義 if_modified_since 時間
# 只有在此時間之後被修改的對象才會被返回
if_modified_since = datetime(2024, 10, 1, 12, 0, 0, tzinfo=timezone.utc)
# 假設ETag為DA5223EFCD7E0353BE08866700000000,則填寫的ETag與Object的ETag值相等時,將滿足IfMatch的限定條件,並觸發下載行為。
etag = "\"DA5223EFCD7E0353BE08866700000000\""
# 執行擷取對象並儲存到本地檔案的請求
result = client.get_object_to_file(
oss.GetObjectRequest(
bucket=args.bucket, # 指定儲存空間名稱
key=args.key, # 指定對象鍵名
if_modified_since=if_modified_since, # 只有在指定時間之後被修改的對象才會被返回
if_match=etag, # 只有 ETag 匹配的對象才會被返回
),
args.file_path # 指定下載檔案的本地路徑
)
# 輸出擷取對象的結果資訊,包括狀態代碼、請求ID等
print(f'status code: {result.status_code},'
f' request id: {result.request_id},'
f' content length: {result.content_length},'
f' content range: {result.content_range},'
f' content type: {result.content_type},'
f' etag: {result.etag},'
f' last modified: {result.last_modified},'
f' content md5: {result.content_md5},'
f' cache control: {result.cache_control},'
f' content disposition: {result.content_disposition},'
f' content encoding: {result.content_encoding},'
f' expires: {result.expires},'
f' hash crc64: {result.hash_crc64},'
f' storage class: {result.storage_class},'
f' object type: {result.object_type},'
f' version id: {result.version_id},'
f' tagging count: {result.tagging_count},'
f' server side encryption: {result.server_side_encryption},'
f' server side data encryption: {result.server_side_data_encryption},'
f' next append position: {result.next_append_position},'
f' expiration: {result.expiration},'
f' restore: {result.restore},'
f' process status: {result.process_status},'
f' delete marker: {result.delete_marker},'
f' server time: {result.headers.get("x-oss-server-time")},'
)
# 當此指令碼被直接執行時,調用main函數開始處理邏輯
if __name__ == "__main__":
main() # 指令碼進入點,控製程序流程從這裡開始Browser.js
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<title>Document</title>
</head>
<body>
<button id='upload'>上傳</button>
<button id='download'>下載</button>
<!--匯入SDK檔案-->
<script type="text/javascript" src="https://gosspublic.alicdn.com/aliyun-oss-sdk-6.16.0.min.js"></script>
<script type="text/javascript">
const client = new OSS({
// yourRegion填寫Bucket所在地區。以華東1(杭州)為例,yourRegion填寫為oss-cn-hangzhou。
region: 'yourRegion',
authorizationV4: true,
// 從STS服務擷取的臨時存取金鑰(AccessKey ID和AccessKey Secret)。
accessKeyId: 'yourAccessKeyId',
accessKeySecret: 'yourAccessKeySecret',
// 從STS服務擷取的安全性權杖(SecurityToken)。
stsToken: 'yourSecurityToken',
// 填寫Bucket名稱,例如examplebucket。
bucket: "examplebucket",
});
const download = document.getElementById('download')
const upload = document.getElementById('upload')
// 上傳檔案。
upload.addEventListener('click', () => {
// 指定待上傳的檔案內容。
const file = new Blob(['examplecontent'])
// 指定待上傳檔案的完整路徑,例如exampledir/exampleobject.txt。
const fileName = 'exampledir/exampleobject.txt'
const result = client.put(fileName, file).then(r => console.log(r))
})
// 下載檔案。
download.addEventListener('click', () => {
// 指定待下載的位元組範圍。
const start = 1, end = 5
client.get('exampledir/exampleobject.txt', {
headers: {
// 在要求標頭If-Modified-Since中指定時間,如果指定的時間早於檔案實際修改時間,則下載檔案。如果指定的時間等於或者晚於檔案實際修改時間,則返回304 Not Modified。
"If-Modified-Since": new Date("1970-01-01").toGMTString()
// 在要求標頭If-Unmodified-Since中指定時間,如果指定的時間等於或者晚於檔案實際修改時間,則下載檔案。如果指定的時間早於檔案實際修改時間,則返回412 Precondition Failed。
//"If-Unmodified-Since": new Date(1970-01-01).toGMTString()
// 在要求標頭If-Match中傳入ETag,如果傳入的ETag和檔案的ETag匹配,則下載檔案。如果傳入的ETag和檔案的ETag不匹配,則返回412 Precondition Failed。
//"If-Match": '5B3C1A2E0563E1B002CC607C****'
// 在要求標頭If-None-Match中傳入ETag,如果傳入的ETag和檔案的ETag不匹配,則下載檔案。如果傳入的ETag和檔案的ETag匹配,則返回304 Not Modified。
//"If-None-Match": '5B3C1A2E0563E1B002CC607C****'
},
}).then(r => {
if (r.content.length > 0) {
const newBlob = new Blob([r.content], { type: r.res.headers['content-type'] });
const link = document.createElement('a')
link.href = window.URL.createObjectURL(newBlob)
link.download = 'foo.txt'
link.click()
window.URL.revokeObjectURL(link.href)
} else {
console.log('錯誤碼', r.res.status)
console.log('沒有合格下載項')
}
})
})
</script>
</body>
</html>Android
// 依次填寫Bucket名稱(例如examplebucket)、Object完整路徑(例如exampledir/exampleobject.txt)。
// Object完整路徑中不能包含Bucket名稱。
String bucketName = "examplebucket";
String objectKey = "exampledir/exampleobject.txt";
// 構造下載檔案請求。
Map<String, String> headers = new HashMap<>();
// 如果指定的時間早於實際修改時間,則正常傳輸檔案,否則返回錯誤(304 Not modified)。
headers.put(OSSHeaders.GET_OBJECT_IF_MODIFIED_SINCE, "Fri, 13 Nov 2015 14:47:53 GMT");
// 如果指定的時間等於或者晚於檔案實際修改時間,則正常傳輸檔案,否則返回錯誤(412 Precondition failed)
// headers.put(OSSHeaders.GET_OBJECT_IF_UNMODIFIED_SINCE, "Fri, 13 Nov 2015 14:47:53 GMT");
// 如果指定的ETag和OSS檔案的ETag匹配,則正常傳輸檔案,否則返回錯誤(412 Precondition failed)
// headers.put(OSSHeaders.GET_OBJECT_IF_MATCH, "5B3C1A2E0563E1B002CC607C*****");
// 如果指定的ETag和OSS檔案的ETag不匹配,則正常傳輸檔案,否則返回錯誤(304 Not modified)
// headers.put(OSSHeaders.GET_OBJECT_IF_NONE_MATCH, "5B3C1A2E0563E1B002CC607C*****");
GetObjectRequest get = new GetObjectRequest(bucketName, objectKey);
get.setRequestHeaders(headers);
OSSAsyncTask task = oss.asyncGetObject(get, new OSSCompletedCallback<GetObjectRequest, GetObjectResult>() {
@Override
public void onSuccess(GetObjectRequest request, GetObjectResult result) {
// 請求成功。
InputStream inputStream = result.getObjectContent();
byte[] buffer = new byte[2048];
int len;
try {
while ((len = inputStream.read(buffer)) != -1) {
// 處理下載的資料。
}
} catch (IOException e) {
e.printStackTrace();
}
}
@Override
public void onFailure(GetObjectRequest request, ClientException clientExcepion, ServiceException serviceException) {
// 請求異常。
if (clientExcepion != null) {
// 本地異常如網路異常等。
clientExcepion.printStackTrace();
}
if (serviceException != null) {
// 服務異常。
Log.e("ErrorCode", serviceException.getErrorCode());
Log.e("RequestId", serviceException.getRequestId());
Log.e("HostId", serviceException.getHostId());
Log.e("RawMessage", serviceException.getRawMessage());
}
}
});Go
package main
import (
"context"
"flag"
"log"
"net/http"
"time"
"github.com/aliyun/alibabacloud-oss-go-sdk-v2/oss"
"github.com/aliyun/alibabacloud-oss-go-sdk-v2/oss/credentials"
)
// 定義全域變數
var (
region string // 儲存地區
bucketName string // 儲存空間名稱
objectName string // 對象名稱
)
// init函數用於初始化命令列參數
func init() {
flag.StringVar(®ion, "region", "", "The region in which the bucket is located.")
flag.StringVar(&bucketName, "bucket", "", "The name of the bucket.")
flag.StringVar(&objectName, "object", "", "The name of the object.")
}
func main() {
// 解析命令列參數
flag.Parse()
// 檢查bucket名稱是否為空白
if len(bucketName) == 0 {
flag.PrintDefaults()
log.Fatalf("invalid parameters, bucket name required")
}
// 檢查region是否為空白
if len(region) == 0 {
flag.PrintDefaults()
log.Fatalf("invalid parameters, region required")
}
// 檢查object名稱是否為空白
if len(objectName) == 0 {
flag.PrintDefaults()
log.Fatalf("invalid parameters, object name required")
}
// 載入預設配置並設定憑證提供者和地區
cfg := oss.LoadDefaultConfig().
WithCredentialsProvider(credentials.NewEnvironmentVariableCredentialsProvider()).
WithRegion(region)
// 建立OSS用戶端
client := oss.NewClient(cfg)
// 指定本地檔案路徑
localFile := "download.file"
// 假設Object最後修改時間為2024年10月21日18:43:02,則填寫的UTC早於該時間時,將滿足IfModifiedSince的限定條件,並觸發下載行為。
date := time.Date(2024, time.October, 21, 18, 43, 2, 0, time.UTC)
// 假設ETag為e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855,則填寫的ETag與Object的ETag值相等時,將滿足IfMatch的限定條件,並觸發下載行為。
etag := "\"e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855\""
// 建立下載對象到本地檔案的請求
getRequest := &oss.GetObjectRequest{
Bucket: oss.Ptr(bucketName), // 儲存空間名稱
Key: oss.Ptr(objectName), // 對象名稱
IfModifiedSince: oss.Ptr(date.Format(http.TimeFormat)), // 指定IfModifiedSince參數
IfMatch: oss.Ptr(etag), // 指定IfMatch參數
}
// 執行下載對象到本地檔案的操作並處理結果
result, err := client.GetObjectToFile(context.TODO(), getRequest, localFile)
if err != nil {
log.Fatalf("failed to get object to file %v", err)
}
log.Printf("get object to file result:%#v\n", result)
}
iOS
OSSGetObjectRequest *get = [OSSGetObjectRequest new];
// 填寫Bucket名稱。關於Bucket名稱命名規範的更多資訊,請參見Bucket。
get.bucketName = @"examplebucket";
// 填寫不包含Bucket名稱在內的Object完整路徑。關於Object名稱命名規範的更多資訊,請參見Object。
get.objectKey = @"exampledir/exampleobject.txt";
NSMutableDictionary *headerFields = [NSMutableDictionary dictionary];
// 指定下載實際修改時間晚於Fri, 13 Oct 2021 14:47:53 GMT的Object。
[headerFields setValue:@"Fri, 13 Oct 2021 14:47:53 GMT" forKey:@"If-Modified-Since"];
// 指定下載實際修改時間早於或者等於目前時間的Object。
[headerFields setValue:[[NSDate new] oss_asStringValue] forKey:@"If-Unmodified-Since"];
// 指定下載與傳入的ETag值不匹配的Object。
[headerFields setValue:@"5B3C1A2E0563E1B002CC607C****" forKey:@"If-None-Match"];
// 指定下載與傳入的ETag值匹配的Object。
[headerFields setValue:@"fba9dede5f27731c9771645a3986****" forKey:@"If-Match"];
get.headerFields = headerFields;
[[[client getObject:get] continueWithBlock:^id _Nullable(OSSTask * _Nonnull task) {
if (!task.error) {
NSLog(@"get object success!");
} else {
NSLog(@"get object error: %@", task.error);
}
return nil;
}] waitUntilFinished];使用REST API
如果您的程式自訂要求較高,您可以直接發起REST API請求。直接發起REST API請求需要手動編寫代碼計算簽名。更多資訊,請參見GetObject。
相關文檔
如何在開啟了版本控制的Bucket中下載檔案,請參見開啟版本控制下Object的操作。
如何在暫停了版本控制的Bucket中下載檔案,請參見暫停版本控制下Object的操作。
為了防止第三方未經授權從您的Bucket裡下載資料,OSS提供了Bucket和Object層級的存取權限控制。更多資訊,請參見許可權控制。
如果您希望直接下載檔案,您可以使用簡單下載。具體操作,請參見簡單下載。
如果您希望在下載大檔案過程中,從下載中斷的位置繼續下載未完成的部分,您可以使用斷點續傳。具體操作,請參見斷點續傳下載。
如果您希望將私人Bucket的Object提供給第三方進行下載,請通過STS臨時訪問憑證或簽名URL的方式授權第三方下載檔案。具體操作,請參見授權給第三方下載。