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

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

最終更新日:Apr 07, 2025

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

使用上の注意

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

  • HTTP GET リクエストを許可するプレサイン URL を生成するには、oss:GetObject 権限が必要です。詳細については、「RAM ユーザーにカスタムポリシーをアタッチする」をご参照ください。

  • プレサイン URL は、その有効期間内であれば何度でも使用できます。プレサイン URL の有効期限が切れた場合は、手順 1 を繰り返してプレサイン URL を再生成することで、アクセスを延長できます。

ワークフロー

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

image

手順

手順 1: HTTP 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のコピー をクリックします。复制URL

      パラメータ

      説明

      有効期間

      非公開オブジェクトの URL を生成するには、有効期間を指定する必要があります。

      有効な値: 60 ~ 32400

      単位: 秒

      有効期間の長い URL を生成するには、OSS SDK や ossutil などのツールを使用できます。

      CNAME

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

      このパラメータは、カスタムドメイン名がバケットにマッピングされている場合にのみ使用できます。詳細については、「カスタムドメイン名をマッピングする」をご参照ください。

      HTTPS を使用する

      デフォルトでは、生成される URL は HTTPS プロトコルを使用します。HTTP プロトコルを使用する URL を生成するには、[HTTPS を使用する] をオフにします。

ossbrowser の使用

ossbrowser を使用して、OSS コンソールで実行できるのと同じオブジェクトレベルの操作を実行できます。ossbrowser の画面上の指示に従って、プレサイン URL を生成できます。詳細については、「ossbrowser の使用」をご参照ください。

OSS SDK の使用

