すべてのプロダクト
Search
ドキュメントセンター

Object Storage Service:プレサイン URL を使用してオブジェクトをダウンロードする

最終更新日:May 30, 2025

デフォルトでは、Object Storage Service (OSS) バケット内のオブジェクトは非公開であり、オブジェクト所有者のみがアクセスできます。ただし、オブジェクト所有者は、プレサイン URL を提供することにより、他のユーザーにプライベートオブジェクトへの一時的なアクセスとダウンロードを許可できます。

注意事項

  • このトピックでは、中国 (杭州) リージョンのパブリックエンドポイントが使用されています。同じリージョン内の他の Alibaba Cloud サービスから OSS にアクセスするには、内部エンドポイントを使用します。サポートされているリージョンとエンドポイントの詳細については、「リージョンとエンドポイント」をご参照ください。

  • プレサイン URL を生成するために特定の権限は必要ありません。ただし、他のユーザーがプレサイン URL を使用してオブジェクトをダウンロードできるようにするには、oss:GetObject 権限が必要です。詳細については、「RAM ポリシーの一般的な例」をご参照ください。

  • プレサイン URL は、その有効期間内であれば複数回使用できます。プレサイン URL の有効期限が切れたら、手順 1 を実行して新しいプレサイン URL を生成し、オブジェクトへのアクセスを継続する必要があります。

処理の概要

次のフローチャートは、プレサイン URL を使用してオブジェクトをダウンロードする方法を示しています。

image

手順

手順 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 を生成するには、次の手順を実行します。

  1. OSS コンソールにログインします。

  2. [バケット] をクリックし、アクセスするバケットの名前をクリックします。

  3. 左側のナビゲーションウィンドウで、オブジェクト管理 > オブジェクト を選択します。

  4. プレサイン URL を生成します。

    1. サードパーティユーザーにダウンロードを許可するオブジェクトの名前をクリックします。

    2. 詳細 パネルで、次のパラメーターを構成し、オブジェクト URL のコピー をクリックします。

      image

      パラメーター

      説明

      有効期間

      共有するオブジェクトの 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(&region, "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 を生成する

このシナリオは、バージョン管理を有効にしているユーザーに適用されます。

次のサンプルコードは、特定のバージョンのオブジェクトに対する HTTP GET リクエストを許可する署名付き URL を生成し、サードパーティがオブジェクトの履歴バージョンをダウンロードできるようにします。

Java

import com.aliyun.oss.*;
import com.aliyun.oss.common.auth.*;
import com.aliyun.oss.model.GeneratePresignedUrlRequest;
import java.net.URL;
import java.util.*;
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";
        // オブジェクトのバージョン ID を指定します。
        String versionId = "CAEQARiBgID8rumR2hYiIGUyOTAyZGY2MzU5MjQ5ZjlhYzQzZjNlYTAyZDE3****";
        // バケットが配置されているリージョンを指定します。たとえば、バケットが中国 (杭州) リージョンにある場合は、リージョンを 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 {
            // リクエストを作成します。
            GeneratePresignedUrlRequest generatePresignedUrlRequest = new GeneratePresignedUrlRequest(bucketName, objectName);
            // HttpMethod を GET に設定します。
            generatePresignedUrlRequest.setMethod(HttpMethod.GET);
            // 署名付き URL の有効期間を指定します。単位: ミリ秒。この例では、有効期間は 1 時間です。
            Date expiration = new Date(new Date().getTime() + 3600 * 1000L);
            generatePresignedUrlRequest.setExpiration(expiration);
            // オブジェクトのバージョン ID を指定します。
            Map<String, String> queryParam = new HashMap<String, String>();
            queryParam.put("versionId", versionId);
            generatePresignedUrlRequest.setQueryParameter(queryParam);
            // 署名付き URL を生成します。
            URL url = ossClient.generatePresignedUrl(generatePresignedUrlRequest);
            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

import argparse
import alibabacloud_oss_v2 as oss

# コマンドラインパラメータパーサーを作成し、スクリプトの目的を記述します。
parser = argparse.ArgumentParser(description="presign get object sample")

# --region パラメータを指定して、バケットが配置されているリージョンを示します。このパラメータは必須です。
parser.add_argument('--region', help='バケットが配置されているリージョン。', required=True)
# --bucket パラメータを指定して、オブジェクトが格納されているバケットの名前を示します。このパラメータは必須です。
parser.add_argument('--bucket', help='バケットの名前。', required=True)
# --endpoint パラメータを指定して、バケットが配置されているリージョンのエンドポイントを示します。このパラメータはオプションです。
parser.add_argument('--endpoint', help='他のサービスが OSS にアクセスするために使用できるドメイン名')
# --key パラメータを指定して、オブジェクトの名前を示します。このパラメータは必須です。
parser.add_argument('--key', help='オブジェクトの名前。', required=True)

def main():
    # コマンドライン引数を解析します。
    args = parser.parse_args()

    # 環境変数から、OSS にアクセスするために必要な認証情報をロードします。
    credentials_provider = oss.credentials.EnvironmentVariableCredentialsProvider()

    # SDK のデフォルト構成を使用して構成オブジェクトを作成し、認証プロバイダーを指定します。
    cfg = oss.config.load_default()
    cfg.credentials_provider = credentials_provider
    
    # ユーザーが指定したコマンドラインパラメータに基づいて、構成オブジェクトの region 属性を指定します。
    cfg.region = args.region

    # カスタムエンドポイントが提供されている場合は、構成オブジェクトの endpoint パラメータを変更します。
    if args.endpoint is not None:
        cfg.endpoint = args.endpoint

    # 前述の設定を使用して、OSSClient インスタンスを初期化します。
    client = oss.Client(cfg)

    # 署名付き URL を生成するリクエストを開始します。
    # version_id パラメータはオプションです。オブジェクトを含むバケットがバージョン管理されている場合にのみ、このパラメータを指定する必要があります。
    pre_result = client.presign(
        oss.GetObjectRequest(
            bucket=args.bucket,  # バケットの名前を指定します。
            key=args.key,        # オブジェクトキーを指定します。
            version_id='yourVersionId'  # 該当する場合、オブジェクトのバージョン ID を指定します。
        )
    )

    # 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(&region, "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),
		VersionId: oss.Ptr("yourVersionId"), // バージョン ID を指定します。
	},
		oss.PresignExpires(10*time.Minute),
	)
	if err != nil {
		log.Fatalf("オブジェクトの署名付き URL の取得に失敗しました %v", err)
	}
	log.Printf("オブジェクトの署名付き URL の結果: %#v\n", result)
	log.Printf("オブジェクトの URL: %#v\n", result.URL)
}

