デフォルトでは、Object Storage Service (OSS) バケット内のオブジェクトのアクセス制御リスト (ACL) は非公開です。 オブジェクト所有者のみが、オブジェクトにアクセスする権限を持っています。 OSS SDK for PHP を使用して、HTTP GET リクエストを許可し、有効期間を持つ署名付き URL を生成し、その署名付き URL をユーザーと共有して、ユーザーが一時的にオブジェクトをダウンロードできるようにすることができます。 有効期間内であれば、ユーザーはオブジェクトを繰り返しダウンロードできます。 有効期限が切れたら、ユーザーは新しい署名付き URL を取得する必要があります。
注意事項
このトピックでは、中国 (杭州) リージョンのパブリックエンドポイントを使用しています。 OSS と同じリージョン内の他の Alibaba Cloud サービスから OSS にアクセスする場合は、内部エンドポイントを使用してください。 OSS のリージョンとエンドポイントの詳細については、「リージョンとエンドポイント」をご参照ください。
このトピックでは、アクセス認証情報は環境変数から取得されます。 アクセス認証情報を設定する方法の詳細については、「アクセス認証情報を設定する」をご参照ください。
oss:GetObject
権限は、HTTP GET リクエストを許可する署名付き URL の生成に必要です。 詳細については、「RAM ユーザーにカスタムポリシーをアタッチする」をご参照ください。このトピックでは、有効期間が 7 日間の V4 署名付き URL を使用しています。 詳細については、「署名バージョン 4 (推奨)」をご参照ください。
次のサンプルコードを使用して、プラス記号 (
+
) を含む署名付き URL を生成した場合、その URL を使用して OSS にアクセスできない場合があります。 この場合、URL 内のプラス記号 (+
) を%2B
に置き換えてください。HTTPS 経由のアクセス用に署名付き URL を生成するには、エンドポイントのプロトコルを HTTPS に設定します。
プロセス
次の図は、署名付き URL を使用してオブジェクトをダウンロードする方法を示しています。
サンプルコード
次のコードは、HTTP GET リクエストを許可する署名付き URL を生成する方法の例を示しています。
<?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; }
次のコードは、HTTP GET リクエストを許可する署名付き URL を使用してオブジェクトをダウンロードする方法の例を示しています。
curl
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******************************************************"
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(); } }
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); });
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) } }
JavaScript
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-Java
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(); } } }
Objective-C
#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; }