次のサンプルコードは、一般的なプログラミング言語の OSS SDK を使用してプレサイン 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 {
        // この例では、中国 (杭州) リージョンのエンドポイントを使用しています。実際のエンドポイントを指定してください。
        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

詳細については、「サンプルコード」をご参照ください。

# -*- coding: utf-8 -*-
import oss2
from oss2.credentials import EnvironmentVariableCredentialsProvider

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

# バケットが配置されているリージョンのエンドポイントを指定します。たとえば、バケットが中国 (杭州) リージョンにある場合は、エンドポイントを https://oss-cn-hangzhou.aliyuncs.com に設定します。
endpoint = "https://oss-cn-hangzhou.aliyuncs.com"

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

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

# オブジェクトのフルパスを指定します。フルパスにバケット名を含めないでください。例: 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)
print('Signed URL:', url)

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),
	},
		oss.PresignExpires(10*time.Minute),
	)
	if err != nil {
		log.Fatalf("オブジェクトのプレサインの取得に失敗しました %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

詳細については、「サンプルコード」をご参照ください。

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

// プレサイン URL を生成するために使用される関数を指定します。
async function generateSignatureUrl(fileName) {
  // プレサイン URL を取得します。
  const client = await new OSS({
      // 環境変数からアクセス認証情報を取得します。サンプルコードを実行する前に、OSS_ACCESS_KEY_ID および OSS_ACCESS_KEY_SECRET 環境変数が設定されていることを確認してください。
      accessKeyId: process.env.OSS_ACCESS_KEY_ID,
      accessKeySecret: process.env.OSS_ACCESS_KEY_SECRET,
      bucket: 'examplebucket',
      // バケットが配置されているリージョンを指定します。たとえば、バケットが中国 (杭州) リージョンにある場合は、リージョンを oss-cn-hangzhou に設定します。
      region: 'oss-cn-hangzhou',
      // secure を true に設定し、HTTPS を使用して、生成されたダウンロードリンクがブラウザによってブロックされないようにします。
      secure: true,
      authorizationV4: true
  });

  return await client.signatureUrlV4('GET', 3600, {
      headers: {} // 実際のリクエストヘッダーに基づいてリクエストヘッダーを指定します。
  }, fileName);
}
// 関数を呼び出し、オブジェクトの名前を渡します。
generateSignatureUrl('yourFileName').then(url => {
  console.log('Generated Signature URL:', url);
}).catch(err => {
  console.error('Error generating signature URL:', err);
});

PHP

詳細については、「サンプルコード」をご参照ください。

<?php
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();
// バケットが配置されているリージョンのエンドポイントを指定します。たとえば、バケットが中国 (杭州) リージョンにある場合は、エンドポイントを https://oss-cn-hangzhou.aliyuncs.com に設定します。
$endpoint = "yourEndpoint";
// バケットの名前を指定します。
$bucket= "examplebucket";
// オブジェクトのフルパスを指定します。フルパスにバケット名を含めないでください。
$object = "exampleobject.txt";
// プレサイン URL の有効期間を 600 秒に設定します。最大値: 32400。
$timeout = 600;
try {
    $config = array(  
        "provider" => $provider,
        "endpoint" => $endpoint,
        'signatureVersion'=>OssClient::OSS_SIGNATURE_VERSION_V4,
        "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;
}           

.NET

詳細については、「サンプルコード」をご参照ください。

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";
var objectContent = "More than just cloud.";
// バケットが配置されているリージョンを指定します。たとえば、バケットが中国 (杭州) リージョンにある場合は、リージョンを 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);
conf.SetRegion(region);
try
{
    // プレサイン URL を生成します。
    var generatePresignedUriRequest = new GeneratePresignedUriRequest(bucketName, objectName, SignHttpMethod.Put)
    {
        // プレサイン URL の有効期間を設定します。デフォルト値: 3600。単位: 秒。
        Expiration = DateTime.Now.AddHours(1),
    };
    var signedUrl = client.GeneratePresignedUri(generatePresignedUriRequest);
}
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

詳細については、「サンプルコード」をご参照ください。

// バケット名を指定します。例: 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

詳細については、「サンプルコード」をご参照ください。

// バケットの名前を指定します。
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++

詳細については、「サンプルコード」をご参照ください。

#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

詳細については、「サンプルコード」をご参照ください。

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

詳細については、「サンプルコード」をご参照ください。

#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 を使用して OSS にアクセスするかどうかを指定します。値 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;
    /* メモリプールのメモリリソースを options パラメータに割り当てます。*/
    oss_client_options = oss_request_options_create(pool);
    /* クライアント oss_client_options のオプションを初期化します。*/
    init_options(oss_client_options);
    /* パラメータを初期化します。*/
    aos_string_t bucket;
    aos_string_t object;
    aos_string_t file;    
    aos_http_request_t *req;
    apr_time_t now;
    char *url_str;
    aos_string_t url;
    int64_t expire_time; 
    int one_hour = 3600;
    aos_str_set(&bucket, bucket_name);
    aos_str_set(&object, object_name);
    aos_str_set(&file, local_filename);
    expire_time = now / 1000000 + one_hour;    
    req = aos_http_request_create(pool);
    req->method = HTTP_GET;
    now = apr_time_now();  
    /* 単位: マイクロ秒*/
    expire_time = now / 1000000 + one_hour;
    /* 署名付き URL を生成します。*/
    url_str = oss_gen_signed_url(oss_client_options, &bucket, &object, expire_time, req);
    aos_str_set(&url, url_str);
    printf("Temporary download URL: %s\n", url_str);     
    /* メモリプールを解放します。この操作により、リクエストに割り当てられたメモリリソースが解放されます。*/
    aos_pool_destroy(pool);
    /* 以前に割り当てられたグローバルリソースを解放します。*/
    aos_http_io_deinitialize();
    return 0;
}

プレサイン URL の例を以下に示します。

https://examplebucket.oss-cn-hangzhou.aliyuncs.com/exampleobject.txt?x-oss-process=image%2Fresize%2Cp_10&x-oss-date=20241115T095058Z&x-oss-expires=3600&x-oss-signature-version=OSS4-HMAC-SHA256&x-oss-credential=LTAI****************%2F20241115%2Fcn-hangzhou%2Foss%2Faliyun_v4_request&x-oss-signature=6e7*************************1eb79d96

ossutil の使用

次のサンプルコマンドは、指定されたバケットにある example.txt オブジェクトのプレサイン URL を生成し、オブジェクトへの 15 分間のアクセスを有効にします。

ossutil presign oss://examplebucket/example.txt

ossutil を使用してプレサイン URL を生成する方法の詳細については、「presign」をご参照ください。

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

ブラウザの使用

プレサイン URL をコピーしてブラウザのアドレスバーに貼り付け、Enter キーを押します。

curl コマンドの使用

ターミナルで次のコマンドを入力します。<presigned_url> を手順 1 で生成したプレサイン URL に置き換えてください。

curl -SO "<presigned_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 コマンドの使用

ターミナルで次のコマンドを入力します。<signed_url> を手順 1 で生成したプレサイン URL に置き換えてください。

wget -O example.txt "<signed_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=ed5a939feb8d79a389572719f7e2939939936d0**********"

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("ダウンロードが完了しました!")
    else:
        print(f"ダウンロードするファイルがありません。サーバーは HTTP コードを返信しました: {response.status_code}")
except Exception as e:
    print("ダウンロード中にエラーが発生しました:", 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("ダウンロードが完了しました!")
    } else {
        println("ダウンロードするファイルがありません。サーバーは HTTP コードを返信しました:", response.StatusCode)
    }
}

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("ダウンロードが完了しました!");
        });
    } else {
        console.error(`ダウンロードに失敗しました。サーバーはコードで応答しました: ${response.statusCode}`);
    }
}).on('error', (err) => {
    console.error("ダウンロード中にエラーが発生しました:", 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(`サーバーは HTTP コードを返信しました: ${response.status}`);
        }
        return response.blob(); // レスポンスのタイプを blob に変更します。
    })
    .then(blob => {
        const link = document.createElement('a');
        link.href = window.URL.createObjectURL(blob);
        link.download=savePath; // ダウンロードしたオブジェクトの名前を指定します。
        document.body.appendChild(link); // この手順により、リンクがドキュメントに存在することが保証されます。
        link.click(); // リンクをクリックしてダウンロードをシミュレートします。
        link.remove(); // オブジェクトがダウンロードされたら、リンクを削除します。
        console.log("ダウンロードが完了しました!");
    })
    .catch(error => {
        console.error("ダウンロード中にエラーが発生しました:", 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 "ダウンロードが完了しました!";
            } else {
                return "ダウンロードするファイルがありません。サーバーは HTTP コードを返信しました: " + responseCode;
            }
        } catch (Exception e) {
            return "ダウンロード中にエラーが発生しました: " + 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.localizedDescription);
                return;
            }
            
            // オブジェクトのデータを確認します。
            if (!data) {
                NSLog(@"データを受信しませんでした。");
                return;
            }
            
            // オブジェクトを保存します。
            NSError *writeError = nil;
            BOOL success = [data writeToURL:[NSURL fileURLWithPath:savePath] options:NSDataWritingAtomic error:&writeError];
            if (success) {
                NSLog(@"ダウンロードが完了しました!");
            } else {
                NSLog(@"ファイルの保存中にエラーが発生しました: %@", writeError.localizedDescription);
            }
        }];
        
        // オブジェクトダウンロードタスクを開始します。
        [task resume];
        
        // メインスレッドを実行し続けて、非同期リクエストを完了します。
        [[NSRunLoop currentRunLoop] run];
    }
    return 0;
}

