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

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

最終更新日:Mar 26, 2024

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

署名付きURLを使用してオブジェクトの強制ダウンロードを指定する

OSS SDKの使用

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

com.aliyun.oss.*;
impor t com.aliyun.oss.com mon.auth.*;
com.aliyun.oss.mo del.GeneratePresignedUrlRequestをインポートします。impor t java.net.URL;
java.util.* をインポートします。java.util.Dateをインポートします。public classデモ {
    public static void main(String[] args) 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。 バケット名をフルパスに含めないでください。 
        文字列objectName = "exampleobject.txt";        

        // Create an OSSClient instance. 
        OSS ossClient = new OSSClientBuilder().build(endpoint, credentialsProvider, conf);

        try {
            // Create a request. 
            GeneratePresignedUrlRequest generatePresignedUrlRequest = new GeneratePresignedUrlRequest(bucketName, objectName);
            // HttpMethodをGETに設定します。 
            generatePresignedUrlRequest.setMethod(HttpMethod.GET);
            // 署名付きURLの有効期間を指定します。 単位:ミリ秒。 この例では、有効期間は1時間に設定されています。 
            日付の有効期限=新しい日付 (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);
            // Generate the signed URL. 
            URL url = ossClient.generatePresignedUrl(generatePresignedUrlRequest);
            System.out.println(url);
        } catch (Exception e) {
            System.out.println("Caught an OSSException, which means your request made it to OSS, "
                    + "しかし、何らかの理由でエラー応答で拒否されました。");
            System.out.println("エラーメッセージ:" + oe.getErrorMessage());
            System.out.println("エラーコード:" + oe.getErrorCode());
            System.out.println("リクエストID:" + oe.getRequestId());
            System.out.println("ホストID:" + oe.getHostId());
        } catch (ClientException e) {
            System.out.println("Caught an ClientException, which means the client encountered "
                    + "a serious internal problem while trying to communicate with OSS, "
                    + 「ネットワークにアクセスできないなど」;
            System.out.println("エラーメッセージ:" + ce.getMessage());
        } 最後に{
            if (ossClient != null) {
                ossClient.shutdown();
            }
        }
    }
}

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

OSSコンソールの使用

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

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

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

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

  5. ファイルメタデータの設定パネルで、Content-Dispositionattachmentに設定し、他のパラメーターのデフォルト設定を維持して、OKをクリックします。

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

    • たとえば、public-readまたはpublic-read-writeのアクセス制御リスト (ACL) を持つexample.jpgオブジェクトは、カスタムdomai n example.comがマップされるバケットのルートディレクトリに格納されます。 連結されたhttp://example.com/example.jpg URLを使用して、ブラウザからオブジェクトにアクセスできます。

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

OSS SDKの使用

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

com.aliyun.oss.*;
impor t com.aliyun.oss.com mon.auth.*;
impor t com.aliyun.oss.com mon.utils.BinaryUtil;
com.aliyun.oss.mo del.GeneratePresignedUrlRequestをインポートします。com.aliyun.oss.mo del.ObjectMetadataをインポートします。java.io.ByteArrayInputStreamをインポートします。impor t java.net.URL;
impor t java.net.URLEncoder;
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。 
        文字列objectName = "testfolder/exampleobject.txt";
        // オブジェクトのコンテンツを指定します。 
        String content = "Hello OSS";

        // Create an OSSClient instance. 
        OSS ossClient = new OSSClientBuilder().build(endpoint, credentialsProvider, conf);

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

            String md5 = BinaryUtil.toBase64String(BinaryUtil.calculateMd5(content.getBytes()));
            // Enable MD5 verification. MD5検証が有効になると、OSSはアップロードされたオブジェクトの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("アクションのダウンロード");
            // キャッシュの有効期限をUTCで指定します。 
            // meta.setExpirationTime(DateUtil.parseIso8601Date("2025-10-12T00:00:00.000Z"));

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

            // Upload the object. 
            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 (有効期限);
            URL signedUrl = ossClient.generatePresignedUrl(signRequest);
            System.out.println(signedUrl);

        } catch (Exception e) {
            System.out.println("Caught an OSSException, which means your request made it to OSS, "
                    + "しかし、何らかの理由でエラー応答で拒否されました。");
            System.out.println("エラーメッセージ:" + oe.getErrorMessage());
            System.out.println("エラーコード:" + oe.getErrorCode());
            System.out.println("リクエストID:" + oe.getRequestId());
            System.out.println("ホストID:" + oe.getHostId());
        } catch (ClientException e) {
            System.out.println("Caught an ClientException, which means the client encountered "
                    + "a serious internal problem while trying to communicate with OSS, "
                    + 「ネットワークにアクセスできないなど」;
            System.out.println("エラーメッセージ:" + ce.getMessage());
        } 最後に{
            if (ossClient != null) {
                ossClient.shutdown();
            }
        }
    }
}

参考資料