Node.js

const OSS = require("ali-oss");

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
});


// 署名付き URL を生成します。
const signedUrl = await client.signatureUrlV4('GET', 3600, {
  queries:{
    // オブジェクトのバージョン ID を指定します。
    "versionId":'yourVersionId'
  }
}, 'demo.pdf');

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 "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);

$versionId = "yourVersionId"; // ダウンロードするオブジェクトバージョンを指定します。サンプル値を実際のバージョン ID に置き換えます。

// GetObjectRequest オブジェクトを作成してオブジェクトをダウンロードします。
$request = new Oss\Models\GetObjectRequest(bucket:$bucket, key:$key, versionId: $versionId);

// 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。
);

カスタムドメイン名を使用してプレビューするための署名付き URL を生成する

生成された署名付き URL がオンラインプレビューをサポートするようにするには、カスタムドメイン名をバケットにマッピングする必要があります。

OSS コンソールを使用する

  1. OSS コンソール にログインします。

  2. [バケット] をクリックし、ターゲットバケットの名前をクリックします。

  3. 左側のナビゲーションウィンドウで、オブジェクト管理 > オブジェクト を選択します。

  4. [オブジェクト] ページで、オブジェクトの名前をクリックします。

  5. [詳細] パネルで、[カスタムドメイン名] ドロップダウンリストからマッピングしたカスタムドメイン名を選択し、その他のパラメータはデフォルト値のままにして、[ファイル URL をコピー] をクリックします。

    image

ossbrowser を使用する

ossbrowser は、OSS コンソールでサポートされているものと同様のオブジェクトレベルの操作をサポートしています。 ossbrowser インターフェースに従って署名付き URL を生成します。 ossbrowser のダウンロード方法の詳細については、「ossbrowser 2.0 (プレビュー)」をご参照ください。

  1. カスタムドメイン名を使用して ossbrowser にログインします。

  1. オブジェクト URL を取得します。

OSS SDK を使用する

カスタムドメイン名を使用して OSSClient インスタンスを作成し、署名付き URL を生成します。