その他のシナリオ

特定のバージョンのオブジェクトに対する HTTP GET リクエストを許可する署名付き URL を生成する

特定のオブジェクトバージョンの 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

# -*- coding: utf-8 -*-
import oss2
from oss2.credentials import EnvironmentVariableCredentialsProvider
import requests

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

# バケットが配置されているリージョンのエンドポイントを指定します。たとえば、バケットが中国 (杭州) リージョンにある場合は、エンドポイントを https://oss-cn-hangzhou.aliyuncs.com に設定します。
endpoint = "https://oss-cn-hangzhou.aliyuncs.com"

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

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

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

# リクエストヘッダーを指定します。
headers = dict()
# オブジェクトのバージョン ID を指定します。
headers["versionId"] = "CAEQARiBgID8rumR2hYiIGUyOTAyZGY2MzU5MjQ5ZjlhYzQzZjNlYTAyZDE3****"

# 署名付き URL を生成し、署名付き URL の有効期間を 600 秒に設定します。
# デフォルトでは、OSS は署名プロセスでオブジェクトのフルパスにあるスラッシュ (/) をエスケープ文字として識別します。したがって、署名付き URL は直接使用できません。
# slash_safe パラメータを True に設定します。これにより、OSS はオブジェクトのフルパスにあるスラッシュ (/) をエスケープ文字として識別せず、署名付き URL を直接使用できます。
url = bucket.sign_url('PUT', object_name, 600, slash_safe=True, headers=headers)
print('The signed URL is:', url)

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
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();
// バケットが配置されているリージョンのエンドポイントを指定します。たとえば、バケットが中国 (杭州) リージョンにある場合は、エンドポイントを https://oss-cn-hangzhou.aliyuncs.com に設定します。
$endpoint = "yourEndpoint";
// バケットの名前を指定します。
$bucket= "examplebucket";
// オブジェクトのフルパスを指定します。フルパスにバケット名を含めないでください。
$object = "exampleobject.txt";
// 署名付き URL の有効期間を 600 秒に設定します。最大値: 32400。
$timeout = 600;
try{
  $config = array(
      "provider" => $provider,
      "endpoint" => $endpoint,
      "signatureVersion" => OssClient::OSS_SIGNATURE_VERSION_V4,
      "region"=> "cn-hangzhou"
  );
  $ossClient = new OssClient($config);
  $options = array(
      // オブジェクトのバージョン ID を指定します。
      $ossClient::OSS_VERSION_ID=>"CAEQEhiBgIDmgPf8mxgiIDA1YjZlNDIxY2ZmMzQ1MmU5MTM1Y2M4Yzk4NjIx****"
  );
  // 署名付き URL を生成します。
  $signedUrl = $ossClient->signUrl($bucket, $object, $timeout, "GET", $options);
  print_r($signedUrl);
} catch(OssException $e) {
  printf($e->getMessage() . "\n");
}

