OSS オブジェクトはデフォルトで非公開であり、ファイル所有者のみがアクセスできます。ただし、ファイル所有者は共有リンク (署名付き URL) を生成して、有効期間内に他のユーザーが特定のファイルをオンラインでダウンロードまたはプレビューすることを許可できます。
仕組み
署名付き URL の生成は、秘密鍵の暗号化とパラメーターの連結に依存します。プロセスは次のとおりです。
権限の検証: 署名付き URL を生成する場合、サードパーティが署名付き URL を介してファイルを正常にダウンロード/プレビューするには、
oss:GetObject権限が必要です。ローカル暗号化: AK/SK に基づいて、ファイルパス、有効期限、その他の情報を暗号化して計算し、署名 (
x-oss-signature) を取得します。署名の追加: 署名パラメーター (
x-oss-date、x-oss-expires、x-oss-credentialなど) をクエリ文字列としてファイル URL に追加します。リンクの形成: 完全な署名付き URL を構成します。
署名付き URL のフォーマット
https://BucketName.Endpoint/Object?signature parameters完全な例
https://examplebucket.oss-cn-hangzhou.aliyuncs.com/exampleobject.txt?x-oss-process=image%2Fresize%2Cp_10&x-oss-date=20241115T095058Z&x-oss-expires=3600&x-oss-signature-version=OSS4-HMAC-SHA256&x-oss-credential=LTAI****************%2F20241115%2Fcn-hangzhou%2Foss%2Faliyun_v4_request&x-oss-signature=6e7a*********************************
詳細な生成プロセスについては、「署名バージョン 4 (推奨)」をご参照ください。
ファイルダウンロードリンクの取得
OSS のデフォルトエンドポイントを使用して、有効期限付きのファイルダウンロードリンク (署名付き URL) を生成します。
OSS コンソールの使用
OSS 管理コンソールにログインし、ターゲットバケットの [ファイル] リストに移動し、ターゲットファイルをクリックしてから、右側の詳細パネルで [ファイル URL のコピー] をクリックして、デフォルトの有効期間が 32400 秒 (9 時間) の一時的なダウンロードリンクを取得できます。
Alibaba Cloud SDK の使用
以下は、一般的な言語でファイルダウンロードリンク (署名付き URL) を生成するためのコード例です。
Java
詳細については、「Java で署名付き URL を使用してファイルをダウンロードする」をご参照ください。
import com.aliyun.oss.*;
import com.aliyun.oss.common.auth.*;
import com.aliyun.oss.common.comm.SignVersion;
import java.net.URL;
import java.util.Date;
public class Demo {
public static void main(String[] args) throws Throwable {
// この例では、中国 (杭州) リージョンのエンドポイントが使用されています。実際の エンドポイントを指定してください。
String endpoint = "https://oss-cn-hangzhou.aliyuncs.com";
// 環境変数からアクセス資格情報を取得します。サンプルコードを実行する前に、OSS_ACCESS_KEY_ID および OSS_ACCESS_KEY_SECRET 環境変数が設定されていることを確認してください。
EnvironmentVariableCredentialsProvider credentialsProvider = CredentialsProviderFactory.newEnvironmentVariableCredentialsProvider();
// バケットの名前を指定します。例: examplebucket。
String bucketName = "examplebucket";
// オブジェクトの完全なパスを指定します。例: exampleobject.txt。オブジェクトの完全なパスにバケット名を含めないでください。
String objectName = "exampleobject.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 {
// 署名付き URL の有効期間を指定します。単位: ミリ秒。この例では、有効期間は 1 時間です。
Date expiration = new Date(new Date().getTime() + 3600 * 1000L);
// HTTP GET リクエストを許可する署名付き URL を生成します。この例では、追加のリクエストヘッダーは指定されていません。他のユーザーはブラウザを使用して関連コンテンツに直接アクセスできます。
URL url = ossClient.generatePresignedUrl(bucketName, objectName, expiration);
System.out.println(url);
} 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();
}
}
}
}Python
詳細については、「Python で署名付き URL を使用してファイルをダウンロードする」をご参照ください。
import argparse
import alibabacloud_oss_v2 as oss
# コマンドラインパラメーターパーサーを作成し、スクリプトの目的を記述します。
parser = argparse.ArgumentParser(description="presign get object 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 パラメーターを指定して、バケットが配置されているリージョンのエンドポイントを示します。このパラメーターはオプションです。
parser.add_argument('--endpoint', help='The domain names that other services can use to access OSS')
# --key パラメーターを指定して、オブジェクトの名前を示します。このパラメーターは必須です。
parser.add_argument('--key', help='The name of the object.', required=True)
def main():
# コマンドラインパラメーターを解析して、指定された値を取得します。
args = parser.parse_args()
# 環境変数から、OSS へのアクセスに必要な認証情報を読み込みます。
credentials_provider = oss.credentials.EnvironmentVariableCredentialsProvider()
# デフォルト設定を使用して cfg オブジェクトを作成し、資格情報プロバイダーを指定します。
cfg = oss.config.load_default()
cfg.credentials_provider = credentials_provider
# cfg オブジェクトの region 属性を、コマンドラインで指定されたリージョンに設定します。
cfg.region = args.region
# カスタムエンドポイントが指定されている場合は、cfg オブジェクトの endpoint 属性を指定されたエンドポイントで更新します。
if args.endpoint is not None:
cfg.endpoint = args.endpoint
# 上記の設定を使用して OSSClient インスタンスを初期化します。
client = oss.Client(cfg)
# 署名付き URL を生成するリクエストを開始します。
pre_result = client.presign(
oss.GetObjectRequest(
bucket=args.bucket, # バケット名を指定します。
key=args.key, # オブジェクトキーを指定します。
)
)
# HTTP メソッド、有効期限、署名付き URL を表示します。
print(f'method: {pre_result.method},'
f' expiration: {pre_result.expiration.strftime("%Y-%m-%dT%H:%M:%S.000Z")},'
f' url: {pre_result.url}'
)
# 署名付きヘッダーを表示します。
for key, value in pre_result.signed_headers.items():
print(f'signed headers key: {key}, signed headers value: {value}')
# スクリプトが直接実行されたときに、main 関数を呼び出して処理ロジックを開始します。
if __name__ == "__main__":
main() # スクリプトのエントリポイントを指定します。制御フローはここから始まります。Go
詳細については、「Go で署名付き URL を使用してファイルをダウンロードする」をご参照ください。
package main
import (
"context"
"flag"
"log"
"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()
// バケット名が空かどうかを確認します。
if len(bucketName) == 0 {
flag.PrintDefaults()
log.Fatalf("invalid parameters, bucket name required")
}
// リージョンが空かどうかを確認します。
if len(region) == 0 {
flag.PrintDefaults()
log.Fatalf("invalid parameters, region required")
}
// オブジェクト名が空かどうかを確認します。
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)
// GetObject リクエストの署名付き URL を生成します。
result, err := client.Presign(context.TODO(), &oss.GetObjectRequest{
Bucket: oss.Ptr(bucketName),
Key: oss.Ptr(objectName),
},
oss.PresignExpires(10*time.Minute),
)
if err != nil {
log.Fatalf("failed to get object presign %v", err)
}
log.Printf("request method:%v\n", result.Method)
log.Printf("request expiration:%v\n", result.Expiration)
log.Printf("request url:%v\n", result.URL)
if len(result.SignedHeaders) > 0 {
// 返された結果に署名付きヘッダーが含まれている場合は、署名付き URL を使用して GET リクエストを送信するときに、対応するリクエストヘッダーを含める必要があります。そうしないと、リクエストが失敗したり、署名エラーが発生したりする可能性があります。
log.Printf("signed headers:\n")
for k, v := range result.SignedHeaders {
log.Printf("%v: %v\n", k, v)
}
}
}
Node.js
詳細については、「Node.js で署名付き URL を使用してファイルをダウンロードする」をご参照ください。
const OSS = require("ali-oss");
// 署名付き URL を生成するために使用される関数を指定します。
async function generateSignatureUrl(fileName) {
// 署名付き URL を取得します。
const client = await new OSS({
// 環境変数からアクセス資格情報を取得します。サンプルコードを実行する前に、OSS_ACCESS_KEY_ID および OSS_ACCESS_KEY_SECRET 環境変数が設定されていることを確認してください。
accessKeyId: process.env.OSS_ACCESS_KEY_ID,
accessKeySecret: process.env.OSS_ACCESS_KEY_SECRET,
bucket: 'examplebucket',
// バケットが配置されているリージョンを指定します。たとえば、バケットが中国 (杭州) リージョンにある場合は、リージョンを oss-cn-hangzhou に設定します。
region: 'oss-cn-hangzhou',
// secure を true に設定し、HTTPS を使用して、生成されたダウンロードリンクがブラウザによってブロックされるのを防ぎます。
secure: true,
authorizationV4: true
});
return await client.signatureUrlV4('GET', 3600, {
headers: {} // 実際のリクエストヘッダーに基づいてリクエストヘッダーを指定します。
}, fileName);
}
// 関数を呼び出し、オブジェクトの名前を渡します。
generateSignatureUrl('yourFileName').then(url => {
console.log('Generated Signature URL:', url);
}).catch(err => {
console.error('Error generating signature URL:', err);
});PHP
詳細については、「PHP で署名付き URL を使用してファイルをダウンロードする」をご参照ください。
<?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], // バケットが配置されているリージョン。(必須)
"endpoint" => ['help' => 'The domain names that other services can use to access OSS.', 'required' => False], // OSS にアクセスするためのエンドポイント。(オプション)
"bucket" => ['help' => 'The name of the bucket', 'required' => True], // バケット名。(必須)
"key" => ['help' => 'The name of the object', 'required' => True], // オブジェクト名。(必須)
"expire" => ['help' => 'The expiration time in seconds (default: 900)', 'required' => False], // 有効期限 (秒)。(オプション、デフォルト: 900)
];
// 引数の説明を 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 = $options["bucket"]; // バケット名。
$key = $options["key"]; // オブジェクト名。
$expire = isset($options["expire"]) ? (int)$options["expire"] : 900; // 有効期限。デフォルト: 900 秒。
// 環境変数から資格情報を読み込みます。
// EnvironmentVariableCredentialsProvider を使用して、環境変数からアクセスキー ID とアクセスキーシークレットを読み取ります。
$credentialsProvider = new Oss\Credentials\EnvironmentVariableCredentialsProvider();
// SDK のデフォルト設定を使用します。
$cfg = Oss\Config::loadDefault();
$cfg->setCredentialsProvider($credentialsProvider); // 資格情報プロバイダーを設定します。
$cfg->setRegion($region); // バケットが配置されているリージョンを設定します。
if (isset($options["endpoint"])) {
$cfg->setEndpoint($options["endpoint"]); // エンドポイントが指定されている場合は、それを設定します。
}
try {
// OSS クライアントインスタンスを作成します。
$client = new Oss\Client($cfg);
// オブジェクトをダウンロードするための GetObjectRequest オブジェクトを作成します。
$request = new Oss\Models\GetObjectRequest(bucket:$bucket, key:$key);
// presign メソッドを呼び出して署名付き URL を生成し、有効期限を設定します。
$result = $client->presign($request, [
'expires' => new \DateInterval("PT{$expire}S") // PT は Period Time、S は秒を表します。
]);
// 署名付き URL を出力します。
echo "Signed URL: " . $result->url . PHP_EOL;
} catch (Exception $e) {
echo "Error: " . $e->getMessage() . PHP_EOL;
exit(1);
}.NET
詳細については、「.NET で署名付き URL を使用してファイルをダウンロードする」をご参照ください。
using Aliyun.OSS;
using Aliyun.OSS.Common;
// バケットが配置されているリージョンのエンドポイントを指定します。たとえば、バケットが中国 (杭州) リージョンにある場合は、エンドポイントを 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");
// バケットの名前を指定します。例: examplebucket。
var bucketName = "examplebucket";
// オブジェクトの完全なパスを指定します。完全なパスにはバケット名を含めることはできません。例: exampledir/exampleobject.txt。
var objectName = "exampledir/exampleobject.txt";
// バケットが配置されているリージョンを指定します。たとえば、バケットが中国 (杭州) リージョンにある場合は、リージョンを cn-hangzhou に設定します。
const string region = "cn-hangzhou";
// ClientConfiguration インスタンスを作成し、要件に基づいてデフォルトのパラメーターを変更します。
var conf = new ClientConfiguration();
// V4 署名を指定します。
conf.SignatureVersion = SignatureVersion.V4;
// OSSClient インスタンスを作成します。
var client = new OssClient(endpoint, accessKeyId, accessKeySecret, conf);
client.SetRegion(region);
try
{
var metadata = client.GetObjectMetadata(bucketName, objectName);
var etag = metadata.ETag;
// 署名付き URL を生成します。
var req = new GeneratePresignedUriRequest(bucketName, objectName, SignHttpMethod.Get)
{
// 署名付き URL の有効期間を設定します。デフォルト値: 3600。単位: 秒。
Expiration = DateTime.UtcNow.AddHours(1),
};
var uri = client.GeneratePresignedUri(req);
// 生成された署名付き URL を出力します
Console.WriteLine("Generated Signed URL: " + uri);
}
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);
}Android
SDK の詳細については、「Android で署名付き URL を使用してファイルをダウンロードする」をご参照ください。
// バケットの名前を指定します。例: examplebucket。
String bucketName = "examplebucket";
// ソースオブジェクトの完全なパスを指定します。完全なパスにバケット名を含めないでください。例: exampleobject.txt。
String objectKey = "exampleobject.txt";
String url = null;
try {
// オブジェクトをダウンロードするための署名付き URL を生成します。
GeneratePresignedUrlRequest request = new GeneratePresignedUrlRequest(bucketName, objectKey);
// 署名付き URL の有効期間を 30 分に設定します。
request.setExpiration(30*60);
request.setMethod(HttpMethod.GET);
url = oss.presignConstrainedObjectURL(request);
Log.d("url", url);
} catch (ClientException e) {
e.printStackTrace();
}iOS
SDK の詳細については、「iOS で署名付き URL を使用してファイルをダウンロードする」をご参照ください。
// バケットの名前を指定します。
NSString *bucketName = @"examplebucket";
// オブジェクトの名前を指定します。
NSString *objectKey = @"exampleobject.txt";
__block NSString *urlString;
// オブジェクトをダウンロードするための有効期間付きの署名付き URL を生成します。この例では、URL の有効期間は 30 分です。
OSSTask *task = [client presignConstrainURLWithBucketName:bucketName
withObjectKey:objectKey
httpMethod:@"GET"
withExpirationInterval:30 * 60
withParameters:@{}];
[task continueWithBlock:^id _Nullable(OSSTask * _Nonnull task) {
if (task.error) {
NSLog(@"presign error: %@", task.error);
} else {
urlString = task.result;
NSLog(@"url: %@", urlString);
}
return nil;
}];C++
SDK の詳細については、「C++ で署名付き URL を使用してファイルをダウンロードする」をご参照ください。
#include <alibabacloud/oss/OssClient.h>
using namespace AlibabaCloud::OSS;
int main(void)
{
/* OSS へのアクセスに使用するアカウントに関する情報を初期化します。 */
/* バケットが配置されているリージョンのエンドポイントを指定します。たとえば、バケットが中国 (杭州) リージョンにある場合は、エンドポイントを https://oss-cn-hangzhou.aliyuncs.com に設定します。 */
std::string Endpoint = "yourEndpoint";
/* バケットが配置されているリージョンを指定します。たとえば、バケットが中国 (杭州) リージョンにある場合は、リージョンを cn-hangzhou に設定します。 * /
std::string Region = "yourRegion";
/* バケットの名前を指定します。例: examplebucket。 */
std::string BucketName = "examplebucket";
/* オブジェクトの完全なパスを指定します。完全なパスにバケット名を含めないでください。例: exampledir/exampleobject.txt。 */
std::string GetobjectUrlName = "exampledir/exampleobject.txt";
/* ネットワークリソースなどのリソースを初期化します。 */
InitializeSdk();
ClientConfiguration conf;
conf.signatureVersion = SignatureVersionType::V4;
/* 環境変数からアクセス資格情報を取得します。サンプルコードを実行する前に、OSS_ACCESS_KEY_ID および OSS_ACCESS_KEY_SECRET 環境変数が設定されていることを確認してください。 */
auto credentialsProvider = std::make_shared<EnvironmentVariableCredentialsProvider>();
OssClient client(Endpoint, credentialsProvider, conf);
client.SetRegion(Region);
/* 署名付き URL の有効期間を指定します。最大有効期間は 32,400 です。単位: 秒。 */
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;
return -1;
}
/* ネットワークリソースなどのリソースを解放します。 */
ShutdownSdk();
return 0;
}Ruby
SDK の詳細については、「Ruby で署名付き URL を使用してファイルをダウンロードする」をご参照ください。
require 'aliyun/oss'
client = Aliyun::OSS::Client.new(
# この例では、中国 (杭州) リージョンのエンドポイントが使用されています。実際の エンドポイントを指定してください。
endpoint: 'https://oss-cn-hangzhou.aliyuncs.com',
# 環境変数からアクセス資格情報を取得します。サンプルコードを実行する前に、OSS_ACCESS_KEY_ID および OSS_ACCESS_KEY_SECRET 環境変数が設定されていることを確認してください。
access_key_id: ENV['OSS_ACCESS_KEY_ID'],
access_key_secret: ENV['OSS_ACCESS_KEY_SECRET']
)
# バケットの名前を指定します。例: examplebucket。
bucket = client.get_bucket('examplebucket')
# オブジェクトをダウンロードするために使用される署名付き URL を生成し、その有効期間を 3,600 秒に設定します。
puts bucket.object_url('my-object', true, 3600)C
SDK の詳細については、「C で署名付き URL を使用してファイルをダウンロードする」をご参照ください。
#include "oss_api.h"
#include "aos_http_io.h"
/* バケットが配置されているリージョンのエンドポイントを指定します。たとえば、バケットが中国 (杭州) リージョンにある場合は、エンドポイントを https://oss-cn-hangzhou.aliyuncs.com に設定します。 */
const char *endpoint = "yourEndpoint";
/* バケットの名前を指定します。例: examplebucket。 */
const char *bucket_name = "examplebucket";
/* オブジェクトの完全なパスを指定します。完全なパスにバケット名を含めないでください。例: exampledir/exampleobject.txt。 */
const char *object_name = "exampledir/exampleobject.txt";
/* ローカルファイルの完全なパスを指定します。 */
const char *local_filename = "yourLocalFilename";
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);
/* 環境変数からアクセス資格情報を取得します。サンプルコードを実行する前に、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"));
/* CNAME を使用するかどうかを指定します。値 0 は CNAME を使用しないことを示します。 */
options->config->is_cname = 0;
/* タイムアウト期間などのネットワークパラメーターを設定します。 */
options->ctl = aos_http_controller_create(options->pool, 0);
}
int main(int argc, char *argv[])
{
/* main() で aos_http_io_initialize メソッドを呼び出して、ネットワークやメモリリソースなどのグローバルリソースを初期化します。 */
if (aos_http_io_initialize(NULL, 0) != AOSE_OK) {
exit(1);
}
/* メモリを管理するためのメモリプールを作成します。aos_pool_t は apr_pool_t と同等です。メモリプールを作成するために使用されるコードは APR ライブラリに含まれています。 */
aos_pool_t *pool;
/* メモリプールを作成します。2 番目のパラメーターの値は NULL です。この値は、プールが他のメモリプールを継承しないことを指定します。 */
aos_pool_create(&pool, NULL);
/* オプションを作成して初期化します。このパラメーターには、endpoint、access_key_id、access_key_secret、is_cname、curl などのグローバル設定情報が含まれます。 */
oss_request_options_t *oss_client_options;
/* メモリプール内のメモリリソースをオプションに割り当てます。 */
oss_client_options = oss_request_options_create(pool);
/* oss_client_options を初期化します。 */
init_options(oss_client_options);
/* パラメーターを初期化します。 */
aos_string_t bucket;
aos_string_t object;
aos_string_t file;
aos_http_request_t *req;
apr_time_t now;
char *url_str;
aos_string_t url;
int64_t expire_time;
int one_hour = 3600;
aos_str_set(&bucket, bucket_name);
aos_str_set(&object, object_name);
aos_str_set(&file, local_filename);
expire_time = now / 1000000 + one_hour;
req = aos_http_request_create(pool);
req->method = HTTP_GET;
now = apr_time_now();
/* 有効期間を指定します。単位: マイクロ秒 * /
expire_time = now / 1000000 + one_hour;
/* 署名付き URL を生成します。 */
url_str = oss_gen_signed_url(oss_client_options, &bucket, &object, expire_time, req);
aos_str_set(&url, url_str);
printf("Temporary download URL: %s\n", url_str);
/* メモリプールを解放します。この操作により、リクエストに割り当てられたメモリリソースが解放されます。 */
aos_pool_destroy(pool);
/* 割り当てられたグローバルリソースを解放します。 */
aos_http_io_deinitialize();
return 0;
}生成された署名付き URL の例は次のとおりです。
https://examplebucket.oss-cn-hangzhou.aliyuncs.com/exampleobject.txt?x-oss-process=image%2Fresize%2Cp_10&x-oss-date=20241115T095058Z&x-oss-expires=3600&x-oss-signature-version=OSS4-HMAC-SHA256&x-oss-credential=LTAI****************%2F20241115%2Fcn-hangzhou%2Foss%2Faliyun_v4_request&x-oss-signature=6e7a*********************************************コマンドラインツール ossutil の使用
examplebucket バケット内の example.txt オブジェクトに対して、次のコマンドを使用して、デフォルトの有効期間が 15 分のファイルダウンロードリンク (署名付き URL) を生成します。
ossutil presign oss://examplebucket/example.txtossutil を使用して署名付き URL を生成するその他の例については、「presign (署名付き URL の生成)」をご参照ください。
グラフィカル管理ツール ossbrowser の使用
ossbrowser は、コンソールでサポートされているものと同様のオブジェクトレベルの操作をサポートしています。ossbrowser インターフェイスに従って、署名付き URL を取得する操作を完了します。ossbrowser の使用方法については、「一般的な操作」をご参照ください。
ファイルのオンラインプレビューリンクの取得
オンラインプレビューをサポートするリンク (署名付き URL) を生成するには、まずカスタムドメイン名をアタッチする必要があります。カスタムドメイン名をアタッチした後、それを使用して署名付き URL を生成します。
OSS コンソールの使用
OSS コンソールにログインします。
左側のナビゲーションウィンドウで、[バケット] をクリックします。バケットページで、バケットの名前をクリックします。
左側のナビゲーションツリーで、 を選択します。
オブジェクトページで、オブジェクトの名前をクリックします。
[詳細の表示] パネルで、[カスタムドメイン名] フィールドでバケットにマッピングされているカスタムドメイン名を選択し、他のパラメーターはデフォルト設定のままにして、[オブジェクト URL のコピー] をクリックします。