Java
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 {
        // カスタムドメイン名を指定します。例: https://static.example.com。
        String endpoint = "yourCustomEndpoint";
        // バケットが配置されているリージョンを指定します。例: cn-hangzhou。
        String region = "cn-hangzhou";

        // 環境変数からアクセス認証情報を取得します。サンプルコードを実行する前に、環境変数を構成する必要があります。
        EnvironmentVariableCredentialsProvider credentialsProvider = CredentialsProviderFactory.newEnvironmentVariableCredentialsProvider();

        // OSSClient インスタンスを作成します。
        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);
            // HTTP GET リクエストを許可する署名付き URL を生成します。この例では、追加のリクエストヘッダーは指定されていません。他のユーザーは、ブラウザを使用して関連コンテンツに直接アクセスできます。
            String bucketName = "examplebucket";
            String objectName = "demo.png";
            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
# -*- coding: utf-8 -*-
import oss2
from oss2.credentials import EnvironmentVariableCredentialsProvider

# 環境変数からアクセス認証情報を取得します。サンプルコードを実行する前に、OSS_ACCESS_KEY_ID および OSS_ACCESS_KEY_SECRET 環境変数が構成されていることを確認してください。
auth = oss2.ProviderAuthV4(EnvironmentVariableCredentialsProvider())

# エンドポイントにマッピングされるリージョンの ID を指定します。例: cn-hangzhou。署名アルゴリズム V4 を使用する場合は、このパラメータが必要です。
region = "cn-hangzhou"

# カスタムドメイン名を指定します。例: static.example.com。
endpoint = 'http://static.example.com'

# バケットの名前を指定します。
bucket = oss2.Bucket(auth, endpoint, "yourBucketName", region=region, is_cname=True)


# オブジェクトの完全なパスを指定します。完全なパスにバケット名を含めないでください。例: exampledir/exampleobject.txt。
object_name = 'exampledir/exampleobject.txt'

# オブジェクトのダウンロードに使用される署名付き URL を生成します。この例では、URL の有効期間は 600 秒です。
# デフォルトでは、OSS は署名プロセスでオブジェクトの完全なパスにあるスラッシュ (/) をエスケープ文字として識別します。したがって、署名付き URL は直接使用できません。
# slash_safe パラメータを True に設定します。こうすることで、OSS はオブジェクトの完全なパスにあるスラッシュ (/) をエスケープ文字として識別せず、署名付き URL を直接使用できます。
url = bucket.sign_url('GET', object_name, 600, slash_safe=True, params=params)
print('Presigned URL:', 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);
});
PHP
<?php
if (is_file(__DIR__ . '/../autoload.php')) {
    require_once __DIR__ . '/../autoload.php';
}
if (is_file(__DIR__ . '/../vendor/autoload.php')) {
    require_once __DIR__ . '/../vendor/autoload.php';
}

use OSS\OssClient;
use OSS\Core\OssException;
use OSS\Http\RequestCore;
use OSS\Http\ResponseCore;
use OSS\Credentials\EnvironmentVariableCredentialsProvider;

// 環境変数からアクセス認証情報を取得します。サンプルコードを実行する前に、OSS_ACCESS_KEY_ID および OSS_ACCESS_KEY_SECRET 環境変数が構成されていることを確認してください。
$provider = new EnvironmentVariableCredentialsProvider();
// yourEndpoint を、バケットが配置されているリージョンのエンドポイントに設定します。たとえば、バケットが中国 (杭州) リージョンにある場合は、エンドポイントを http://static.example.com に設定します。
$endpoint = "http://static.example.com";
// バケット名を指定します。
$bucket= "examplebucket";
// バケット名を除くオブジェクトの完全なパスを指定します。
$object = "exampleobject.txt";
// 署名付き URL の有効期間を 600 秒 (最大 32400 秒) に設定します。
$timeout = 600;
try {
    $config = array(  
        "provider" => $provider,
        "endpoint" => $endpoint,
        'signatureVersion'=>OssClient::OSS_SIGNATURE_VERSION_V4,
        "cname"	=> true,
        "region"=> "cn-hangzhou"
    );
    $ossClient = new OssClient($config);
    // 署名付き URL を生成します。
    $signedUrl = $ossClient->signUrl($bucket, $object, $timeout, "GET");
    print_r($signedUrl);
} catch (OssException $e) {
    printf(__FUNCTION__ . ": FAILED\n");
    printf($e->getMessage() . "\n");
    return;
}
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(&region, "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("無効なパラメータ、オブジェクト名が必要です")
	}

	// デフォルト構成をロードし、認証プロバイダー、リージョン、エンドポイント、および CNAME の使用を指定します。
	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 != null {
		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)
		}
	}
}