ダウンロード動作制御を有効にする署名付き URL を生成する

署名付き URL を生成するときに、リクエストヘッダーを指定して、強制ダウンロードの有効化や特定のエンコーディング標準の適用など、ダウンロード動作を事前に定義できます。HTTP GET リクエストを許可する署名付き URL を生成するときにリクエストヘッダーを指定する場合は、署名付き URL を使用して開始された GET リクエストにリクエストヘッダーが含まれていることを確認してください。これにより、リクエストの失敗や署名エラーを防ぐことができます。サポートされているヘッダーのリストについては、「GetObject」をご参照ください。また、オブジェクトのメタデータを設定して、オブジェクト管理を容易にすることもできます。詳細については、「オブジェクトメタデータの管理」をご参照ください。

たとえば、中国語の文字を含む TXT オブジェクトをダウンロードするための署名付き URL を生成する場合、Content-Type: text/plain;charset=utf-8 を指定して、オブジェクトの内容が文字化けせずに正しく表示されるようにすることができます。署名付き URL を使用してオブジェクトをリクエストする場合、同じヘッダーを含める必要があります。

  1. HTTP GET リクエストを許可する署名付き URL を生成します。

Java

import com.aliyun.oss.*;
import com.aliyun.oss.common.auth.*;
import com.aliyun.oss.common.comm.SignVersion;
import com.aliyun.oss.internal.OSSHeaders;
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";
        // OSSClient インスタンスを作成します。
        String region = "cn-hangzhou";
        ClientBuilderConfiguration clientBuilderConfiguration = new ClientBuilderConfiguration();
        clientBuilderConfiguration.setSignatureVersion(SignVersion.V4);
        OSS ossClient = OSSClientBuilder.create()
                .endpoint(endpoint)
                .credentialsProvider(credentialsProvider)
                .clientConfiguration(clientBuilderConfiguration)
                .region(region)
                .build();

        // リクエストヘッダーを指定します。
        Map<String, String> headers = new HashMap<>();
        // コンテンツタイプを指定します。
        headers.put(OSSHeaders.CONTENT_TYPE, "text/plain; charset=utf-8");
        URL signedUrl = null;
        try {
            // 署名付き URL の有効期間を指定します。単位: ミリ秒。この例では、有効期間は 1 時間に設定されています。
            Date expiration = new Date(new Date().getTime() + 3600 * 1000L);
            // 署名付き URL を生成します。
            GeneratePresignedUrlRequest request = new GeneratePresignedUrlRequest(bucketName, objectName, HttpMethod.GET);
            // 署名付き URL の有効期間を設定します。
            request.setExpiration(expiration);
            // リクエストにヘッダーを追加します。
            request.setHeaders(headers);
            // 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

# -*- coding: utf-8 -*-
import oss2
from oss2.credentials import EnvironmentVariableCredentialsProvider

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

# バケットが配置されているリージョンのエンドポイントを指定します。たとえば、バケットが中国 (杭州) リージョンにある場合は、エンドポイントを https://oss-cn-hangzhou.aliyuncs.com に設定します。
endpoint = "https://oss-cn-hangzhou.aliyuncs.com"

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

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

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

# リクエストヘッダーを指定します。
headers = dict()
# Content-Type ヘッダーを指定します。
headers['Content-Type'] = 'text/plain; charset=utf8'

# HTTP クエリパラメータを指定します。
params = dict()
# 単一接続帯域幅調整を構成します。単位: bit/s。この例では、調整しきい値は 100 KB/s に設定されています。
# params['x-oss-traffic-limit'] = str(100 * 1024 * 8)
# IP アドレスまたは CIDR ブロックを指定します。
# params['x-oss-ac-source-ip'] = "127.0.0.1"
# サブネットマスクの数字 1 の数を指定します。
# params['x-oss-ac-subnet-mask'] = "32"
# VPC の ID を指定します。
# params['x-oss-ac-vpc-id'] = "vpc-t4nlw426y44rd3iq4xxxx"
# リクエスト転送を許可するかどうかを指定します。
# params['x-oss-ac-forward-allow'] = "true"

# オブジェクトのダウンロードに使用される署名付き URL を生成します。この例では、URL の有効期間は 600 秒です。
# デフォルトでは、OSS は署名プロセスでオブジェクトのフルパスにあるスラッシュ (/) をエスケープ文字として識別します。したがって、署名付き URL は直接使用できません。
# slash_safe パラメータを True に設定します。これにより、OSS はオブジェクトのフルパスにあるスラッシュ (/) をエスケープ文字として識別せず、署名付き URL を直接使用できます。
url = bucket.sign_url('GET', object_name, 600, slash_safe=True, headers=headers, params=params)
print('The signed URL is:', url)

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),
		RequestCommon: oss.RequestCommon{
			Headers: map[string]string{
				"Content-Type": "text/txt; charset=utf-8", // リクエストヘッダーを設定します。Content-Type ヘッダーの値を 'text/txt; charset=utf-8' に設定します。
			},
		},
	},
	)
	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)
		}
	}
}
  1. 署名付き URL を使用してオブジェクトをダウンロードします。

