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

Object Storage Service:バケットのカスタムドメインを使用してオブジェクトにアクセスしたときに、OSS バケットからオブジェクトのダウンロードを強制するにはどうすればよいですか?

最終更新日:Jul 03, 2025

オブジェクトプレビューをサポートするブラウザから Object Storage Service (OSS) バケットのカスタムドメインを使用してバケット内のオブジェクトにアクセスする場合、デフォルトでは OSS はブラウザでオブジェクトをインラインでプレビュー表示するように指定します。カスタムドメインを使用してブラウザからオブジェクトにアクセスしたときに、オブジェクトを添付ファイルとしてダウンロードする場合、response-content-disposition フィールドを attachment に設定した署名付き URL を使用するか、オブジェクトの Content-Disposition メタデータヘッダーを attachment に設定します。前者の方法は、URL を使用してオブジェクトにアクセスした場合にのみ、オブジェクトのダウンロードを強制します。後者の方法は、ブラウザからオブジェクトへのアクセスに対してオブジェクトのダウンロードを強制します。

プリサイン URL を使用して強制ダウンロードを指定する

OSS SDK for Java を使用する

以下は、署名付き URL を使用してオブジェクトのダウンロードを強制するために OSS SDK for 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://example.com";
        // 環境変数からアクセス認証情報を取得します。サンプルコードを実行する前に、OSS_ACCESS_KEY_ID および OSS_ACCESS_KEY_SECRET 環境変数が設定されていることを確認してください。
        EnvironmentVariableCredentialsProvider credentialsProvider = CredentialsProviderFactory.newEnvironmentVariableCredentialsProvider();
        // ClientBuilderConfiguration インスタンスを作成します。ビジネス要件に基づいてパラメータのデフォルト値を変更できます。
        ClientBuilderConfiguration conf = new ClientBuilderConfiguration();

        // setSupportCname で true を指定して、カスタムドメインを目的のバケットにマッピングします。
        conf.setSupportCname(true);
        // バケットの名前を指定します。例: examplebucket。
        String bucketName = "examplebucket";
        // オブジェクトの完全なパスを指定します。例: exampleobject.txt。オブジェクトの完全なパスにバケット名を含めないでください。
        String objectName = "exampleobject.txt";        

        // OSSClient インスタンスを作成します。
        // OSSClient が不要になったら、shutdown メソッドを呼び出して関連付けられたリソースを解放します。
        OSS ossClient = new OSSClientBuilder().build(endpoint, credentialsProvider, conf);

        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);
            // ダウンロードされたファイルが元のオブジェクト名を使用するように指定します。
            Map<String, String> queryParam = new HashMap<String, String>();
            queryParam.put("response-content-disposition",  "attachment");
            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();
            }
        }
    }
}

Content-Disposition メタデータヘッダーを設定してオブジェクトのダウンロードを強制する

