Object Storage Service (OSS) バケットからオブジェクトをダウンロードする際に、オブジェクトの最終更新時刻または ETag に基づいてダウンロード条件を指定できます。指定したダウンロード条件が満たされた場合、オブジェクトはダウンロードされます。そうでない場合は、エラーが返され、オブジェクトはダウンロードされません。この方法により、同じオブジェクトを繰り返しダウンロードすることを避け、ネットワークトラフィックとリソースの使用量を削減し、ダウンロード効率を向上させることができます。
前提条件
オブジェクトが OSS にアップロードされていること。詳細については、「オブジェクトのアップロード」をご参照ください。
アーカイブオブジェクトをダウンロードする場合、アーカイブオブジェクトが保存されているバケットに対して、アーカイブオブジェクトがリストアされているか、アーカイブオブジェクトのリアルタイムアクセスが有効になっていること。詳細については、「オブジェクトのリストア」および「アーカイブオブジェクトのリアルタイムアクセス」をご参照ください。
コールドアーカイブまたはディープコールドアーカイブオブジェクトをダウンロードする場合、オブジェクトがリストアされていること。詳細については、「オブジェクトのリストア」をご参照ください。
RAM ユーザーを使用して条件付きダウンロードを実行する場合、
oss:GetObject
権限が Resource Access Management (RAM) ユーザーに付与されていること。詳細については、「RAM ポリシーの一般的な例」をご参照ください。
シナリオ
アプリケーションリソースの更新: アプリケーションは、オブジェクトの ETag が変更されたこと、またはオブジェクトの最終更新時刻が更新されたことを検出した場合にのみ、オブジェクトをダウンロードします。これにより、データ使用量が最小限に抑えられ、ユーザーエクスペリエンスが最適化されます。
データの同期と増分バックアップ: ETag が変更されたオブジェクト、または最終更新時刻が更新されたオブジェクトのみが同期またはバックアップされます。これにより、帯域幅のコストが削減され、データの適時性と整合性が確保されます。
オブジェクトの共有と同期: オブジェクトの Etag または最終更新時刻を使用して、オブジェクトが変更されたかどうかを確認し、変更されたオブジェクトを同期できます。これにより、作業コラボレーションが促進され、データ消費量が削減されます。
ダウンロード条件
次の表に、使用可能なオブジェクトダウンロード条件を示します。
ヘッダー | 説明 |
If-Modified-Since | このヘッダーで指定された時刻がオブジェクトの最終更新時刻よりも前であるか、無効な場合、オブジェクトと 200 OK が返されます。それ以外の場合は、304 Not Modified が返されます。 時刻は GMT でなければなりません。例: デフォルトでは、このヘッダーは空のままです。 |
If-Unmodified-Since | このヘッダーで指定された時刻がオブジェクトの最終更新時刻と同じかそれ以降の場合、オブジェクトと 200 OK が返されます。それ以外の場合は、412 Precondition Failed が返されます。 時刻は GMT でなければなりません。例: リクエストで If-Modified-Since ヘッダーと If-Unmodified-Since ヘッダーの両方を指定できます。 デフォルトでは、このヘッダーは空のままです。 |
If-Match | このヘッダーで指定された ETag がオブジェクトの ETag と一致する場合、オブジェクトと 200 OK が返されます。それ以外の場合は、412 Precondition Failed が返されます。 オブジェクトの ETag は、オブジェクトのデータ整合性をチェックするために使用されます。 デフォルトでは、このヘッダーは空のままです。 |
If-None-Match | このヘッダーで指定された ETag がオブジェクトの ETag と一致しない場合、オブジェクトと 200 OK が返されます。それ以外の場合は、304 Not Modified が返されます。 リクエストで If-Match ヘッダーと If-None-Match ヘッダーの両方を指定できます。 デフォルトでは、このヘッダーは空のままです。 |
OSS コンソールまたは ossutil を使用して条件付きダウンロードを実行することはできません。
手順
OSS SDK の使用
次のサンプルコードは、一般的なプログラミング言語の OSS SDK を使用して GetObject
を呼び出し、条件付きダウンロードを実行する方法の例を示しています。他のプログラミング言語の OSS 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 {
// この例では、中国 (杭州) リージョンのエンドポイントが使用されています。実際のエンドポイントを指定してください。
String endpoint = "https://oss-cn-hangzhou.aliyuncs.com";
// 環境変数からアクセス認証情報を取得します。サンプルコードを実行する前に、OSS_ACCESS_KEY_ID および OSS_ACCESS_KEY_SECRET 環境変数が構成されていることを確認してください。
EnvironmentVariableCredentialsProvider credentialsProvider = CredentialsProviderFactory.newEnvironmentVariableCredentialsProvider();
// バケットの名前を指定します。例: examplebucket。
String bucketName = "examplebucket";
// オブジェクトの完全なパスを指定します。完全なパスにバケット名を含めないでください。例: testfolder/exampleobject.txt。
String objectName = "testfolder/exampleobject.txt";
String pathName = "D:\\localpath\\examplefile.txt";
// バケットが配置されているリージョンを指定します。たとえば、バケットが中国 (杭州) リージョンにある場合は、リージョンを cn-hangzhou に設定します。
String region = "cn-hangzhou";
// OSSClient インスタンスを作成します。
// OSSClient が不要になったら、shutdown メソッドを呼び出して関連付けられているリソースを解放します。
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);
// たとえば、オブジェクトが最後に変更されたのは 2023 年 9 月 26 日 13:27:04 です。指定された時刻が最終更新時刻よりも前である場合 (例: Tue Sep 25 13:27:04 CST 2023)、オブジェクトは If-Modified-Since 条件を満たし、オブジェクトはダウンロードされます。
request.setModifiedSinceConstraint(new Date("Tue Sep 25 13:27:04 CST 2023"));
// ローカルデバイスにオブジェクトをダウンロードします。
ossClient.getObject(request, new File(pathName));
} catch (OSSException oe) {
System.out.println("OSSException が発生しました。これは、リクエストが OSS に到達しましたが、"
+ "何らかの理由でエラー応答で拒否されたことを意味します。");
System.out.println("エラーメッセージ:" + oe.getErrorMessage());
System.out.println("エラーコード:" + oe.getErrorCode());
System.out.println("リクエスト ID:" + oe.getRequestId());
System.out.println("ホスト ID:" + oe.getHostId());
} catch (ClientException ce) {
System.out.println("ClientException が発生しました。これは、クライアントが OSS と通信しようとしているときに、"
+ "ネットワークにアクセスできないなど、重大な内部問題が発生したことを意味します。");
System.out.println("エラーメッセージ:" + ce.getMessage());
} finally {
if (ossClient != null) {
ossClient.shutdown();
}
}
}
}
PHP
<?php
// 必要な依存関係を読み込めるように、autoload ファイルを含めます。
require_once __DIR__ . '/../vendor/autoload.php';
use AlibabaCloud\Oss\V2 as Oss;
// コマンドラインパラメータを定義し、説明します。
$optsdesc = [
"region" => ['help' => 'バケットが配置されているリージョン。', 'required' => True], // (必須) バケットが配置されているリージョンを指定します。
"endpoint" => ['help' => '他のサービスが OSS にアクセスするために使用できるドメイン名。', 'required' => False], // (オプション) OSS にアクセスするためのエンドポイントを指定します。
"bucket" => ['help' => 'バケットの名前', 'required' => True], // (必須) バケットの名前を指定します。
"key" => ['help' => 'オブジェクトの名前', '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 "エラー: 次の引数は必須です: --$key, $help" . PHP_EOL;
exit(1); // 必須パラメータが不足している場合はプログラムを終了します。
}
}
// 解析されたパラメータから値を取得します。
$region = $options["region"]; // バケットが配置されているリージョン
$bucket = $options["bucket"]; // バケットの名前
$key = $options["key"]; // オブジェクトの名前
// 環境変数からアクセス認証情報をロードします。
// EnvironmentVariableCredentialsProvider を使用して、環境変数から AccessKey ID と AccessKey シークレットを取得します。
$credentialsProvider = new Oss\Credentials\EnvironmentVariableCredentialsProvider();
// SDK のデフォルト設定を使用します。
$cfg = Oss\Config::loadDefault();
$cfg->setCredentialsProvider($credentialsProvider); // 認証情報プロバイダーを設定します。
$cfg->setRegion($region); // バケットが配置されているリージョンを設定します。
if (isset($options["endpoint"])) {
$cfg->setEndpoint($options["endpoint"]); // endpoint パラメータが提供されている場合は、カスタムドメイン名を指定します。
}
// OSSClient インスタンスを作成します。
$client = new Oss\Client($cfg);
// オブジェクトが最後に変更されたのが 2024 年 10 月 21 日 18:43:02 で、指定された UTC 時刻がこの時刻よりも前である場合、IfModifiedSince 条件が満たされ、ダウンロード操作がトリガーされます。
$ifModifiedSince = "Sun, 21 Oct 2024 18:43:02 GMT";
// オブジェクトの ETag が e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 で、指定された 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({
// バケットが配置されているリージョンを指定します。たとえば、バケットが中国 (杭州) リージョンにある場合は、リージョンを 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,
// バケットの名前を指定します。
bucket: 'examplebucket'
});
async function main() {
try {
// 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);
// If-Modified-Since ヘッダーの値がアップロードされたオブジェクトの最終更新時刻と同じかそれ以降の場合、OSS は 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="オブジェクトをファイルに取得するサンプル")
# --region パラメータを指定します。これは、バケットが配置されているリージョンを指定します。このパラメータは必須です。
parser.add_argument('--region', help='バケットが配置されているリージョン。', required=True)
# --bucket パラメータを指定して、オブジェクトが格納されているバケットの名前を示します。このパラメータは必須です。
parser.add_argument('--bucket', help='バケットの名前。', required=True)
# --endpoint パラメータを指定します。これは、他のサービスが OSS にアクセスするために使用できるエンドポイントを指定します。このパラメータはオプションです。
parser.add_argument('--endpoint', help='他のサービスが OSS にアクセスするために使用できるドメイン名')
# --key パラメータを指定します。これは、オブジェクトの名前を指定します。このパラメータは必須です。
parser.add_argument('--key', help='オブジェクトの名前。', required=True)
# --file_path パラメータを指定します。これは、ダウンロードしたコンテンツを保存するローカルパスを指定します。このパラメータは必須です。
parser.add_argument('--file_path', help='ダウンロードしたコンテンツを保存するファイルのパス。', required=True)
def main():
# コマンドラインパラメータを解析して、指定された値を取得します。
args = parser.parse_args()
# 環境変数から、OSS にアクセスするために必要な認証情報をロードします。
credentials_provider = oss.credentials.EnvironmentVariableCredentialsProvider()
# デフォルト設定を使用して設定オブジェクトを作成し、認証情報プロバイダーを指定します。
cfg = oss.config.load_default()
cfg.credentials_provider = credentials_provider
# ユーザーが指定したコマンドラインパラメータに基づいて、設定オブジェクトの region 属性を指定します。
cfg.region = args.region
# カスタムエンドポイントが提供されている場合は、cfg オブジェクトの endpoint 属性を指定されたエンドポイントで更新します。
if args.endpoint is not None:
cfg.endpoint = args.endpoint
# 前の設定を使用して、OSSClient インスタンスを初期化します。
client = oss.Client(cfg)
# if_modified_since 時刻を定義します。
# この時刻以降に変更されたオブジェクトのみが返されます。
if_modified_since = datetime(2024, 10, 1, 12, 0, 0, tzinfo=timezone.utc)
# ETag が DA5223EFCD7E0353BE08866700000000 であると仮定すると、指定された ETag がオブジェクトの 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>ドキュメント</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({
// バケットが配置されているリージョンを指定します。たとえば、バケットが中国 (杭州) リージョンにある場合は、リージョンを oss-cn-hangzhou に設定します。
region: 'yourRegion',
authorizationV4: true,
// STS から取得した一時的な AccessKey ペアを指定します。AccessKey ペアは、AccessKey ID と AccessKey シークレットで構成されます。
accessKeyId: 'yourAccessKeyId',
accessKeySecret: 'yourAccessKeySecret',
// STS から取得したセキュリティトークンを指定します。
stsToken: 'yourSecurityToken',
// バケットの名前を指定します。例: 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 ヘッダーを設定します。このヘッダーの値がアップロードされたオブジェクトの最終更新時刻よりも前である場合、オブジェクトはダウンロードされます。// If-Modified-Since ヘッダーの値がアップロードされたオブジェクトの最終更新時刻と同じかそれ以降の場合、OSS は 304 Not Modified を返します。
"If-Modified-Since": new Date("1970-01-01").toGMTString()
// リクエストで If-Unmodified-Since ヘッダーを設定します。このヘッダーの値がアップロードされたオブジェクトの最終更新時刻と同じかそれ以降の場合、オブジェクトはダウンロードされます。If-Unmodified-Since ヘッダーの値がアップロードされたオブジェクトの最終更新時刻よりも前である場合、OSS は 412 Precondition Failed を返します。
//"If-Unmodified-Since": new Date(1970-01-01).toGMTString()
// If-Match ヘッダーを ETag 値に設定します。指定された ETag 値がオブジェクトの ETag と一致する場合、オブジェクトはダウンロードされます。指定された ETag 値がオブジェクトの ETag と一致しない場合、OSS は 412 Precondition Failed を返します。
//"If-Match": '5B3C1A2E0563E1B002CC607C****'
// If-Match ヘッダーを ETag 値に設定します。指定された ETag 値がオブジェクトの ETag と一致しない場合、オブジェクトはダウンロードされます。指定された ETag 値がオブジェクトの ETag と一致する場合、OSS は 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
// バケットの名前とオブジェクトの完全なパスを指定します。この例では、バケットの名前は examplebucket で、オブジェクトの完全なパスは exampledir/exampleobject.txt です。
// オブジェクトの完全なパスにバケット名を含めないでください。
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 がオブジェクトの ETag と一致する場合、オブジェクトをダウンロードできます。それ以外の場合は、412 Precondition failed が返されます。
// headers.put(OSSHeaders.GET_OBJECT_IF_MATCH, "5B3C1A2E0563E1B002CC607C*****");
// 指定された ETag がオブジェクトの 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", "", "バケットが配置されているリージョン。")
flag.StringVar(&bucketName, "bucket", "", "バケットの名前。")
flag.StringVar(&objectName, "object", "", "オブジェクトの名前。")
}
func main() {
// パラメータを解析します。
flag.Parse()
// バケット名が空かどうかを確認します。
if len(bucketName) == 0 {
flag.PrintDefaults()
log.Fatalf("無効なパラメータ、バケット名が必要です")
}
// リージョンが空かどうかを確認します。
if len(region) == 0 {
flag.PrintDefaults()
log.Fatalf("無効なパラメータ、リージョンが必要です")
}
// オブジェクト名が空かどうかを確認します。
if len(objectName) == 0 {
flag.PrintDefaults()
log.Fatalf("無効なパラメータ、オブジェクト名が必要です")
}
// デフォルト設定を読み込み、認証情報プロバイダーとリージョンを指定します。
cfg := oss.LoadDefaultConfig().
WithCredentialsProvider(credentials.NewEnvironmentVariableCredentialsProvider()).
WithRegion(region)
// OSS クライアントを作成します。
client := oss.NewClient(cfg)
// ローカルファイルのパスを指定します。
localFile := "download.file"
// たとえば、オブジェクトが最後に変更されたのは 2023 年 11 月 21 日 18:43:02 です。IfModifiedSince 条件で指定された時刻が最終更新時刻よりも前である場合、オブジェクトはダウンロードされます。
date := time.Date(2024, time.October, 21, 18, 43, 2, 0, time.UTC)
// オブジェクトの ETag が e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 であると仮定します。IfMatch 条件で指定された ETag がオブジェクトの ETag と一致する場合、オブジェクトはダウンロードされます。
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("ファイル %v へのオブジェクトの取得に失敗しました", err)
}
log.Printf("ファイルへのオブジェクトの取得結果:%#v\n", result)
}
iOS
OSSGetObjectRequest *get = [OSSGetObjectRequest new];
// バケットの名前を指定します。バケットの命名規則の詳細については、バケットの命名規則を参照してください。
get.bucketName = @"examplebucket";
// オブジェクトの完全なパスを指定します。オブジェクトの完全なパスにバケット名を含めないでください。オブジェクトの命名規則の詳細については、オブジェクトの命名規則を参照してください。
get.objectKey = @"exampledir/exampleobject.txt";
NSMutableDictionary *headerFields = [NSMutableDictionary dictionary];
// If-Modified-Since を Fri, 13 Oct 2021 14:47:53 GMT に設定します。
[headerFields setValue:@"Fri, 13 Oct 2021 14:47:53 GMT" forKey:@"If-Modified-Since"];
// 最終更新時刻が指定された時刻と同じかそれ以前の場合にのみ、オブジェクトがダウンロードされるように指定します。
[headerFields setValue:[[NSDate new] oss_asStringValue] forKey:@"If-Unmodified-Since"];
// エンティティタグ (ETag) が指定された ETag と異なる場合にのみ、オブジェクトがダウンロードされるように指定します。
[headerFields setValue:@"5B3C1A2E0563E1B002CC607C****" forKey:@"If-None-Match"];
// ETag が指定された ETag と同じ場合にのみ、オブジェクトがダウンロードされるように指定します。
[headerFields setValue:@"fba9dede5f27731c9771645a3986****" forKey:@"If-Match"];
get.headerFields = headerFields;
[[[client getObject:get] continueWithBlock:^id _Nullable(OSSTask * _Nonnull task) {
if (!task.error) {
NSLog(@"オブジェクトの取得に成功しました!");
} else {
NSLog(@"オブジェクトの取得エラー: %@", task.error);
}
return nil;
}] waitUntilFinished];
OSS API の使用
ビジネスで高度なカスタマイズが必要な場合は、RESTful API を直接呼び出すことができます。API を直接呼び出すには、コードに署名計算を含める必要があります。詳細については、「GetObject」をご参照ください。
関連情報
バージョン管理が有効になっているバケットからオブジェクトをダウンロードする方法の詳細については、「バージョン管理が有効になっているバケット内のオブジェクトの管理」をご参照ください。
バージョン管理が一時停止されているバケットからオブジェクトをダウンロードする方法の詳細については、「バージョン管理が一時停止されているバケット内のオブジェクトの管理」をご参照ください。
OSS では、バケットとオブジェクトのアクセス制御リスト (ACL) を構成できます。これにより、権限のないサードパーティユーザーがバケットからデータをダウンロードすることを防ぐことができます。詳細については、「概要」をご参照ください。
バケットからオブジェクトを直接ダウンロードする場合は、単純ダウンロードを実行できます。詳細については、「単純ダウンロード」をご参照ください。
大きなオブジェクトをダウンロードするときに、中断されたダウンロードタスクを中断された場所から続行する場合は、再開可能なダウンロードを使用できます。詳細については、「再開可能なダウンロード」をご参照ください。
ACL が非公開のバケットからサードパーティユーザーにオブジェクトをダウンロードする権限を付与する場合は、Security Token Service (STS) を使用して一時的なアクセス認証情報を生成するか、署名付き URL を使用します。詳細については、「サードパーティユーザーにオブジェクトのダウンロードを承認する」をご参照ください。