デフォルトでは、Object Storage Service (OSS) バケット内のオブジェクトは非公開であり、オブジェクト所有者のみがアクセスできます。ただし、オブジェクト所有者は、プレサイン URL を提供することにより、他のユーザーに非公開オブジェクトへの一時的なアクセスとダウンロードを許可できます。
使用上の注意
このトピックでは、中国 (杭州) リージョンのパブリックエンドポイントを使用しています。OSS と同じリージョン内の他の Alibaba Cloud サービスから OSS にアクセスする場合は、内部エンドポイントを使用します。OSS のリージョンとエンドポイントの詳細については、「リージョンとエンドポイント」をご参照ください。
HTTP GET リクエストを許可するプレサイン URL を生成するには、
oss:GetObject
権限が必要です。詳細については、「RAM ユーザーにカスタムポリシーをアタッチする」をご参照ください。プレサイン URL は、その有効期間内であれば何度でも使用できます。プレサイン URL の有効期限が切れた場合は、手順 1 を繰り返してプレサイン URL を再生成することで、アクセスを延長できます。
ワークフロー
次のフローチャートは、プレサイン URL を使用してオブジェクトをダウンロードする方法を示しています。
手順
手順 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 を生成するには、次の手順を実行します。
OSS コンソール にログインします。
左側のナビゲーションウィンドウで、[バケット] をクリックします。[バケット] ページで、オブジェクトが格納されているバケットの名前をクリックします。
左側のナビゲーションツリーで、
を選択します。プレサイン 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(®ion, "region", "", "バケットが配置されているリージョン。")
flag.StringVar(&bucketName, "bucket", "", "バケットの名前。")
flag.StringVar(&objectName, "object", "", "オブジェクトの名前。")
}
func main() {
// コマンドラインパラメータを解析します。
flag.Parse()
// バケット名が空かどうかを確認します。
if len(bucketName) == 0 {
flag.PrintDefaults()
log.Fatalf("無効なパラメータ、バケット名が必要です")
}
// リージョンが空かどうかを確認します。
if len(region) == 0 {
flag.PrintDefaults()
log.Fatalf("無効なパラメータ、リージョンが必要です")
}
// オブジェクト名が空かどうかを確認します。
if len(objectName) == 0 {
flag.PrintDefaults()
log.Fatalf("無効なパラメータ、オブジェクト名が必要です")
}
// デフォルト設定を読み込み、認証情報プロバイダーとリージョンを指定します。
cfg := oss.LoadDefaultConfig().
WithCredentialsProvider(credentials.NewEnvironmentVariableCredentialsProvider()).
WithRegion(region)
// OSS クライアントを作成します。
client := oss.NewClient(cfg)
// GetObject リクエストのプレサイン URL を生成します。
result, err := client.Presign(context.TODO(), &oss.GetObjectRequest{
Bucket: oss.Ptr(bucketName),
Key: oss.Ptr(objectName),
},
oss.PresignExpires(10*time.Minute),
)
if err != nil {
log.Fatalf("オブジェクトのプレサインの取得に失敗しました %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 を生成する
ダウンロード動作制御を有効にする署名付き URL を生成する
カスタムドメイン名を使用して、オブジェクトプレビューを有効にする署名付き URL を生成する
一度に複数の署名付き URL を生成する
追加情報
署名付き 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 をブラウザのアドレスバーで使用して、これらのオブジェクトをダウンロードできます。