ossutil を使用する

presign コマンドを使用して、カスタムドメイン名を使用してオブジェクトの署名付き URL を生成します。

ossutil presign oss://examplebucket/exampleobject.txt --endpoint "http://static.example.com" --addressing-style "cname"

ossutil が各コマンドでカスタムドメイン名を手動で指定せずに自動的にカスタムドメイン名を使用するようにするには、カスタムドメイン名を 構成ファイル に追加できます。

強制ダウンロード用の署名付き URL を生成する

このユースケースは、署名付き URL がデフォルトでコンテンツプレビューをトリガーする場合に適用されます。これは、カスタムドメインが使用されている場合、または OSS サービスが 2022 年 10 月 9 日午前 0 時より前にアクティブ化された場合に発生する可能性があります。このような場合、ユーザーは署名付き URL のレスポンスヘッダー設定を構成して、プレビューではなくコンテンツのダウンロードを強制できます。

次のサンプルコードは、カスタムドメイン名を使用してオブジェクトにアクセスするときに、オブジェクトを強制的にダウンロードし、カスタム名を指定する方法を示しています。

Java

import com.aliyun.oss.*;
import com.aliyun.oss.common.auth.CredentialsProviderFactory;
import com.aliyun.oss.common.auth.EnvironmentVariableCredentialsProvider;
import com.aliyun.oss.common.comm.SignVersion;
import com.aliyun.oss.model.GeneratePresignedUrlRequest;

import java.net.URL;
import java.net.URLEncoder;
import java.util.Date;

public class Demo {
    public static void main(String[] args) throws Throwable {
        // カスタムドメイン名を指定します。例: https://static.example.com。
        String endpoint = "http://static.example.com";
        // 環境変数からアクセス認証情報を取得します。サンプルコードを実行する前に、OSS_ACCESS_KEY_ID および OSS_ACCESS_KEY_SECRET 環境変数が構成されていることを確認してください。
        EnvironmentVariableCredentialsProvider credentialsProvider = CredentialsProviderFactory.newEnvironmentVariableCredentialsProvider();

        // バケットの名前を指定します。例: examplebucket。
        String bucketName = "examplebucket";
        // オブジェクトの完全なパスを指定します。例: exampleobject.txt。オブジェクトの完全なパスにバケット名を含めないでください。
        String objectName = "exampleobject.txt";

        // OSSClient インスタンスを作成します。
        String region = "cn-hangzhou";
        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();

        URL signedUrl = null;
        try {
            // 署名付き URL の有効期間を指定します。単位: ミリ秒。この例では、有効期間は 1 時間です。
            Date expiration = new Date(new Date().getTime() + 3600 * 1000L);

            // 強制的にダウンロードするオブジェクトの名前を指定します。例: homework.txt。
            String filename = "homework.txt";

            // 署名付き URL を生成します。
            GeneratePresignedUrlRequest request = new GeneratePresignedUrlRequest(bucketName, objectName, HttpMethod.GET);

            // オブジェクトが強制的にダウンロードされるように指定し、ダウンロードされたオブジェクトの名前を指定します。
            request.getResponseHeaders().setContentDisposition("attachment;filename=" + URLEncoder.encode(filename,"UTF-8"));

            // リクエストの有効期間を設定します。
            request.setExpiration(expiration);

            // HTTP GET リクエストを許可する署名付き URL を生成します。
            signedUrl = ossClient.generatePresignedUrl(request);
            // 署名付き URL を表示します。
            System.out.println("signed url for putObject: " + 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());
        }
    }

}

Python

import argparse
import alibabacloud_oss_v2 as oss

# コマンドラインパラメータパーサーを作成し、スクリプトの目的を記述します。
parser = argparse.ArgumentParser(description="presign get object sample")

# --region パラメータを指定して、バケットが配置されているリージョンを示します。このパラメータは必須です。
parser.add_argument('--region', help='バケットが配置されているリージョン。', required=True)
# --bucket パラメータを指定して、オブジェクトが格納されているバケットの名前を示します。このパラメータは必須です。
parser.add_argument('--bucket', help='バケットの名前。', required=True)
# --endpoint パラメータを指定して、バケットが配置されているリージョンのエンドポイントを示します。このパラメータはオプションです。
parser.add_argument('--endpoint', help='他のサービスが OSS にアクセスするために使用できるドメイン名')
# --key パラメータを指定して、オブジェクトの名前を示します。このパラメータは必須です。
parser.add_argument('--key', help='オブジェクトの名前。', required=True)