ossbrowser の使用
ossbrowser を使用して、OSS コンソールで実行できるのと同じオブジェクトレベルの操作を実行できます。ossbrowser の画面上の指示に従って、署名付き URL を取得できます。ossbrowser のダウンロード方法については、「ossbrowser 1.0」をご参照ください。
カスタムドメイン名を使用して ossbrowser にログインします。
オブジェクトの URL を取得します。
OSS SDK の使用
カスタムドメイン名を使用して OssClient インスタンスを作成し、署名付き URL を生成できます。
Java
import com.aliyun.oss.*;
import com.aliyun.oss.common.auth.*;
import com.aliyun.oss.common.comm.SignVersion;
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 {
// カスタムドメイン名を指定します。例: https://static.example.com。
String endpoint = "yourCustomEndpoint";
// バケットが配置されているリージョンを指定します。例: cn-hangzhou。
String region = "cn-hangzhou";
// バケットの名前を指定します。例: examplebucket。
String bucketName = "examplebucket";
// オブジェクトの完全なパスを指定します。完全なパスにバケット名を含めないでください。例: exampledir/exampleobject.txt。
String objectName = "exampleobject.txt";
// 環境変数からアクセス資格情報を取得します。サンプルコードを実行する前に、環境変数を設定する必要があります。
EnvironmentVariableCredentialsProvider credentialsProvider = CredentialsProviderFactory.newEnvironmentVariableCredentialsProvider();
// OSSClient インスタンスを作成します。
// OSSClient が不要になったら、shutdown メソッドを呼び出してリソースを解放します。
ClientBuilderConfiguration clientBuilderConfiguration = new ClientBuilderConfiguration();
// CNAME を有効にするには、このパラメーターを true に設定します。
clientBuilderConfiguration.setSupportCname(true);
// V4 署名アルゴリズムの使用を明示的に宣言します。
clientBuilderConfiguration.setSignatureVersion(SignVersion.V4);
OSS ossClient = OSSClientBuilder.create()
.endpoint(endpoint)
.credentialsProvider(credentialsProvider)
.clientConfiguration(clientBuilderConfiguration)
.region(region)
.build();
try {
// 署名付き URL の有効期間を指定します。単位: ミリ秒。この例では、有効期間は 1 時間に設定されています。
Date expiration = new Date(new Date().getTime() + 3600 * 1000L);
// 署名付き URL を生成します。
GeneratePresignedUrlRequest request = new GeneratePresignedUrlRequest(bucketName, objectName, HttpMethod.GET);
// URL の有効期間を設定します。
request.setExpiration(expiration);
// HTTP GET リクエストを許可する署名付き URL を生成します。
URL signedUrl = ossClient.generatePresignedUrl(request);
// 署名付き URL を表示します。
System.out.println("signed url for getObject: " + 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
<?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], // バケットが配置されているリージョン。(必須)
"endpoint" => ['help' => 'The domain names that other services can use to access OSS.', 'required' => False], // OSS にアクセスするためのエンドポイント。(オプション)
"bucket" => ['help' => 'The name of the bucket', 'required' => True], // バケット名。(必須)
"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 = $options["bucket"]; // バケット名。
$key = $options["key"]; // オブジェクト名。
// 環境変数から資格情報を読み込みます。
// EnvironmentVariableCredentialsProvider を使用して、環境変数からアクセスキー ID とアクセスキーシークレットを読み取ります。
$credentialsProvider = new Oss\Credentials\EnvironmentVariableCredentialsProvider();
// SDK のデフォルト設定を使用します。
$cfg = Oss\Config::loadDefault();
$cfg->setCredentialsProvider($credentialsProvider); // 資格情報プロバイダーを設定します。
$cfg->setRegion($region); // バケットが配置されているリージョンを設定します。
$cfg->setEndpoint(endpoint: "http://static.example.com"); // これをカスタムエンドポイントに設定します。
$cfg->setUseCname(true); // CNAME を使用するように設定します。
// OSS クライアントインスタンスを作成します。
$client = new Oss\Client($cfg);
// オブジェクトをダウンロードするための GetObjectRequest オブジェクトを作成します。
$request = new Oss\Models\GetObjectRequest(bucket:$bucket, key:$key);
// presign メソッドを呼び出して署名付き URL を生成します。
$result = $client->presign($request);
// presign の結果を出力します。
// 署名付き URL を出力します。ユーザーはこれを使用してオブジェクトを直接ダウンロードできます。
print(
'get object presign result:' . var_export($result, true) . PHP_EOL . // presign 結果の詳細情報。
'get object url:' . $result->url . PHP_EOL // オブジェクトを直接ダウンロードするための署名付き URL。
);
Node.js
const OSS = require("ali-oss");
// 署名付き URL を生成するために使用される関数を指定します。
async function generateSignatureUrl(fileName) {
// 署名付き URL を取得します。
const client = await new OSS({
// バケットにマッピングするカスタムドメイン名を指定します。
endpoint: 'http://static.example.com',
// 環境変数からアクセス資格情報を取得します。サンプルコードを実行する前に、OSS_ACCESS_KEY_ID および OSS_ACCESS_KEY_SECRET 環境変数が設定されていることを確認してください。
accessKeyId: process.env.OSS_ACCESS_KEY_ID,
accessKeySecret: process.env.OSS_ACCESS_KEY_SECRET,
bucket: 'examplebucket',
// バケットが配置されているリージョンを指定します。たとえば、バケットが中国 (杭州) リージョンにある場合は、リージョンを oss-cn-hangzhou に設定します。
region: 'oss-cn-hangzhou',
authorizationV4: true,
cname: true
});
return await client.signatureUrlV4('GET', 3600, {
headers: {} // 実際のリクエストヘッダーに基づいてリクエストヘッダーを指定します。
}, fileName);
}
// 関数を呼び出し、オブジェクトの名前を渡します。
generateSignatureUrl('yourFileName').then(url => {
console.log('Generated Signature URL:', url);
}).catch(err => {
console.error('Error generating signature URL:', err);
});Python
import argparse
import alibabacloud_oss_v2 as oss
# コマンドラインパラメーターパーサーを作成し、スクリプトの目的を記述します。
parser = argparse.ArgumentParser(description="presign get object 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 パラメーターを指定して、バケットが配置されているリージョンのエンドポイントを示します。このパラメーターはオプションです。
parser.add_argument('--endpoint', help='The domain names that other services can use to access OSS')
# --key パラメーターを指定して、オブジェクトの名前を示します。このパラメーターは必須です。
parser.add_argument('--key', help='The name of the object.', required=True)
def main():
# コマンドラインパラメーターを解析して、指定された値を取得します。
args = parser.parse_args()
# 環境変数から、OSS へのアクセスに必要な認証情報を読み込みます。
credentials_provider = oss.credentials.EnvironmentVariableCredentialsProvider()
# デフォルト設定を使用して cfg オブジェクトを作成し、資格情報プロバイダーを指定します。
cfg = oss.config.load_default()
cfg.credentials_provider = credentials_provider
# ユーザーが指定したコマンドラインパラメーターに基づいて、設定オブジェクトのリージョン属性を指定します。
cfg.region = args.region
# カスタムエンドポイントを指定します。例: http://static.example.com
cfg.endpoint = "http://static.example.com"
# CNAME レコード解決を有効にします。
cfg.use_cname = True
# 上記の設定を使用して OSSClient インスタンスを初期化します。
client = oss.Client(cfg)
# 署名付き URL を生成するリクエストを開始します。
pre_result = client.presign(
oss.GetObjectRequest(
bucket=args.bucket, # バケット名を指定します。
key=args.key, # オブジェクトキーを指定します。
)
)
# HTTP メソッド、有効期限、署名付き URL を表示します。
print(f'method: {pre_result.method},'
f' expiration: {pre_result.expiration.strftime("%Y-%m-%dT%H:%M:%S.000Z")},'
f' url: {pre_result.url}'
)
# 署名付きヘッダーを表示します。
for key, value in pre_result.signed_headers.items():
print(f'signed headers key: {key}, signed headers value: {value}')
# スクリプトが直接実行されたときに、main 関数を呼び出して処理ロジックを開始します。
if __name__ == "__main__":
main() # スクリプトのエントリポイントを指定します。制御フローはここから始まります。Go
package main
import (
"context"
"flag"
"log"
"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()
// バケット名が空かどうかを確認します。
if len(bucketName) == 0 {
flag.PrintDefaults()
log.Fatalf("invalid parameters, bucket name required")
}
// リージョンが空かどうかを確認します。
if len(region) == 0 {
flag.PrintDefaults()
log.Fatalf("invalid parameters, region required")
}
// オブジェクト名が空かどうかを確認します。
if len(objectName) == 0 {
flag.PrintDefaults()
log.Fatalf("invalid parameters, object name required")
}
// デフォルト設定を読み込み、資格情報プロバイダーとリージョンを指定します。
cfg := oss.LoadDefaultConfig().
WithCredentialsProvider(credentials.NewEnvironmentVariableCredentialsProvider()).
WithRegion(region).
WithEndpoint("http://static.example.com").
WithUseCName(true)
// OSS クライアントを作成します。
client := oss.NewClient(cfg)
// GetObject リクエストの署名付き URL を生成します。
result, err := client.Presign(context.TODO(), &oss.GetObjectRequest{
Bucket: oss.Ptr(bucketName),
Key: oss.Ptr(objectName),
//RequestPayer: oss.Ptr("requester"), // リクエスタの ID を指定します。
},
oss.PresignExpires(10*time.Minute),
)
if err != nil {
log.Fatalf("failed to get object presign %v", err)
}
log.Printf("request method:%v\n", result.Method)
log.Printf("request expiration:%v\n", result.Expiration)
log.Printf("request url:%v\n", result.URL)
if len(result.SignedHeaders) > 0 {
// HTTP GET リクエストを許可する署名付き URL を生成する際にリクエストヘッダーを指定した場合、署名付き URL を使用して開始される GET リクエストにリクエストヘッダーが含まれていることを確認してください。これにより、リクエストの失敗や署名エラーを防ぐことができます。
log.Printf("signed headers:\n")
for k, v := range result.SignedHeaders {
log.Printf("%v: %v\n", k, v)
}
}
}ossutil の使用
presign (署名付き URL の生成) コマンドを実行して、カスタムドメイン名を使用してオブジェクトの署名付き URL を生成します。
ossutil presign oss://examplebucket/exampleobject.txt --endpoint "http://static.example.com” --addressing-style "cname"ossutil コマンドが毎回手動で指定する代わりにカスタムドメイン名を自動的に使用できるようにするには、カスタムドメイン名を設定ファイルに追加します。
リンクがまだプレビューできない場合は、次の構成を確認してください。
Content-Typeは適切に設定されていますか?ファイルの
Content-Typeが実際のタイプと一致しない場合、ブラウザはコンテンツを正しく識別してレンダリングできず、ファイルが添付ファイルとしてダウンロードされる原因となります。「Content-Type (MIME) の設定方法」を参照して、ファイル名拡張子がContent-Typeと一致するかどうかを確認できます。一致しない場合は、「オブジェクトのメタデータを管理する」を参照して、ファイルのContent-Typeを変更する方法を確認してください。Content-Dispositionはinlineに設定されていますか?ファイルの
Content-Dispositionがattachmentに設定されている場合、ブラウザはファイルを強制的にダウンロードします。「オブジェクトのメタデータを管理する」を参照して、プレビューをサポートするためにinlineに変更する方法を確認してください。CDN キャッシュはリフレッシュされましたか?
CDN アクセラレーションを使用していない場合は、この項目を無視できます。
CDN を使用して OSS リソースにアクセスする場合、ファイルメタデータを変更した後に CDN キャッシュをリフレッシュする必要があります。そうしないと、古い構成がまだ読み取られ、プレビューが有効にならない可能性があります。
ファイルの強制ダウンロードリンクの取得
現在のリンク (署名付き URL) がブラウザで直接プレビュー用に開くが、代わりにダウンロードさせたい場合は、次の方法を使用できます。方法 1 は方法 2 よりも優先度が高いです。
方法 1: 1 回限りの強制ダウンロード
これは現在生成されているリンクにのみ適用されます。URL を生成する際に response-content-disposition パラメーターを attachment に設定することで実装します。
Java
GeneratePresignedUrlRequest クラスをインポートします。
import com.aliyun.oss.model.GeneratePresignedUrlRequest;GeneratePresignedUrlRequest メソッドを使用し、response-content-disposition 応答ヘッダーを attachment に設定します。
// GET リクエストの署名付き URL を構築する
GeneratePresignedUrlRequest request = new GeneratePresignedUrlRequest(
bucketName, objectName, HttpMethod.GET);
// 強制ダウンロードを設定する
request.getResponseHeaders().setContentDisposition("attachment");Python
GetObjectRequest に response_content_disposition パラメーターを追加し、その値を attachment に設定します。
# 署名付き GET リクエストを生成する
pre_result = client.presign(
oss.GetObjectRequest(
bucket=args.bucket, # バケット名を指定する
key=args.key, # オブジェクトキーを指定する
response_content_disposition="attachment",# 強制ダウンロードに設定する
)
)Go
GetObjectRequest に ResponseContentDisposition パラメーターを追加し、その値を attachment に設定します。
// 強制ダウンロード動作を持つ署名付き GET リクエストを生成する
result, err := client.Presign(context.TODO(), &oss.GetObjectRequest{
Bucket: oss.Ptr(bucketName),
Key: oss.Ptr(objectName),
ResponseContentDisposition: oss.Ptr("attachment"), // 強制ダウンロードに設定する
})方法 2: ユニバーサル強制ダウンロード設定 (メタデータ経由)
これを一度設定すると、ファイルへのすべてのアクセスが強制的にダウンロードされます。これは、ファイルメタデータの Content-Disposition フィールドを変更することで実装されます。
OSS コンソールの使用
OSS 管理コンソールで、ターゲットファイルを見つけ、ファイル詳細パネルで [ファイルメタデータの設定] をクリックし、Content-Disposition を attachment に設定してから、[OK] をクリックして保存します。
コンソール操作に加えて、「ファイルメタデータの管理」を参照して、SDK またはコマンドラインインターフェイス ossutil を使用してこのフィールドを設定することもできます。
ダウンロード時に表示されるファイル名をカスタマイズしたい場合は、「ダウンロード時のファイル名のカスタマイズ」をご参照ください。
特定のバージョンのファイルへのリンクを取得する
バージョン管理が有効になっているバケットに適用可能な、特定のバージョンのファイルのリンク (署名付き URL) を生成します。
OSS コンソールの使用
OSS 管理コンソールにログインし、ターゲットバケットの [ファイル] タブに移動し、ページ右上の [履歴バージョン] を [表示] に切り替えることができます。

ターゲットファイルを見つけ、必要な履歴バージョンのファイル名をクリックし、詳細ページでこのバージョンファイルの URL を [コピー] します。

Alibaba Cloud SDK の使用
Java
次のキーコードを追加します。
// 1. バージョン ID 変数を定義する
String versionId = "CAEQARiBgID8rumR2hYiIGUyOTAyZGY2MzU5MjQ5ZjlhYzQzZjNlYTAyZDE3****";
// 2. クエリパラメーターマップを作成する
Map<String, String> queryParam = new HashMap<String, String>();
queryParam.put("versionId", versionId);
// 3. リクエストにバージョン ID パラメーターを追加する
request.setQueryParameter(queryParam);Python
GetObjectRequest に version_id パラメーターを追加します。
pre_result = client.presign(
oss.GetObjectRequest(
bucket=bucket_name,
key=object_name,
version_id='CAEQARiBgID8rumR2hYiIGUyOTAyZGY2MzU5MjQ5ZjlhYzQzZjNlYTAyZDE3****' # VersionId パラメーターを設定する
)
)Go
GetObjectRequest に VersionId フィールドを追加します。
result, err := client.Presign(context.TODO(), &oss.GetObjectRequest{
Bucket: oss.Ptr(bucketName),
Key: oss.Ptr(objectName),
VersionId: oss.Ptr("CAEQARiBgID8rumR2hYiIGUyOTAyZGY2MzU5MjQ5ZjlhYzQzZjNlYTAyZDE7****"), // VersionId を設定する
}, oss.PresignExpires(10*time.Minute))Node.js
signatureUrlV4 に queries パラメーターを追加します。
const signedUrl = await client.signatureUrlV4('GET', 3600, {
queries: {
"versionId": 'CAEQARiBgID8rumR2hYiIGUyOTAyZGY2MzU5MjQ5ZjlhYzQzZjNlYTAyZDE7****' // versionId パラメーターを追加する
}
}, objectName);PHP
GetObjectRequest に、versionId パラメーターを追加します。
// 特定のバージョンパラメーターを追加する
$versionId = "yourVersionId"; // 実際のバージョン番号に置き換えてください
$request = new Oss\Models\GetObjectRequest(bucket:$bucket, key:$key, versionId:$versionId);ossutil の使用
examplebucket バケット内のバージョン ID 123 の example.txt オブジェクトの署名付き URL を生成します。
ossutil presign oss://examplebucket/example.txt --version-id 123ファイルリンクの一括生成
コマンドラインインターフェイス ossutil の使用をお勧めします。これにより、フォルダ全体のファイルのリンクを一括で生成できます。
コマンドラインインターフェイス ossutil の使用
examplebucke バケットのフォルダディレクトリ内のすべてのファイルに対して、デフォルトの有効期間が 15 分の署名付き URL を生成します。
ossutil presign oss://examplebucket/folder/ -rexamplebucket バケットのフォルダディレクトリ内の .txt 拡張子を持つファイルに対して、デフォルトの有効期間が 15 分の署名付き URL を生成します。
ossutil presign oss://examplebucket/folder/ -r --include "*.txt"examplebucket バケット内のすべてのファイルに対して、デフォルトの有効期間が 15 分の署名付き URL を生成します。
ossutil presign oss://examplebucket/ -r
ossutil を使用した署名付き URL の生成の詳細については、「presign (署名付き URL の生成)」をご参照ください。
OSS コンソールの使用
現在のディレクトリ内のファイルの署名付き URL のみエクスポートできます。サブディレクトリ内のファイルの署名付き URL はエクスポートできません。
オブジェクトファイルを選択し、下の [URL リストのエクスポート] をクリックします。

表示される設定パネルでは、デフォルトのパラメーターがほとんどのシナリオに適しており、変更せずに使用できます。
OK をクリックして、生成された URL リストファイルをダウンロードして保存します。
Alibaba Cloud SDK の使用
GetBucket (ListObjects) 操作を使用してすべてのオブジェクト名を取得し、各オブジェクトの署名付き URL を生成します。
ダウンロードファイル名のカスタマイズ
強制ダウンロードに基づいて、ユーザーがファイルを保存するときに表示されるファイル名をさらに指定できます。方法 1 は方法 2 よりも優先度が高いです。
方法 1: 単一リクエストのダウンロードファイル名を設定する
単一の署名付き URL のダウンロードファイル名を指定します。response-content-disposition パラメーターを attachment に設定し、filename パラメーターを含めるだけで済みます。
Java
response-content-disposition パラメーターを設定します。
// クライアントがダウンロードする際に表示されるファイル名を設定します。例として "test.txt" を使用します
String filename = "test.txt";
request.getResponseHeaders().setContentDisposition("attachment;filename=" + URLEncoder.encode(filename,"UTF-8"));Python
response_content_disposition パラメーターを使用して、ダウンロードファイル名を test.txt にカスタマイズします。
# 署名付き GET リクエストを生成する
pre_result = client.presign(
oss.GetObjectRequest(
bucket=args.bucket, # バケット名を指定する
key=args.key, # オブジェクトキーを指定する
response_content_disposition="attachment;filename=test.txt",# クライアントがダウンロードする際に表示されるファイル名を設定します。この場合は "test.txt" です
)
)Go
ResponseContentDisposition パラメーターを使用して、ダウンロードファイル名を test.txt にカスタマイズします。
// 強制ダウンロード動作を持つ署名付き GET リクエストを生成する
result, err := client.Presign(context.TODO(), &oss.GetObjectRequest{
Bucket: oss.Ptr(bucketName),
Key: oss.Ptr(objectName),
ResponseContentDisposition: oss.Ptr("attachment;filename=test.txt"),//クライアントがダウンロードする際に表示されるファイル名を設定します。この場合は "test.txt" です
})方法 2: ユニバーサル設定 (メタデータ経由)
メタデータを変更して、すべてのアクセスに対して統一されたデフォルトのダウンロード名を設定します。これは、ファイルメタデータの Content-Disposition フィールドを attachment; filename="yourFileName" に変更することで実装されます。ここで、yourFileName は example.jpg などのカスタムファイル名です。
リンクの有効期間の設定
リンク (署名付き URL) の有効期間は生成時に設定され、後で変更することはできません。リンクは有効期間中に複数回アクセスでき、有効期限が切れると無効になります。
生成方法によってサポートされる最大有効期間は異なります。制限を超えると、生成の失敗やアクセス例外が発生します。
OSS コンソールの使用
OSS 管理コンソールにログインし、ターゲットバケットの [ファイル] リストに移動し、ターゲットファイルをクリックして、右側の詳細パネルの [有効期限] でリンクの有効期間を設定します。
Alibaba Cloud SDK の使用
サードパーティが署名付き URL を介してファイルを正常にダウンロードするには、oss:GetObject 権限が必要です。特定の権限付与操作については、「RAM ユーザーにカスタム権限を付与する」をご参照ください。生成後、ファイルにアクセスする必要があるサードパーティにリンクを送信できます。
コード内の有効期限を変更することで、署名付き URL の有効期限を設定できます。
Java
SDK の詳細については、「Java で署名付き URL を使用してオブジェクトをダウンロードする」をご参照ください。
import com.aliyun.oss.*;
import com.aliyun.oss.common.auth.*;
import com.aliyun.oss.common.comm.SignVersion;
import java.net.URL;
import java.util.Date;
public class Demo {
public static void main(String[] args) throws Throwable {
// この例では、中国 (杭州) リージョンのエンドポイントが使用されています。実際の エンドポイントを指定してください。
String endpoint = "https://oss-cn-hangzhou.aliyuncs.com";
// 環境変数からアクセス資格情報を取得します。サンプルコードを実行する前に、OSS_ACCESS_KEY_ID および OSS_ACCESS_KEY_SECRET 環境変数が設定されていることを確認してください。
EnvironmentVariableCredentialsProvider credentialsProvider = CredentialsProviderFactory.newEnvironmentVariableCredentialsProvider();
// バケットの名前を指定します。例: examplebucket。
String bucketName = "examplebucket";
// オブジェクトの完全なパスを指定します。例: exampleobject.txt。オブジェクトの完全なパスにバケット名を含めないでください。
String objectName = "exampleobject.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 {
// 署名付き URL の有効期間を指定します。単位: ミリ秒。この例では、有効期間は 1 時間です。
Date expiration = new Date(new Date().getTime() + 3600 * 1000L);
// HTTP GET リクエストを許可する署名付き URL を生成します。この例では、追加のリクエストヘッダーは指定されていません。他のユーザーはブラウザを使用して関連コンテンツに直接アクセスできます。
URL url = ossClient.generatePresignedUrl(bucketName, objectName, expiration);
System.out.println(url);
} 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();
}
}
}
}Python
SDK の詳細については、「Python で署名付き URL を使用してオブジェクトをダウンロードする」をご参照ください。
import argparse
import alibabacloud_oss_v2 as oss
# コマンドラインパラメーターパーサーを作成し、スクリプトの目的を記述します。
parser = argparse.ArgumentParser(description="presign get object 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 パラメーターを指定して、バケットが配置されているリージョンのエンドポイントを示します。このパラメーターはオプションです。
parser.add_argument('--endpoint', help='The domain names that other services can use to access OSS')
# --key パラメーターを指定して、オブジェクトの名前を示します。このパラメーターは必須です。
parser.add_argument('--key', help='The name of the object.', required=True)
def main():
# コマンドラインパラメーターを解析して、指定された値を取得します。
args = parser.parse_args()
# 環境変数から、OSS へのアクセスに必要な認証情報を読み込みます。
credentials_provider = oss.credentials.EnvironmentVariableCredentialsProvider()
# デフォルト設定を使用して cfg オブジェクトを作成し、資格情報プロバイダーを指定します。
cfg = oss.config.load_default()
cfg.credentials_provider = credentials_provider
# cfg オブジェクトの region 属性を、コマンドラインで指定されたリージョンに設定します。
cfg.region = args.region
# カスタムエンドポイントが指定されている場合は、cfg オブジェクトの endpoint 属性を指定されたエンドポイントで更新します。
if args.endpoint is not None:
cfg.endpoint = args.endpoint
# 上記の設定を使用して OSSClient インスタンスを初期化します。
client = oss.Client(cfg)
# 署名付き URL を生成するリクエストを開始します。
pre_result = client.presign(
oss.GetObjectRequest(
bucket=args.bucket, # バケット名を指定します。
key=args.key, # オブジェクトキーを指定します。
)
)
# HTTP メソッド、有効期限、署名付き URL を表示します。
print(f'method: {pre_result.method},'
f' expiration: {pre_result.expiration.strftime("%Y-%m-%dT%H:%M:%S.000Z")},'
f' url: {pre_result.url}'
)
# 署名付きヘッダーを表示します。
for key, value in pre_result.signed_headers.items():
print(f'signed headers key: {key}, signed headers value: {value}')
# スクリプトが直接実行されたときに、main 関数を呼び出して処理ロジックを開始します。
if __name__ == "__main__":
main() # スクリプトのエントリポイントを指定します。制御フローはここから始まります。Go
SDK の詳細については、「Go で署名付き URL を使用してオブジェクトをダウンロードする」をご参照ください。
package main
import (
"context"
"flag"
"log"
"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()
// バケット名が空かどうかを確認します。
if len(bucketName) == 0 {
flag.PrintDefaults()
log.Fatalf("invalid parameters, bucket name required")
}
// リージョンが空かどうかを確認します。
if len(region) == 0 {
flag.PrintDefaults()
log.Fatalf("invalid parameters, region required")
}
// オブジェクト名が空かどうかを確認します。
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)
// GetObject リクエストの署名付き URL を生成します。
result, err := client.Presign(context.TODO(), &oss.GetObjectRequest{
Bucket: oss.Ptr(bucketName),
Key: oss.Ptr(objectName),
},
oss.PresignExpires(10*time.Minute),
)
if err != nil {
log.Fatalf("failed to get object presign %v", err)
}
log.Printf("request method:%v\n", result.Method)
log.Printf("request expiration:%v\n", result.Expiration)
log.Printf("request url:%v\n", result.URL)
if len(result.SignedHeaders) > 0 {
// 返された結果に署名付きヘッダーが含まれている場合は、署名付き URL を使用して GET リクエストを送信するときに、対応するリクエストヘッダーを含める必要があります。そうしないと、リクエストが失敗したり、署名エラーが発生したりする可能性があります。
log.Printf("signed headers:\n")
for k, v := range result.SignedHeaders {
log.Printf("%v: %v\n", k, v)
}
}
}
Node.js
SDK の詳細については、「Node.js で署名付き URL を使用してオブジェクトをダウンロードする」をご参照ください。
const OSS = require("ali-oss");
// 署名付き URL を生成するために使用される関数を指定します。
async function generateSignatureUrl(fileName) {
// 署名付き URL を取得します。
const client = await new OSS({
// 環境変数からアクセス資格情報を取得します。サンプルコードを実行する前に、OSS_ACCESS_KEY_ID および OSS_ACCESS_KEY_SECRET 環境変数が設定されていることを確認してください。
accessKeyId: process.env.OSS_ACCESS_KEY_ID,
accessKeySecret: process.env.OSS_ACCESS_KEY_SECRET,
bucket: 'examplebucket',
// バケットが配置されているリージョンを指定します。たとえば、バケットが中国 (杭州) リージョンにある場合は、リージョンを oss-cn-hangzhou に設定します。
region: 'oss-cn-hangzhou',
// secure を true に設定し、HTTPS を使用して、生成されたダウンロードリンクがブラウザによってブロックされるのを防ぎます。
secure: true,
authorizationV4: true
});
return await client.signatureUrlV4('GET', 3600, {
headers: {} // 実際のリクエストヘッダーに基づいてリクエストヘッダーを指定します。
}, fileName);
}
// 関数を呼び出し、オブジェクトの名前を渡します。
generateSignatureUrl('yourFileName').then(url => {
console.log('Generated Signature URL:', url);
}).catch(err => {
console.error('Error generating signature URL:', err);
});PHP
SDK の詳細については、「PHP で署名付き URL を使用してオブジェクトをダウンロードする」をご参照ください。
<?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], // バケットが配置されているリージョン。(必須)
"endpoint" => ['help' => 'The domain names that other services can use to access OSS.', 'required' => False], // OSS にアクセスするためのエンドポイント。(オプション)
"bucket" => ['help' => 'The name of the bucket', 'required' => True], // バケット名。(必須)
"key" => ['help' => 'The name of the object', 'required' => True], // オブジェクト名。(必須)
"expire" => ['help' => 'The expiration time in seconds (default: 900)', 'required' => False], // 有効期限 (秒)。(オプション、デフォルト: 900)
];
// 引数の説明を 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 = $options["bucket"]; // バケット名。
$key = $options["key"]; // オブジェクト名。
$expire = isset($options["expire"]) ? (int)$options["expire"] : 900; // 有効期限。デフォルト: 900 秒。
// 環境変数から資格情報を読み込みます。
// EnvironmentVariableCredentialsProvider を使用して、環境変数からアクセスキー ID とアクセスキーシークレットを読み取ります。
$credentialsProvider = new Oss\Credentials\EnvironmentVariableCredentialsProvider();
// SDK のデフォルト設定を使用します。
$cfg = Oss\Config::loadDefault();
$cfg->setCredentialsProvider($credentialsProvider); // 資格情報プロバイダーを設定します。
$cfg->setRegion($region); // バケットが配置されているリージョンを設定します。
if (isset($options["endpoint"])) {
$cfg->setEndpoint($options["endpoint"]); // エンドポイントが指定されている場合は、それを設定します。
}
try {
// OSS クライアントインスタンスを作成します。
$client = new Oss\Client($cfg);
// オブジェクトをダウンロードするための GetObjectRequest オブジェクトを作成します。
$request = new Oss\Models\GetObjectRequest(bucket:$bucket, key:$key);
// presign メソッドを呼び出して署名付き URL を生成し、有効期限を設定します。
$result = $client->presign($request, [
'expires' => new \DateInterval("PT{$expire}S") // PT は Period Time、S は秒を表します。
]);
// 署名付き URL を出力します。
echo "Signed URL: " . $result->url . PHP_EOL;
} catch (Exception $e) {
echo "Error: " . $e->getMessage() . PHP_EOL;
exit(1);
}.NET
SDK の詳細については、「.NET で署名付き URL を使用してオブジェクトをダウンロードする」をご参照ください。
using Aliyun.OSS;
using Aliyun.OSS.Common;
// バケットが配置されているリージョンのエンドポイントを指定します。たとえば、バケットが中国 (杭州) リージョンにある場合は、エンドポイントを 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");
// バケットの名前を指定します。例: examplebucket。
var bucketName = "examplebucket";
// オブジェクトの完全なパスを指定します。完全なパスにはバケット名を含めることはできません。例: exampledir/exampleobject.txt。
var objectName = "exampledir/exampleobject.txt";
// バケットが配置されているリージョンを指定します。たとえば、バケットが中国 (杭州) リージョンにある場合は、リージョンを cn-hangzhou に設定します。
const string region = "cn-hangzhou";
// ClientConfiguration インスタンスを作成し、要件に基づいてデフォルトのパラメーターを変更します。
var conf = new ClientConfiguration();
// V4 署名を指定します。
conf.SignatureVersion = SignatureVersion.V4;
// OSSClient インスタンスを作成します。
var client = new OssClient(endpoint, accessKeyId, accessKeySecret, conf);
client.SetRegion(region);
try
{
var metadata = client.GetObjectMetadata(bucketName, objectName);
var etag = metadata.ETag;
// 署名付き URL を生成します。
var req = new GeneratePresignedUriRequest(bucketName, objectName, SignHttpMethod.Get)
{
// 署名付き URL の有効期間を設定します。デフォルト値: 3600。単位: 秒。
Expiration = DateTime.UtcNow.AddHours(1),
};
var uri = client.GeneratePresignedUri(req);
// 生成された署名付き URL を出力します
Console.WriteLine("Generated Signed URL: " + uri);
}
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);
}Android
SDK の詳細については、「Android で署名付き URL を使用してオブジェクトをダウンロードする」をご参照ください。
// バケットの名前を指定します。例: examplebucket。
String bucketName = "examplebucket";
// ソースオブジェクトの完全なパスを指定します。完全なパスにバケット名を含めないでください。例: exampleobject.txt。
String objectKey = "exampleobject.txt";
String url = null;
try {
// オブジェクトをダウンロードするための署名付き URL を生成します。
GeneratePresignedUrlRequest request = new GeneratePresignedUrlRequest(bucketName, objectKey);
// 署名付き URL の有効期間を 30 分に設定します。
request.setExpiration(30*60);
request.setMethod(HttpMethod.GET);
url = oss.presignConstrainedObjectURL(request);
Log.d("url", url);
} catch (ClientException e) {
e.printStackTrace();
}iOS
SDK の詳細については、「iOS で署名付き URL を使用してオブジェクトをダウンロードする」をご参照ください。
// バケットの名前を指定します。
NSString *bucketName = @"examplebucket";
// オブジェクトの名前を指定します。
NSString *objectKey = @"exampleobject.txt";
__block NSString *urlString;
// オブジェクトをダウンロードするための有効期間付きの署名付き URL を生成します。この例では、URL の有効期間は 30 分です。
OSSTask *task = [client presignConstrainURLWithBucketName:bucketName
withObjectKey:objectKey
httpMethod:@"GET"
withExpirationInterval:30 * 60
withParameters:@{}];
[task continueWithBlock:^id _Nullable(OSSTask * _Nonnull task) {
if (task.error) {
NSLog(@"presign error: %@", task.error);
} else {
urlString = task.result;
NSLog(@"url: %@", urlString);
}
return nil;
}];C++
SDK の詳細については、「C++ で署名付き URL を使用してオブジェクトをダウンロードする」をご参照ください。
#include <alibabacloud/oss/OssClient.h>
using namespace AlibabaCloud::OSS;
int main(void)
{
/* OSS へのアクセスに使用するアカウントに関する情報を初期化します。 */
/* バケットが配置されているリージョンのエンドポイントを指定します。たとえば、バケットが中国 (杭州) リージョンにある場合は、エンドポイントを https://oss-cn-hangzhou.aliyuncs.com に設定します。 */
std::string Endpoint = "yourEndpoint";
/* バケットが配置されているリージョンを指定します。たとえば、バケットが中国 (杭州) リージョンにある場合は、リージョンを cn-hangzhou に設定します。 * /
std::string Region = "yourRegion";
/* バケットの名前を指定します。例: examplebucket。 */
std::string BucketName = "examplebucket";
/* オブジェクトの完全なパスを指定します。完全なパスにバケット名を含めないでください。例: exampledir/exampleobject.txt。 */
std::string GetobjectUrlName = "exampledir/exampleobject.txt";
/* ネットワークリソースなどのリソースを初期化します。 */
InitializeSdk();
ClientConfiguration conf;
conf.signatureVersion = SignatureVersionType::V4;
/* 環境変数からアクセス資格情報を取得します。サンプルコードを実行する前に、OSS_ACCESS_KEY_ID および OSS_ACCESS_KEY_SECRET 環境変数が設定されていることを確認してください。 */
auto credentialsProvider = std::make_shared<EnvironmentVariableCredentialsProvider>();
OssClient client(Endpoint, credentialsProvider, conf);
client.SetRegion(Region);
/* 署名付き URL の有効期間を指定します。最大有効期間は 32,400 です。単位: 秒。 */
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;
return -1;
}
/* ネットワークリソースなどのリソースを解放します。 */
ShutdownSdk();
return 0;
}Ruby
SDK の詳細については、「Ruby で署名付き URL を使用してオブジェクトをダウンロードする」をご参照ください。
require 'aliyun/oss'
client = Aliyun::OSS::Client.new(
# この例では、中国 (杭州) リージョンのエンドポイントが使用されています。実際の エンドポイントを指定してください。
endpoint: 'https://oss-cn-hangzhou.aliyuncs.com',
# 環境変数からアクセス資格情報を取得します。サンプルコードを実行する前に、OSS_ACCESS_KEY_ID および OSS_ACCESS_KEY_SECRET 環境変数が設定されていることを確認してください。
access_key_id: ENV['OSS_ACCESS_KEY_ID'],
access_key_secret: ENV['OSS_ACCESS_KEY_SECRET']
)
# バケットの名前を指定します。例: examplebucket。
bucket = client.get_bucket('examplebucket')
# オブジェクトをダウンロードするために使用される署名付き URL を生成し、その有効期間を 3,600 秒に設定します。
puts bucket.object_url('my-object', true, 3600)C
SDK の詳細については、「C で署名付き URL を使用してオブジェクトをダウンロードする」をご参照ください。
#include "oss_api.h"
#include "aos_http_io.h"
/* バケットが配置されているリージョンのエンドポイントを指定します。たとえば、バケットが中国 (杭州) リージョンにある場合は、エンドポイントを https://oss-cn-hangzhou.aliyuncs.com に設定します。 */
const char *endpoint = "yourEndpoint";
/* バケットの名前を指定します。例: examplebucket。 */
const char *bucket_name = "examplebucket";
/* オブジェクトの完全なパスを指定します。完全なパスにバケット名を含めないでください。例: exampledir/exampleobject.txt。 */
const char *object_name = "exampledir/exampleobject.txt";
/* ローカルファイルの完全なパスを指定します。 */
const char *local_filename = "yourLocalFilename";
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);
/* 環境変数からアクセス資格情報を取得します。サンプルコードを実行する前に、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"));
/* CNAME を使用するかどうかを指定します。値 0 は CNAME を使用しないことを示します。 */
options->config->is_cname = 0;
/* タイムアウト期間などのネットワークパラメーターを設定します。 */
options->ctl = aos_http_controller_create(options->pool, 0);
}
int main(int argc, char *argv[])
{
/* main() で aos_http_io_initialize メソッドを呼び出して、ネットワークやメモリリソースなどのグローバルリソースを初期化します。 */
if (aos_http_io_initialize(NULL, 0) != AOSE_OK) {
exit(1);
}
/* メモリを管理するためのメモリプールを作成します。aos_pool_t は apr_pool_t と同等です。メモリプールを作成するために使用されるコードは APR ライブラリに含まれています。 */
aos_pool_t *pool;
/* メモリプールを作成します。2 番目のパラメーターの値は NULL です。この値は、プールが他のメモリプールを継承しないことを指定します。 */
aos_pool_create(&pool, NULL);
/* オプションを作成して初期化します。このパラメーターには、endpoint、access_key_id、access_key_secret、is_cname、curl などのグローバル設定情報が含まれます。 */
oss_request_options_t *oss_client_options;
/* メモリプール内のメモリリソースをオプションに割り当てます。 */
oss_client_options = oss_request_options_create(pool);
/* oss_client_options を初期化します。 */
init_options(oss_client_options);
/* パラメーターを初期化します。 */
aos_string_t bucket;
aos_string_t object;
aos_string_t file;
aos_http_request_t *req;
apr_time_t now;
char *url_str;
aos_string_t url;
int64_t expire_time;
int one_hour = 3600;
aos_str_set(&bucket, bucket_name);
aos_str_set(&object, object_name);
aos_str_set(&file, local_filename);
expire_time = now / 1000000 + one_hour;
req = aos_http_request_create(pool);
req->method = HTTP_GET;
now = apr_time_now();
/* 有効期間を指定します。単位: マイクロ秒 * /
expire_time = now / 1000000 + one_hour;
/* 署名付き URL を生成します。 */
url_str = oss_gen_signed_url(oss_client_options, &bucket, &object, expire_time, req);
aos_str_set(&url, url_str);
printf("Temporary download URL: %s\n", url_str);
/* メモリプールを解放します。この操作により、リクエストに割り当てられたメモリリソースが解放されます。 */
aos_pool_destroy(pool);
/* 割り当てられたグローバルリソースを解放します。 */
aos_http_io_deinitialize();
return 0;
}コマンドラインツール ossutil の使用
examplebucket バケット内の example.txt オブジェクトに対して、有効期間 1 時間の署名付き URL を生成します。
ossutil presign oss://examplebucket/example.txt --expires-duration 1hossutil を使用した署名付き URL の生成例の詳細については、「presign (署名付き URL の生成)」をご参照ください。
グラフィカル管理ツール ossbrowser の使用
ossbrowser は、コンソールでサポートされているものと同様のオブジェクトレベルの操作をサポートしています。ossbrowser インターフェイスガイドに従って、署名付き URL を取得する操作を完了します。ossbrowser の使用方法の詳細については、「一般的な操作」をご参照ください。
長期有効なリンクの取得
署名や有効期限のないファイル URL (リンク) は、次の 2 つの方法で取得できます。
方法 1: ファイルを公開読み取りに設定する (非推奨)
ファイルの ACL を「公開読み取り」に設定すると、永久に有効なファイル URL を取得できます。この設定は簡単で、追加のツールは不要です。ただし、ファイルアドレスは完全に公開され、誰でもアクセスでき、悪意のあるクローラーやトラフィックの乱用の影響を受けやすくなります。この方法は OSS のホットリンク保護 (Referer ホワイトリスト) と併用することをお勧めしますが、ソースが公開されるリスクは依然として存在します。
方法 2: CDN を介して公開読み取りアクセスを提供する (推奨)
ファイルを非公開に保ち、CDN を介して公開アクセスを実装します。CDN のプライベート OSS バケット back-to-origin 機能を有効にすると、CDN アクセラレーションドメイン名を通じてプライベートバケット内のすべてのリソースにアクセスできます。元の URL のプライベート認証方法は無効になります。方法 1 と比較して、OSS は直接公開されず、より高いセキュリティを提供し、アクセラレーションとアクセス制御機能をサポートします。リンクの乱用を防ぐために、CDN のReferer ホットリンク保護とURL 署名を有効にすることをお勧めします。
長期有効なファイル URL の構築方法
ドメイン名の種類に基づいてファイルアクセスアドレスを構築できます。
ドメイン名の種類 | URL フォーマット | 例 |
OSS デフォルトドメイン名 |
| たとえば、中国 (杭州) リージョンの examplebucket という名前のバケットに、example という名前のフォルダがあり、その中に example.jpg という名前のファイルがあるとします。
|
カスタムドメイン名 |
| たとえば、中国 (杭州) リージョンの examplebucket にカスタムドメイン名 |
CDN アクセラレーションドメイン名 |
| たとえば、CDN アクセラレーションドメイン名が |
<BucketName>: バケットの名前。<ObjectName>: ファイルの完全なパス (例:folder/example.jpg)。<Endpoint>: リージョンのエンドポイント。<YourDomainName>: カスタムドメイン名。詳細については、「バケットのデフォルトドメイン名にカスタムドメイン名をアタッチする」をご参照ください。<CDN accelerated domain name>: CDN アクセラレーションドメイン名。
HTTPS プロトコルの設定
リンクプロトコルはエンドポイントによって決まります。デフォルトのエンドポイントは設定不要で、直接 HTTPS をサポートします。カスタムドメイン名を使用する場合、HTTPS プロトコルを有効にする前に、まず証明書のホスティングを完了する必要があります。
OSS コンソール: リンクを生成する際、詳細パネルでプロトコルを選択できます。HTTPS がデフォルトのプロトコルです。
ossutil/SDK: これは設定したエンドポイントに依存します。
https://で始まる場合は HTTPS が使用されます。
.txt ファイルをプレビューする際の中国語の文字化け
ブラウザや OSS コンソールで .txt ファイルをプレビューする際に、中国語の文字が文字化けして表示される場合、通常はファイルが正しいエンコード形式を宣言していないことが原因です。ファイルメタデータの Content-Type フィールドを text/plain;charset=utf-8 に設定することで、ブラウザに正しい UTF-8 エンコーディングでコンテンツを表示させることができます。
OSS 管理コンソールにログインします。
[バケットリスト] をクリックし、ターゲットバケットの名前をクリックします。
左側のナビゲーションウィンドウで、 を選択します。
ターゲットオブジェクトの右側で、 を選択します。
[HTTP 標準プロパティ] エリアで、[Content-Type] を [text/plain;charset=utf-8] に設定します。
[OK] をクリックして設定を保存します。
アクセス元の制限
Referer ホットリンク保護を設定することで、指定したウェブサイトのみが OSS リソースにアクセスできるようにし、他のソースからのリクエストを拒否できます。
たとえば、公式ウェブサイト https://example.com からのアクセスリクエストのみを許可し、他のソースからのリクエストは拒否することができます。
より多くの操作のためのサードパーティへの権限付与
署名付き URL に加えて、Alibaba Cloud はより柔軟な一時的な権限付与方法である STS 一時アクセス資格情報を提供しています。サードパーティがダウンロード以外の OSS 操作 (リストやコピーなど) を実行できるようにしたい場合は、STS 一時アクセス資格情報について学び、使用することをお勧めします。詳細については、「STS 一時アクセス資格情報を使用して OSS にアクセスする」をご参照ください。
画像の処理
画像処理パラメーターを含む署名付き URL を生成して、画像のサイズ変更やウォーターマークの追加など、画像を処理できます。