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

Object Storage Service:署名付き URL を使用してオブジェクトをダウンロードする (C# SDK V2)

最終更新日:Nov 09, 2025

デフォルトでは、Object Storage Service (OSS) バケット内のオブジェクトは非公開であり、オブジェクトの所有者のみがアクセスできます。このトピックでは、OSS C# SDK を使用して GET リクエストの署名付き URL を生成する方法について説明します。URL には有効期限が含まれており、他のユーザーに一時的なダウンロードアクセスを許可します。URL は有効期限が切れるまで複数回アクセスできます。URL の有効期限が切れた後は、新しい URL を生成する必要があります。

注意事項

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

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

プロセス

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

サンプルコード

  1. オブジェクトの所有者が GET リクエストの署名付き URL を生成します。

    using OSS = AlibabaCloud.OSS.V2;  // Alibaba Cloud OSS SDK のエイリアスを作成して、後続の使用を簡素化します。
    
    var region = "cn-hangzhou";  // 必須。バケットが配置されているリージョンを指定します。たとえば、バケットが中国 (杭州) リージョンにある場合、リージョンを cn-hangzhou に設定します。
    var endpoint = null as string;  // オプション。OSS へのアクセスに使用するエンドポイントを指定します。たとえば、バケットが中国 (杭州) リージョンにある場合、エンドポイントを https://oss-cn-hangzhou.aliyuncs.com に設定します。
    var bucket = "your bucket name";  // 必須。バケット名。
    var key = "your object name";  // 必須。署名付き URL を生成するオブジェクトの名前。
    
    // OSS SDK のデフォルト設定を読み込みます。設定は、環境変数から認証情報 (AccessKey など) を自動的に読み取ります。
    var cfg = OSS.Configuration.LoadDefault();
    // 環境変数を使用して ID 検証用の認証情報を取得することを明示的に設定します (フォーマット: OSS_ACCESS_KEY_ID, OSS_ACCESS_KEY_SECRET)。
    cfg.CredentialsProvider = new OSS.Credentials.EnvironmentVariableCredentialsProvider();
    // 設定でバケットのリージョンを設定します。
    cfg.Region = region;   
    // エンドポイントが指定されている場合、デフォルトのエンドポイントを上書きします。
    if(endpoint != null) 
    {
        cfg.Endpoint = endpoint;
    } 
    
    // 設定情報を使用して OSS クライアントインスタンスを作成します。
    using var client = new OSS.Client(cfg); 
    
    // Presign メソッドを呼び出して、署名付き URL を生成します。
    var result = client.Presign(new OSS.Models.GetObjectRequest()
    {
        Bucket = bucket,
        Key = key,
    });
    
    using var hc = new HttpClient();  // HttpClient を使用して HTTP リクエストを送信し、オブジェクトのコンテンツを取得します。
    var httpResult = await hc.GetAsync(result.Url);  // 署名付き URL に GET リクエストを送信します。
    var stream = await httpResult.Content.ReadAsStreamAsync();  // 応答コンテンツをストリームとして読み取ります。
    using var reader = new StreamReader(stream);  // StreamReader を使用してストリームを文字列に変換します。
    var got = await reader.ReadToEndAsync();
    
    // 操作が完了したことを示すメッセージを出力します。
    Console.WriteLine("GetObject done");
    Console.WriteLine($"StatusCode: {httpResult.StatusCode}");  //応答の HTTP ステータスコード。
  2. 他のユーザーは、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("Download completed!");
            } catch (IOException e) {
                System.err.println("Error during download: " + 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("No file to download. Server replied HTTP code: " + 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); // このステップにより、署名付き URL がドキュメント内に存在することが保証されます。
            link.click(); // 署名付き URL をクリックして、オブジェクトのダウンロードをシミュレートします。
            link.remove(); // オブジェクトがダウンロードされた後、署名付き URL を削除します。
            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;
    }

関連ドキュメント

署名付き URL を使用してオブジェクトをダウンロードするために使用される完全なサンプルコードについては、「PresignGetObject.cs」をご参照ください。