def main():
    # コマンドライン引数を解析して、指定された値を取得します。
    args = parser.parse_args()

    # 環境変数からアクセス認証情報を取得して認証します。
    credentials_provider = oss.credentials.EnvironmentVariableCredentialsProvider()

    # デフォルト構成を使用して cfg オブジェクトを作成し、認証プロバイダーを指定します。
    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 インスタンスを初期化し、インスタンスが OSS と対話できるようにします。
    client = oss.Client(cfg)

    # 署名付き URL を生成するリクエストを開始します。
    pre_result = client.presign(
        oss.GetObjectRequest(
            bucket=args.bucket,  # バケット名を指定します。
            key=args.key,        # オブジェクトキーを指定します。
            response_content_disposition="attachment;filename=test.txt",
        )
    )

    # 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"

	"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(&region, "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),
		ResponseContentDisposition: oss.Ptr("attachment;filename=test.txt"),
	},
	)
	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)
		}
	}
}

一度に複数の署名付き URL を生成する

説明
  • OSS コンソールでは、現在のディレクトリにあるオブジェクトの署名付き URL のリストをエクスポートできますが、現在のディレクトリのサブディレクトリにあるオブジェクトのリストはエクスポートできません。現在のディレクトリとそのサブディレクトリにあるオブジェクトの署名付き URL のリストを生成するには、ossutil を使用できます。

  • SDK を使用して複数の署名付き URL を生成する場合は、GetBucket(ListObjects) 操作を使用してすべてのオブジェクトの名前を取得し、各オブジェクトの署名付き URL を生成できます。

OSS コンソールを使用する

  1. ターゲットオブジェクトを選択し、下の [URL リストのエクスポート] をクリックします。list

  2. [URL リストのエクスポート] パネルで、次のパラメータを構成します。

    パラメータ

    説明

    [HTTPS を使用する]

    デフォルトでは、オブジェクトの URL は HTTPS を使用して生成されます。 HTTP を使用してオブジェクトの URL を生成する場合は、[HTTPS を使用する] をオフにします。

    有効期間

    共有するオブジェクトの ACL が非公開の場合は、オブジェクトの URL の有効期間を設定する必要があります。

    有効な値: 60 ~ 32400。

    単位: 秒。

    CNAME

    URL を使用してアクセスしたときに、画像または Web ページオブジェクトがダウンロードされるのではなくプレビューされるようにするには、バケットにマッピングされているカスタムドメイン名を使用します。

    このパラメータは、カスタムドメイン名をマッピング した後にのみ構成できます。

    エンドポイントの高速化

    データセンターから遠く離れたサードパーティがオブジェクトにアクセスする必要がある場合は、バケットのアクセラレーションエンドポイントを使用してオブジェクトの URL を生成することをお勧めします。

    このパラメータは、バケットの 転送アクセラレーションを有効に した後にのみ構成できます。

  3. OK をクリックし、URL リストファイルをコンピュータに保存します。

ossutil を使用する

  • examplebucket バケットの "folder" ディレクトリにあるオブジェクトについて、有効期間が 15 分の署名付き URL を生成します。

    ossutil presign oss://examplebucket/folder/ -r
  • examplebucket バケットの "folder" ディレクトリにある TXT オブジェクトについて、デフォルトの有効期間が 15 分の URL を生成します。

    ossutil presign oss://examplebucket/folder/ -r --include "*.txt"
  • examplebucket バケットのすべてのオブジェクトについて、デフォルトの有効期間が 15 分の署名付き URL を生成します。

    ossutil presign oss://examplebucket/ -r