curl -X GET "https://examplebucket.oss-cn-hangzhou.aliyuncs.com/exampleobject.txt?x-oss-date=20241113T093321Z&x-oss-expires=3599&x-oss-signature-version=OSS4-HMAC-SHA256&x-oss-credential=LTAI****************&x-oss-signature=ed5a******************************************************" \
-H "Content-Type: text/plain; charset=utf-8" \
-o "C:/downloads/myfile.txt"
import com.aliyun.oss.internal.OSSHeaders;
import org.apache.http.client.methods.CloseableHttpResponse;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
import java.io.*;
import java.net.URL;
import java.util.HashMap;
import java.util.Map;

public class Demo {
    public static void main(String[] args) throws Throwable {
        // 署名付き URL を指定します。
        URL signedUrl = new URL("https://examplebucket.oss-cn-hangzhou.aliyuncs.com/exampleobject.txt?x-oss-date=20241113T093321Z&x-oss-expires=3599&x-oss-signature-version=OSS4-HMAC-SHA256&x-oss-credential=LTAI****************%2F20241113%2Fcn-hangzhou%2Foss%2Faliyun_v4_request&x-oss-signature=ed5a******************************************************");
        // オブジェクトをダウンロードするローカルパスを指定します。
        String pathName = "C:/downloads/myfile.txt";

        // コンテキストを使用してリクエストヘッダーを渡すか、同じリクエストヘッダーを指定します。
        // リクエストヘッダーを指定します。
        Map<String, String> headers = new HashMap<>();
        // コンテンツタイプを指定します。
        headers.put(OSSHeaders.CONTENT_TYPE, "text/txt");

        // 署名付き URL を使用してオブジェクトをダウンロードします。この例では、HttpClients が使用されています。
        getObjectWithHttp(signedUrl, pathName, headers);
    }