OSS コンソールを使用する

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

  2. 左側のナビゲーションウィンドウで、バケットリスト をクリックします。[バケットリスト] ページで、目的のバケットを見つけてクリックします。

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

  4. オブジェクトリストでオブジェクトを見つけ、更多 > ファイルメタデータの設定 を選択します。

  5. ファイルメタデータの設定 パネルで、[Content-Disposition]attachment に設定し、その他のパラメータ設定は変更せずに、[OK] をクリックします。

  6. カスタムドメインを含むオブジェクト URL を使用してオブジェクトにアクセスします。

    • たとえば、アクセス制御リスト(ACL)が公開読み取りまたは公開読み書きの example.jpg オブジェクトが、カスタムドメイン example.com がマッピングされているバケットのルートディレクトリに格納されているとします。連結された http://example.com/example.jpg URL を使用して、ブラウザからオブジェクトにアクセスできます。

    • たとえば、ACL が非公開の example.jpg オブジェクトが、カスタムドメイン example.com がマッピングされているバケットのルートディレクトリに格納されているとします。署名付きオブジェクト URL(http://example.com/example.jpg?SignatureInfo)を使用して、ブラウザからオブジェクトにアクセスできます。カスタムドメインを使用して非公開オブジェクトにアクセスする方法の詳細については、「カスタムドメイン名を使用してバケットにアクセスする」をご参照ください。

OSS SDK for Java を使用する

次のサンプルコードは、OSS SDK for Java を使用して強制オブジェクトダウンロードのオブジェクトメタデータを設定する方法の例を示しています。

import com.aliyun.oss.*;
import com.aliyun.oss.common.auth.*;
import com.aliyun.oss.common.utils.BinaryUtil;
import com.aliyun.oss.model.GeneratePresignedUrlRequest;
import com.aliyun.oss.model.ObjectMetadata;
import java.io.ByteArrayInputStream;
import java.net.URL;
import java.net.URLEncoder;
import java.util.Date;

public class Test {
    public static void main(String[] args) throws Exception {

        // カスタムドメインを指定します。
        String endpoint = "https://example.com";
        // セキュリティ上の理由から、アクセス認証情報をプロジェクトコードに保存しないことをお勧めします。この例では、アクセス認証情報は環境変数から取得されます。サンプルコードを実行する前に、環境変数が設定されていることを確認してください。
        EnvironmentVariableCredentialsProvider credentialsProvider = CredentialsProviderFactory.newEnvironmentVariableCredentialsProvider();
        // ClientBuilderConfiguration インスタンスを作成します。ビジネス要件に基づいてパラメータのデフォルト値を変更できます。
        ClientBuilderConfiguration conf = new ClientBuilderConfiguration();

        // setSupportCname で true を指定して、カスタムドメインを目的のバケットにマッピングします。
        conf.setSupportCname(true);
        // バケットの名前を指定します。例: examplebucket。
        String bucketName = "examplebucket";
        // オブジェクトの完全なパスを指定します。完全なパスにバケット名を含めないでください。例: testfolder/exampleobject.txt。
        String objectName = "testfolder/exampleobject.txt";
        // オブジェクトのコンテンツを指定します。
        String content = "Hello OSS";

        // OSSClient インスタンスを作成します。
        // OSSClient が不要になったら、shutdown メソッドを呼び出して関連付けられたリソースを解放します。
        OSS ossClient = new OSSClientBuilder().build(endpoint, credentialsProvider, conf);

        try {
            // オブジェクトメタデータを作成します。オブジェクトメタデータには、標準の HTTP ヘッダーを指定できます。
            ObjectMetadata meta = new ObjectMetadata();

            String md5 = BinaryUtil.toBase64String(BinaryUtil.calculateMd5(content.getBytes()));
            // MD5 検証を有効にします。MD5 検証が有効になっていると、OSS はアップロードされたオブジェクトの MD5 ハッシュを計算し、この MD5 ハッシュをリクエストで指定された MD5 ハッシュと比較します。2 つの値が異なる場合は、エラーが報告されます。
            meta.setContentMD5(md5);
            // アップロードするコンテンツのタイプを指定します。ブラウザは、オブジェクトのコンテンツタイプに基づいて、オブジェクトの読み取りに使用するフォーマットとエンコーディングタイプを決定します。コンテンツタイプが指定されていない場合、OSS はオブジェクト名の拡張子に基づいてコンテンツタイプを割り当てます。拡張子がない場合は、デフォルト値 application/octet-stream がコンテンツタイプとして使用されます。
            meta.setContentType("text/plain");
            // ダウンロードされたファイルが元のオブジェクト名を使用するように指定します。名前に中国語の文字が含まれている場合は、文字を URL エンコードします。
            meta.setContentDisposition("attachment"+ URLEncoder.encode("UTF-8")+";"+URLEncoder.encode("UTF-8"));
            // アップロードできるオブジェクトの長さを指定します。実際のオブジェクトの長さが指定された長さよりも長い場合は、指定された長さのコンテンツのみがアップロードされ、後続の部分は切り捨てられます。実際のオブジェクトの長さが指定された長さよりも短い場合は、オブジェクトのすべてのコンテンツがアップロードされます。
            // meta.setContentLength(content.length());
            // コンテンツがダウンロードされたときの Web ページのキャッシュ動作を指定します。
            // meta.setCacheControl("Download Action");
            // キャッシュの有効期限を UTC で指定します。
            // meta.setExpirationTime(DateUtil.parseIso8601Date("2025-10-12T00:00:00.000Z"));

            // ユーザーメタデータを設定します。
            // meta.setHeader("yourHeader", "yourHeaderValue");

            // オブジェクトをアップロードします。
            ossClient.putObject(bucketName, objectName, new ByteArrayInputStream(content.getBytes()), meta);

            // オブジェクトの URL を使用してアクセスしたときにオブジェクトがダウンロードされるかどうかを確認します。
            Date expiration = new Date(new Date().getTime() + 3600 * 1000);
            GeneratePresignedUrlRequest signRequest = new GeneratePresignedUrlRequest(bucketName, objectName, HttpMethod.GET);
            signRequest.setExpiration(expiration);
            URL signedUrl = ossClient.generatePresignedUrl(signRequest);
            System.out.println(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());
        } finally {
            if (ossClient != null) {
                ossClient.shutdown();
            }
        }
    }
}

参照