ossutil を使用して署名付き URL を生成する方法の詳細については、「presign (署名付き 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 を貼り付けることでファイルをダウンロードできます。

FAQ

署名なしで長期 URL を取得するにはどうすればよいですか?

有効期限または署名情報を含まないオブジェクト URL を作成するには、まず、オブジェクトが公開されていることを確認する必要があります。OSS オブジェクトを公開するには、次の 2 つの方法があります。

警告

オブジェクトを公開すると、すべてのインターネットユーザーがオブジェクトにアクセスできるようになります。これにより、データ漏洩や予期しない費用が発生する可能性があります。署名情報と有効期限を含む署名付き URL を使用することをお勧めします。

  1. オブジェクト ACL を設定する: OSS オブジェクトの権限を公開読み取りに設定します。これにより、オブジェクトの URL は誰でも永続的にアクセスできるようになります。他の Web サイトからのオブジェクトへの不正アクセスを防ぐために、OSS で ホットリンク保護 を構成する必要があります。

    • OSS の デフォルトドメイン名 を使用する場合、オブジェクト URL の形式は https://BucketName.Endpoint/ObjectName です。上記の URL で、ObjectName はファイル拡張子を含むオブジェクトの完全なパスを表します。さまざまなリージョンのエンドポイントの詳細については、「OSS リージョンとエンドポイント」をご参照ください。

      たとえば、example.jpg という名前のオブジェクトが、中国 (杭州) リージョンの examplebucket という名前のバケットの "example" ディレクトリに保存されているとします。オブジェクト URL:
      インターネット URL: https://examplebucket.oss-cn-hangzhou.aliyuncs.com/example/example.jpg
      内部 URL (同じリージョンの ECS インスタンスからアクセスする場合): https://examplebucket.oss-cn-hangzhou-internal.aliyuncs.com/example/example.jpg
    • バケットが カスタムドメイン名 に接続されている場合、オブジェクト URL の形式は https://YourDomainName/ObjectName です。詳細については、「カスタムドメイン名を OSS エンドポイントにマッピングする」をご参照ください。

      たとえば、example.com というカスタムドメイン名を中国 (杭州) リージョンの examplebucket という名前のバケットに接続し、バケットに example.jpg という名前のファイルが含まれている場合、ファイルの URL は https://example.com/example.jpg です。
  1. CDN で OSS リソースを高速化する: OSS オブジェクトの権限を非公開のままにして、CDN を介して公開読み取りアクセスを提供します。オブジェクト URL は誰でも永続的にアクセスできます。 CDN 高速化ドメイン名とオブジェクト URL を使用して、OSS リソースにアクセスできます。他の Web サイトからのオブジェクトへの不正アクセスを防ぐために、CDN で リファラーブラックリストまたはホワイトリストを構成する ことをお勧めします。

    たとえば、CDN 高速化ドメイン名が aliyundoc.com で、ルートディレクトリにある image_01.jpg という名前のファイルにアクセスする場合、ファイルの URL は http://aliyundoc.com/image_01.jpg です。

特定の Web サイトのみが OSS リソースにアクセスできるようにし、他のソースからのリクエストを拒否できますか?

はい、バケットのホットリンク保護設定を構成することでこれを行うことができます。具体的には、Web サイトをリファラーホワイトリストに含めて、オブジェクトへのアクセスを承認する必要があります。これにより、指定された Web サイトからのオブジェクトリクエストが許可され、承認されていない Web サイトが OSS オブジェクトにリンクすることができなくなります。詳細な構成手順については、「他の Web サイトからの不正アクセスを防ぐためにホットリンク保護を構成する」をご参照ください。

サードパーティがダウンロード以外にも OSS リソースに対してより多くの操作を実行できるようにするにはどうすればよいですか?

ユーザーがダウンロード以外にも多くの操作を実行できるようにするには、STS トークンを使用して柔軟な一時アクセスを承認できます。サードパーティがオブジェクトのダウンロードだけでなく、オブジェクトのリストやオブジェクトのコピーなど、OSS リソースに対してより多くの操作を実行できるようにするには、STS の一時アクセス認証情報について学習し、使用することをお勧めします。詳細については、「STS を使用して OSS への一時アクセスを承認する」をご参照ください。

ダウンロード時にファイル名をカスタマイズするにはどうすればよいですか?

はい、署名付き URL の response-content-disposition パラメーターを使用して 1 回のダウンロードリクエストのファイル名を指定するか、ファイルの Content-Disposition メタデータを変更してすべてのダウンロードリクエストのファイル名を指定できます。詳細については、「OSS オブジェクトをダウンロードするときにファイル名をカスタマイズする」をご参照ください。

署名付き URL を使用して画像を処理するにはどうすればよいですか?

サイズ変更やウォーターマークなどの画像処理操作に署名付き URL を使用するには、署名付き URL を生成するときに画像処理パラメーターを含めます。詳細については、「オブジェクト URL を使用して画像を処理する」をご参照ください。