    public static void getObjectWithHttp(URL signedUrl, String pathName, Map<String, String> headers) throws IOException {
        CloseableHttpClient httpClient = null;
        CloseableHttpResponse response = null;
        try {
            HttpGet get = new HttpGet(signedUrl.toString());
            // 署名付き URL を生成するときにヘッダーを指定した場合は、オブジェクトのダウンロードに使用する際に、これらのヘッダーをサーバーに送信する必要があります。
            for (Map.Entry header : headers.entrySet()) {
                get.addHeader(header.getKey().toString(), header.getValue().toString());
            }
            httpClient = HttpClients.createDefault();
            response = httpClient.execute(get);
            System.out.println("ダウンロードステータスコード: "+response.getStatusLine().getStatusCode());
            if (response.getStatusLine().getStatusCode() == 200) {
                System.out.println("オブジェクトはネットワークライブラリを使用してダウンロードされます");
            }
            System.out.println(response.toString());
            // オブジェクトをディスクに保存します。
            saveFileToLocally(response.getEntity().getContent(), pathName);
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            response.close();
            httpClient.close();
        }
    }

    public static void saveFileToLocally(InputStream inputStream, String pathName) throws IOException {
        DataInputStream in = null;
        OutputStream out = null;
        try {
            in = new DataInputStream(inputStream);
            out = new DataOutputStream(new FileOutputStream(pathName));
            int bytes = 0;
            byte[] bufferOut = new byte[1024];
            while ((bytes = in.read(bufferOut)) != -1) {
                out.write(bufferOut, 0, bytes);
            }
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            in.close();
            out.close();
        }
    }
}
package main

import (
	"io"
	"log"
	"net/http"
	"os"
)

func main() {
	// 生成された署名付き URL を指定します。
	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=ed5a939feb8d79a389572719f7e2939939936d0**********"

	// HTTP GET リクエストを許可する署名付き URL を使用してファイルをダウンロードします。
	req, err := http.NewRequest(http.MethodGet, url, nil)
	if err != nil {
		log.Fatalf("PUT リクエストの作成に失敗しました: %v", err)
	}

	// Content-Type リクエストヘッダーを指定します。
	req.Header.Set("Content-Type", "text/txt; charset=utf-8")

	// リクエストを開始します。
	client := &http.Client{}
	resp, err := client.Do(req)
	if err != nil {
		log.Fatalf("ファイルのアップロードに失敗しました: %v", err)
	}
	defer resp.Body.Close()

	// 書き込まれるファイルが格納されるローカルパスを指定します。
	filePath := "C:/downloads/myfile.txt"

	// ローカルファイルを作成または開きます。
	file, err := os.Create(filePath)
	if err != nil {
		log.Fatalf("ファイルの作成または開くに失敗しました: %v", err)
	}
	defer file.Close() // 関数が完了したら、ファイルが閉じられていることを確認します。

	// io.Copy を使用してコンテンツをローカルファイルに書き込みます。
	n, err := io.Copy(file, resp.Body)
	if err != nil {
		log.Fatalf("オブジェクトの読み取りに失敗しました %v", err)
	}

	// レスポンス本文を閉じます。
	err = resp.Body.Close()
	if err != nil {
		log.Printf("レスポンス本文を閉じるのに失敗しました: %v", err)
	}

	log.Printf("%d バイトをファイルに書き込みました: %s\n", n, filePath)
}

カスタムドメイン名を使用して、オブジェクトプレビューを有効にする署名付き URL を生成する

