デフォルトでは、Object Storage Service (OSS) バケット内のオブジェクトは非公開であり、オブジェクト所有者のみがアクセスできます。ただし、オブジェクト所有者は、プレサイン URL を提供することにより、他のユーザーにプライベートオブジェクトへの一時的なアクセスとダウンロードを許可できます。
注意事項
このトピックでは、中国 (杭州) リージョンのパブリックエンドポイントが使用されています。同じリージョン内の他の Alibaba Cloud サービスから OSS にアクセスするには、内部エンドポイントを使用します。サポートされているリージョンとエンドポイントの詳細については、「リージョンとエンドポイント」をご参照ください。
プレサイン URL を生成するために特定の権限は必要ありません。ただし、他のユーザーがプレサイン URL を使用してオブジェクトをダウンロードできるようにするには、
oss:GetObject
権限が必要です。詳細については、「RAM ポリシーの一般的な例」をご参照ください。プレサイン URL は、その有効期間内であれば複数回使用できます。プレサイン URL の有効期限が切れたら、手順 1 を実行して新しいプレサイン URL を生成し、オブジェクトへのアクセスを継続する必要があります。
処理の概要
次のフローチャートは、プレサイン URL を使用してオブジェクトをダウンロードする方法を示しています。
手順
手順 1: オブジェクト所有者が GET メソッドのプレサイン URL を生成する
OSS コンソールまたは ossbrowser を使用してプレサイン URL を生成する場合、最大有効期間は 32,400 秒 (9 時間) です。
ossutil または OSS SDK を使用してプレサイン URL を生成する場合、最大有効期間は 7 日間です。
Security Token Service (STS) トークンを使用してプレサイン URL を生成する場合、最大有効期間は 43,200 秒 (12 時間) です。
OSS コンソールの使用
OSS コンソールを使用してプレサイン URL を生成するには、次の手順を実行します。
OSS コンソールにログインします。
[バケット] をクリックし、アクセスするバケットの名前をクリックします。
左側のナビゲーションウィンドウで、
を選択します。プレサイン URL を生成します。
サードパーティユーザーにダウンロードを許可するオブジェクトの名前をクリックします。
詳細 パネルで、次のパラメーターを構成し、オブジェクト URL のコピー をクリックします。
パラメーター
説明
有効期間
共有するオブジェクトの ACL が非公開の場合は、オブジェクトの URL の有効期間を設定する必要があります。
有効な値: 60 ~ 32400
単位: 秒
有効期間の長い URL を生成するには、OSS SDK や ossutil などのツールを使用できます。
CNAME
画像または Web ページオブジェクトが URL を使用してアクセスされたときにダウンロードされるのではなくプレビューされるようにするには、バケットにマッピングされているカスタムドメイン名を使用します。
このパラメーターは、カスタムドメイン名がバケットにマッピングされている場合にのみ使用できます。詳細については、「カスタムドメイン名をマッピングする」をご参照ください。
HTTPS を使用する
デフォルトでは、生成される URL は HTTPS プロトコルを使用します。HTTP プロトコルを使用してオブジェクトの URL を生成するには、[HTTPS を使用する] をオフにします。
ossbrowser の使用
ossbrowser は、コンソールでサポートされているものと同様のオブジェクトレベルの操作をサポートしています。 ossbrowser インターフェースの指示に従って、署名付き URL を取得します。 ossbrowser の使用方法の詳細については、「一般的な操作」をご参照ください。
Alibaba Cloud SDK の使用
次のサンプルコードは、一般的なプログラミング言語用の OSS SDK を使用して署名付き 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 インスタンスを作成します。
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 パラメーターを指定します。これは、他の サービス が OSS にアクセスするために使用できる エンドポイント を指定します。このコマンドライン パラメーターはオプションです。
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()
# 認証のために環境変数からアクセス認証情報を取得します。
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 インスタンスを初期化し、インスタンスが OSS と対話できるようにします。
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", "", "バケットが配置されているリージョン。")
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)
// 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("オブジェクトの署名付き URL の取得に失敗しました %v", err)
}
log.Printf("リクエスト メソッド: %v\n", result.Method)
log.Printf("リクエストの有効期限: %v\n", result.Expiration)
log.Printf("リクエスト URL: %v\n", result.URL)
if len(result.SignedHeaders) > 0 {
// HTTP GET リクエストを許可する署名付き URL を生成するときに リクエストヘッダー を指定する場合は、署名付き URL を使用して開始された GET リクエストに リクエストヘッダー が含まれていることを確認してください。これにより、リクエストの失敗と署名エラーを防ぎます。
log.Printf("署名付き ヘッダー :\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
// 依存関係をロードするために 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 "Error: the following arguments are required: --$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"]); // エンドポイント が指定されている場合は、それを指定します。
}
// OSS クライアント インスタンスを作成します。
$client = new Oss\Client($cfg);
// オブジェクトをダウンロードするために GetObjectRequest オブジェクトを作成します。
$request = new Oss\Models\GetObjectRequest(bucket:$bucket, key:$key);
// presign メソッドを呼び出して、署名付きリクエストを生成します。
$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 。
);
.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);
/* 署名付き URL を生成するためのリクエストを作成します。 */
req = aos_http_request_create(oss_client_options->pool);
/* リクエストメソッドを GET に設定します。 */
req->method = HTTP_GET;
/* 現在時刻を取得します。 */
now = apr_time_now();
/* 有効期限を 1 時間後に設定します。 */
expire_time = now / 1000000 + one_hour;
/* 署名付き URL を生成します。 */
oss_sign_url(oss_client_options, &bucket, &object, expire_time, req->query_params, &url);
url_str = apr_psprintf(oss_client_options->pool, "%.*s", url.len, url.data);
printf("signed url : %s\n", url_str);
/* リソースを解放します。 */
aos_pool_destroy(pool);
/* main() で aos_http_io_deinitialize メソッドを呼び出して、ネットワークやメモリ リソースなどのグローバル リソースを解放します。 */
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 を使用する
次のサンプル コマンドは、指定されたバケットにある example.txt オブジェクトの署名付き URL を生成し、オブジェクトへの 15 分間のアクセスを有効にします。
ossutil presign oss://examplebucket/example.txt
ossutil を使用して署名付き URL を生成する方法の詳細については、「presign (署名付き URL を生成する)」をご参照ください。
ステップ 2:他のユーザーが GET メソッドを使用して署名付き URL でファイルをダウンロードする
ブラウザを使用する
署名付き URL をコピーし、ブラウザのアドレスバーに貼り付けて、Enter キーを押します。
curl コマンドを使用する
ターミナルで、次のコマンドを入力し、<presigned_url> をステップ 1 で生成された署名付き URL に置き換えます。
curl -SO "<presigned_url>"
ターミナルで次のコマンドを実行します。<presigned_url> をステップ 1 で生成された署名付き URL に置き換えます。
curl -SO "https://examplebucket.oss-cn-hangzhou.aliyuncs.com/exampleobject.txt?x-oss-date=20241112T092756Z&x-oss-expires=3599&x-oss-signature-version=OSS4-HMAC-SHA256&x-oss-credential=LTAI****************/20241112/cn-hangzhou/oss/aliyun_v4_request&x-oss-signature=ed5a******************************************************"
wget コマンドを使用してダウンロードする
ターミナルで次のコマンドを入力し、<presigned_url> をステップ 1 で生成された署名付き URL に置き換えると、ファイルは現在のフォルダにカスタムファイル名 example.txt で保存されます。
wget -O example.txt "<presigned_url>"
コマンド例:
wget -O example.txt "https://examplebucket.oss-cn-hangzhou.aliyuncs.com/exampleobject.txt?x-oss-date=20241112T092756Z&x-oss-expires=3599&x-oss-signature-version=OSS4-HMAC-SHA256&x-oss-credential=LTAI****************/20241112/cn-hangzhou/oss/aliyun_v4_request&x-oss-signature=ed5a*********************************************"
OSS SDK を使用する
Java
import java.io.BufferedInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.URL;
public class Demo {
public static void main(String[] args) {
// HTTP GET リクエストを許可する署名付き URL を指定します。
String fileURL = "https://examplebucket.oss-cn-hangzhou.aliyuncs.com/exampleobject.txt?x-oss-date=20241112T092756Z&x-oss-expires=3599&x-oss-signature-version=OSS4-HMAC-SHA256&x-oss-credential=LTAI****************/20241112/cn-hangzhou/oss/aliyun_v4_request&x-oss-signature=ed5a******************************************************";
// ダウンロードしたオブジェクトを保存するパスを、オブジェクト名と拡張子を含めて指定します。
String savePath = "C:/downloads/myfile.txt";
try {
downloadFile(fileURL, savePath);
System.out.println("ダウンロードが完了しました!");
} catch (IOException e) {
System.err.println("ダウンロード中にエラーが発生しました: " + e.getMessage());
}
}
private static void downloadFile(String fileURL, String savePath) throws IOException {
URL url = new URL(fileURL);
HttpURLConnection httpConn = (HttpURLConnection) url.openConnection();
httpConn.setRequestMethod("GET");
// 応答コードを指定します。
int responseCode = httpConn.getResponseCode();
if (responseCode == HttpURLConnection.HTTP_OK) {
// 入力ストリームを設定します。
InputStream inputStream = new BufferedInputStream(httpConn.getInputStream());
// 出力ストリームを設定します。
FileOutputStream outputStream = new FileOutputStream(savePath);
byte[] buffer=new byte[4096]; // バッファのサイズを指定します。
int bytesRead;
while ((bytesRead = inputStream.read(buffer)) != -1) {
outputStream.write(buffer, 0, bytesRead);
}
outputStream.close();
inputStream.close();
} else {
System.out.println("ダウンロードするファイルがありません。サーバーは HTTP コードを返信しました: " + responseCode);
}
httpConn.disconnect();
}
}
Python
import requests
file_url = "https://examplebucket.oss-cn-hangzhou.aliyuncs.com/exampleobject.txt?x-oss-date=20241112T092756Z&x-oss-expires=3599&x-oss-signature-version=OSS4-HMAC-SHA256&x-oss-credential=LTAI****************/20241112/cn-hangzhou/oss/aliyun_v4_request&x-oss-signature=ed5a******************************************************"
save_path = "C:/downloads/myfile.txt"
try:
response = requests.get(file_url, stream=True)
if response.status_code == 200:
with open(save_path, 'wb') as f:
for chunk in response.iter_content(4096):
f.write(chunk)
print("Download completed!") # ダウンロード完了
else:
print(f"No file to download. Server replied HTTP code: {response.status_code}") # ダウンロードするファイルがありません。サーバーは HTTP コードを返信しました:
except Exception as e:
print("Error during download:", e) # ダウンロード中にエラーが発生しました:
Go
package main
import (
"io"
"net/http"
"os"
)
func main() {
fileURL := "https://examplebucket.oss-cn-hangzhou.aliyuncs.com/exampleobject.txt?x-oss-date=20241112T092756Z&x-oss-expires=3599&x-oss-signature-version=OSS4-HMAC-SHA256&x-oss-credential=LTAI****************/20241112/cn-hangzhou/oss/aliyun_v4_request&x-oss-signature=ed5a******************************************************"
savePath := "C:/downloads/myfile.txt"
response, err := http.Get(fileURL)
if err != nil {
panic(err)
}
defer response.Body.Close()
if response.StatusCode == http.StatusOK {
outFile, err := os.Create(savePath)
if err != nil {
panic(err)
}
defer outFile.Close()
_, err = io.Copy(outFile, response.Body)
if err != nil {
panic(err)
}
println("Download completed!") // ダウンロード完了
} else {
println("No file to download. Server replied HTTP code:", response.StatusCode) // ダウンロードするファイルがありません。サーバーは次の HTTP コードを返信しました:
}
}
Node.js
const https = require('https');
const fs = require('fs');
const fileURL = "https://examplebucket.oss-cn-hangzhou.aliyuncs.com/exampleobject.txt?x-oss-date=20241112T092756Z&x-oss-expires=3599&x-oss-signature-version=OSS4-HMAC-SHA256&x-oss-credential=LTAI****************/20241112/cn-hangzhou/oss/aliyun_v4_request&x-oss-signature=ed5a******************************************************";
const savePath = "C:/downloads/myfile.txt";
https.get(fileURL, (response) => {
if (response.statusCode === 200) {
const fileStream = fs.createWriteStream(savePath);
response.pipe(fileStream);
fileStream.on('finish', () => {
fileStream.close();
console.log("Download completed!"); // ダウンロード完了
});
} else {
console.error(`Download failed. Server responded with code: ${response.statusCode}`); // ダウンロードに失敗しました。サーバーは次のコードで応答しました:
}
}).on('error', (err) => {
console.error("Error during download:", err.message); // ダウンロード中にエラーが発生しました:
});
browser.js
const fileURL = "https://examplebucket.oss-cn-hangzhou.aliyuncs.com/exampleobject.txt?x-oss-date=20241112T092756Z&x-oss-expires=3599&x-oss-signature-version=OSS4-HMAC-SHA256&x-oss-credential=LTAI****************/20241112/cn-hangzhou/oss/aliyun_v4_request&x-oss-signature=ed5a******************************************************";
const savePath = "C:/downloads/myfile.txt"; // ダウンロードしたオブジェクトの名前を指定します。
fetch(fileURL)
.then(response => {
if (!response.ok) {
throw new Error(`Server replied HTTP code: ${response.status}`); // サーバーは HTTP コードを返信しました:
}
return response.blob(); // 応答のタイプを blob に変更します。
})
.then(blob => {
const link = document.createElement('a');
link.href = window.URL.createObjectURL(blob);
link.download=savePath; // ダウンロードしたオブジェクトの名前を指定します。
document.body.appendChild(link); // このステップは、署名付き URL がドキュメントに存在することを保証します。
link.click(); // 署名付き URL をクリックして、オブジェクトのダウンロードをシミュレートします。
link.remove(); // オブジェクトがダウンロードされた後、署名付き URL を削除します。
console.log("Download completed!"); // ダウンロード完了
})
.catch(error => {
console.error("Error during download:", error); // ダウンロード中にエラーが発生しました:
});
Android
import android.os.AsyncTask;
import android.os.Environment;
import java.io.BufferedInputStream;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.URL;
public class DownloadTask extends AsyncTask<String, String, String> {
@Override
protected String doInBackground(String... params) {
String fileURL = params[0];
String savePath = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS) + "/myfile.txt"; // ダウンロードしたオブジェクトを保存するパスを指定します。
try {
URL url = new URL(fileURL);
HttpURLConnection httpConn = (HttpURLConnection) url.openConnection();
httpConn.setRequestMethod("GET");
int responseCode = httpConn.getResponseCode();
if (responseCode == HttpURLConnection.HTTP_OK) {
InputStream inputStream = new BufferedInputStream(httpConn.getInputStream());
FileOutputStream outputStream = new FileOutputStream(savePath);
byte[] buffer = new byte[4096];
int bytesRead;
while ((bytesRead = inputStream.read(buffer)) != -1) {
outputStream.write(buffer, 0, bytesRead);
}
outputStream.close();
inputStream.close();
return "Download completed!"; // ダウンロード完了
} else {
return "No file to download. Server replied HTTP code: " + responseCode; // ダウンロードするファイルがありません。サーバーは HTTP コードを返信しました:
}
} catch (Exception e) {
return "Error during download: " + e.getMessage(); // ダウンロード中にエラーが発生しました:
}
}
}
iOS
#import <Foundation/Foundation.h>
int main(int argc, const char * argv[]) {
@autoreleasepool {
// 署名付き URL とオブジェクトを保存するパスを指定します。
NSString *fileURL = @"https://examplebucket.oss-cn-hangzhou.aliyuncs.com/exampleobject.txt?x-oss-date=20241112T092756Z&x-oss-expires=3599&x-oss-signature-version=OSS4-HMAC-SHA256&x-oss-credential=LTAI****************/20241112/cn-hangzhou/oss/aliyun_v4_request&x-oss-signature=ed5a******************************************************";
NSString *savePath = @"/Users/your_username/Desktop/myfile.txt"; // your_username をユーザー名に置き換えます。
// URL オブジェクトを作成します。
NSURL *url = [NSURL URLWithString:fileURL];
// オブジェクトダウンロードタスクを作成します。
NSURLSessionDataTask *task = [[NSURLSession sharedSession] dataTaskWithURL:url completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) {
// エラーを処理します。
if (error) {
NSLog(@"Error during download: %@", error.localizedDescription); // ダウンロード中にエラーが発生しました:
return;
}
// オブジェクト内のデータを確認します。
if (!data) {
NSLog(@"No data received."); // データを受信しませんでした。
return;
}
// オブジェクトを保存します。
NSError *writeError = nil;
BOOL success = [data writeToURL:[NSURL fileURLWithPath:savePath] options:NSDataWritingAtomic error:&writeError];
if (success) {
NSLog(@"Download completed!"); // ダウンロード完了
} else {
NSLog(@"Error saving file: %@", writeError.localizedDescription); // ファイルの保存中にエラーが発生しました:
}
}];
// オブジェクトダウンロードタスクを開始します。
[task resume];
// 非同期リクエストを完了するために、メインスレッドの実行を続けます。
[[NSRunLoop currentRunLoop] run];
}
return 0;
}
その他のシナリオ
特定のバージョンのオブジェクトに対する HTTP GET リクエストを許可する署名付き URL を生成する
カスタムドメイン名を使用してプレビューするための署名付き URL を生成する
強制ダウンロード用の署名付き URL を生成する
一度に複数の署名付き URL を生成する
詳細情報
署名付き URL とは
署名付き URL は、署名データと有効期限情報を含む URL であり、OSS オブジェクトへの安全な一時アクセスを提供します。 署名付き URL を生成する場合、ローカルシステムは AccessKey ペアを使用してリソースパスや有効期限などのパラメーターを暗号化し、署名パラメーターを生成して URL に追加し、完全な署名付き URL を形成します。 一般的な形式は次のとおりです。https://BucketName.Endpoint/Object?signature parameters
。
署名付き URL を使用してオブジェクトがリクエストされると、OSS は署名情報を検証します。 URL のパラメーター設定に不整合がある場合、または URL の有効期限が切れている場合、リクエストは拒否されます。 署名付き 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*********************************
署名付き URL を使用すると、オブジェクト所有者はアクセス認証情報を公開することなく、OSS オブジェクトへの安全で期限付きのアクセスを提供できます。
シナリオ
短期ファイル共有: 第三者が特定のファイルへのアクセスをリクエストすると、バックエンドは有効期限付きの署名付き URL を生成し、フロントエンドに返します。 フロントエンドはこの URL を第三者に提供し、第三者はリンクの有効期間内にファイルを安全にアップロードまたはダウンロードできます。
柔軟なアクセス: オブジェクト所有者は、電子メールまたはチャットツールを介して署名付き URL を共有できます。 第三者は、ブラウザのアドレスバーに URL を貼り付けることでファイルをダウンロードできます。