署名付き URL を使用してオブジェクトにアクセスしたときにオブジェクトプレビューを有効にするには、カスタムドメイン名を使用して署名付き URL を生成する必要があります。バケットにカスタムドメイン名がマップされていない場合は、まず「カスタムドメイン名をバケットのデフォルトドメイン名にマップする」の手順に従って、バケットにカスタムドメイン名をマップする必要があります。バケットにカスタムドメイン名が既にマップされている場合は、次のいずれかの方法を使用して、署名付き URL を直接生成できます。

OSS コンソールを使用する

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

  2. 左側のナビゲーションウィンドウで、[バケット] をクリックします。[バケット] ページで、バケットの名前をクリックします。

  3. 左側のナビゲーションツリーで、ファイル > オブジェクト を選択します。

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

  5. [詳細の表示] パネルの [カスタムドメイン名] フィールドで、バケットにマッピングされているカスタムドメイン名を選択し、その他のパラメーターについてはデフォルト設定を保持したまま、[オブジェクト URL のコピー] をクリックします。

    2.png

ossbrowser を使用する

ossbrowser を使用して、OSS コンソールで実行できるのと同じオブジェクトレベルの操作を実行できます。 ossbrowser の画面上の指示に従って、署名付き URL を取得できます。 ossbrowser のダウンロード方法については、「ossbrowser 1.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 {
        // カスタムドメイン名を指定します。例: static.example.com。
        String endpoint = "http://static.example.com";
        // エンドポイントにマップするリージョンの ID を指定します。例: cn-hangzhou。
        String region = "cn-hangzhou";

        // 環境変数からアクセス認証情報を取得します。サンプルコードを実行する前に、環境変数が構成されていることを確認してください。
        EnvironmentVariableCredentialsProvider credentialsProvider = CredentialsProviderFactory.newEnvironmentVariableCredentialsProvider();

        // OSSClient インスタンスを作成します。
        ClientBuilderConfiguration clientBuilderConfiguration = new ClientBuilderConfiguration();
        // このパラメータを true に設定して、CNAME を有効にします。
        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('The signed URL is:', 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();
// バケットが配置されているリージョンのエンドポイントを指定します。たとえば、バケットが中国 (杭州) リージョンにある場合は、エンドポイントを 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 != 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)
		}
	}
}

ossutil を使用する

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

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

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

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

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

  • OSS SDK を使用して複数のオブジェクトの署名付き URL をバッチ生成するには、GetBucket (ListObjects) 操作を呼び出して、オブジェクトのすべての名前をリストし、署名付き URL を 1 つずつ生成します。

OSS コンソールを使用する

  1. 署名付き URL を生成するオブジェクトを選択し、[URL リストのエクスポート] をクリックします。list

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

    パラメータ

    説明

    [HTTPS を使用する]

    デフォルトでは、生成される URL は HTTPS プロトコルを使用します。HTTP プロトコルを使用する URL を生成するには、[HTTPS を使用する] をオフにします。

    有効期間

    プライベートオブジェクトの 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 であり、OSS オブジェクトへの安全な一時アクセスを提供します。 署名付き URL は、AccessKey ペア、オブジェクトパス、有効期限などのパラメーターに基づいて計算された署名情報を元のオブジェクト URL に追加することで構成されます。 署名付き URL の一般的な形式は、https://BucketName.Endpoint/Object?SignatureData です。

署名付き URL を使用してオブジェクトがリクエストされると、OSS は署名情報を確認します。 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=6e7*************************1eb79d96

署名付き URL を使用すると、オブジェクト所有者は、アクセス認証情報を公開することなく、OSS オブジェクトへの安全で期限付きのアクセスを提供できます。

シナリオ

  • 一時的なデータ共有:サードパーティユーザーがオブジェクトをダウンロードする必要がある場合は、バックエンドで署名付き URL を生成し、フロントエンドで署名付き URL を提示することで、指定された期間内に安全なダウンロードまたはアップロードを許可できます。

  • 柔軟なアクセス:メールまたはインスタントメッセージで署名付き URL を送信することにより、オブジェクトを簡単かつ効率的に共有できます。 受信者は、受信した URL をブラウザのアドレスバーで使用して、これらのオブジェクトをダウンロードできます。

よくある質問

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

有効期限または署名情報を含まないオブジェクト URL を作成するには、まずオブジェクトが公開されていることを確認する必要があります。 OSS オブジェクトを公開するには、オブジェクトのアクセス制御リスト (ACL) を公開読み取りに設定する、Alibaba Cloud CDN でオブジェクトアクセスを高速化する、という 2 つの方法があります。以下のコンテンツでは、これら 2 つの方法を使用して公開されたオブジェクトの長期の署名なし URL を作成する方法について説明します。

警告

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

  1. ACL が公開読み取りに設定されたオブジェクト: この場合、オブジェクト URL は接続されているすべてのユーザーが永続的にアクセスできます。承認されていない Web サイトからのアクセスをブロックするには、オブジェクトが格納されているバケットに対して ホットリンク保護 を有効にします。

    • デフォルトのドメイン名を使用する場合、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 (オブジェクトと同じリージョンにある Elastic Compute Service インスタンスから): https://examplebucket.oss-cn-hangzhou-internal.aliyuncs.com/example/example.jpg
    • カスタムドメイン名を使用する場合、URL の形式は https://YourDomainName/ObjectName です。カスタムドメイン名をマッピングする方法については、「カスタムドメイン名をバケットのデフォルトドメイン名にマッピングする」をご参照ください。

      たとえば、example.com を中国 (杭州) リージョンの examplebucket という名前のバケットにマッピングし、バケットに example.jpg オブジェクトが含まれている場合、オブジェクトの URL は https://example.com/example.jpg です。
  1. Alibaba Cloud CDN を使用して高速化されたオブジェクトアクセス: この場合、オブジェクトの ACL は非公開のままでも、Alibaba Cloud CDN によってアクセスが高速化されます。オブジェクト URL は接続されているすべてのユーザーが永続的にアクセスできます。URL の形式は http://CDNacceleratedDomain/ObjectName です。承認されていない Web サイトからのアクセスをブロックするために、Alibaba Cloud CDN で ホットリンク保護 を有効にすることをお勧めします。

    たとえば、高速化されたドメイン名が aliyundoc.com で、ルートディレクトリにある image_01.jpg ファイルにアクセスする場合、次の URL を使用できます: http://aliyundoc.com/image_01.jpg

URL を使用してアクセスしたときにオブジェクトがプレビューされるようにするにはどうすればよいですか?

ユーザーがオブジェクトをダウンロードしたときにダウンロードではなくプレビューされるようにするには、バケットにマッピングされているカスタムドメイン名に基づいて構築された URL をユーザーに提供します。カスタムドメイン名をマッピングして使用する方法については、「カスタムドメイン名をバケットのデフォルトドメイン名にマッピングする」をご参照ください。

特定の Web サイトからのオブジェクトアクセスリクエストのみを許可し、他の Web サイトからのリクエストをブロックできますか?

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

ユーザーがダウンロードだけでなく、OSS リソースに対してより多くの操作を実行できるようにするにはどうすればよいですか?

ダウンロードに加えて、ユーザーがより多くの操作を実行できるようにするには、STS トークンを使用して柔軟な一時アクセスを承認します。たとえば、STS トークンを使用して、ユーザーがオブジェクトのリストやコピーなどの操作を実行できるようにすることができます。STS トークンに基づいて一時アクセスを許可する方法については、「STS によって提供される一時アクセス認証情報を使用して OSS にアクセスする」をご参照ください。

URL を使用したオブジェクトダウンロードのカスタムデフォルトオブジェクト名を指定できますか?

はい、できます。特定の事前署名済み URL を使用してオブジェクトをダウンロードするときにカスタムデフォルトオブジェクト名を指定するには、事前署名済み URL を生成するときに response-content-disposition パラメーターを設定します。すべてのダウンロードのカスタムデフォルトオブジェクト名を指定するには、オブジェクトの Content-Disposition メタデータフィールドを変更します。詳細については、「ダウンロードしたオブジェクトの名前を指定する」をご参照ください。

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

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