OSS のオブジェクトキーは不変であり、しばしば記述的でない名称になっています。たとえば、UUID のような a3f2c1d0-... などが該当します。ユーザーがオブジェクトをダウンロードした際に表示されるファイル名を制御するには、以下の 2 つの方法のいずれかを使用します。
署名付き URL に `response-content-disposition` を含める方法 — オブジェクトのメタデータを変更せずに、その特定のダウンロードのみに適用されるファイル名をオーバーライドします。
`Content-Disposition` メタデータヘッダー — オブジェクトのすべてのダウンロードに適用されるデフォルトのファイル名を設定します。
ダウンロード時のファイル名の決定順序
OSS では、ダウンロード時に表示されるファイル名を以下の優先度順に決定します。
| 優先度 | ソース | 適用条件 |
|---|---|---|
| 1(最高) | response-content-disposition パラメーター(署名付き URL 内) | 署名付き URL に該当パラメーターが含まれている場合 |
| 2 | Content-Disposition オブジェクトメタデータヘッダー | 署名付き URL に該当パラメーターが含まれていない場合 |
| 3(フォールバック) | OSS オブジェクトキー | 上記のいずれも設定されていない場合 |
署名付き URL を使用して特定のダウンロード向けにファイル名を設定する
署名付き URL は、非公開オブジェクトへの一定期間限定のアクセスを許可します。ダウンロード時に表示されるファイル名を指定するには、URL に response-content-disposition パラメーターを追加します。この方法ではオブジェクトのメタデータは変更されないため、他のダウンロード方法には影響しません。
主な利用シーン:
オブジェクトの共有:内部のオブジェクトキーを外部に露出させることなく、意味のあるファイル名を受信者に表示できます。
パーソナライズされたダウンロード:ユーザーごとに異なる署名付き URL を生成し、ユーザー名や注文番号などに基づいたカスタムファイル名を付与できます。
プレビューおよびテスト:デフォルトのファイル名を変更することなく、レビュー担当者がテスト用に分かりやすいファイル名でダウンロードできるようにできます。
前提条件
開始する前に、以下の条件を満たしていることを確認してください。
対象オブジェクトを格納する OSS バケットが存在すること
oss:GetObject権限が付与されていること。詳細については、「RAM ユーザーへのカスタムポリシーのアタッチ」をご参照ください。
注意事項
response-content-dispositionは、署名付き URL のみに適用されます。同一オブジェクトの他のダウンロード方法には影響しません。特殊文字によるエラーを防ぐため、オブジェクト名は URL エンコードしてください。
署名付き URL は有効期間が過ぎると有効期限切れになります。ユーザーとの URL 共有に際しては、有効期限を考慮してください。
オブジェクトに
Content-Dispositionメタデータヘッダーが既に設定されている場合、署名付き URL のパラメーターが優先され、メタデータヘッダーは無視されます。
サンプルコード
以下の Python コード例では、オブジェクトを desired-filename.txt というファイル名でダウンロードさせる署名付き URL を生成します。
# -*- coding: utf-8 -*-
import oss2
from oss2.credentials import EnvironmentVariableCredentialsProvider
from urllib.parse import quote
# 環境変数から認証情報を読み込みます。
# このコードを実行する前に、OSS_ACCESS_KEY_ID および OSS_ACCESS_KEY_SECRET を設定してください。
auth = oss2.ProviderAuth(EnvironmentVariableCredentialsProvider())
# <bucket_name> をバケット名に置き換えます。
# エンドポイントをバケットのリージョンに対応するエンドポイントに置き換えます。
# 例: 中国 (杭州) リージョンの場合は https://oss-cn-hangzhou.aliyuncs.com。
bucket = oss2.Bucket(auth, 'https://oss-cn-hangzhou.aliyuncs.com', '<bucket_name>')
# バケット内のオブジェクトの完全パス。バケット名は含めないでください。
object_name = 'exampledir/exampleobject.txt'
# オブジェクトをダウンロードする際にユーザーに表示されるファイル名。
# 特殊文字を処理するために名前を URL エンコードします。
download_filename = quote('desired-filename.txt')
# このオブジェクトの今後のすべてのダウンロードに対してユーザーに表示されるファイル名を設定します。
#
# 注: update_object_meta は既存のすべてのメタデータヘッダーを上書きします。
# 他のヘッダーを保持するには、最初に bucket.get_object_meta() を使用して取得し、
# 変更内容をマージしてから、完全なセットで update_object_meta を呼び出します。
headers = {'Content-Disposition': f'attachment; filename="{download_filename}"'}
bucket.update_object_meta(object_name, headers)他の言語の例については、「オブジェクト URL を使用したオブジェクトの共有」をご参照ください。
オブジェクトのメタデータを更新してすべてのダウンロード向けにファイル名を設定する
Content-Disposition メタデータヘッダーを設定すると、オブジェクトのすべてのダウンロードに対してデフォルトのファイル名が適用されます。これは、response-content-disposition パラメーターを含まないすべてのリクエストに適用されます。
主な利用シーン:
長期的な共有:オブジェクトが繰り返しダウンロードされ、常に同じファイル名で表示される必要があります。
ドキュメントおよびリソースライブラリ:パブリックライブラリ内のファイルは、識別およびアーカイブが容易になるよう、一貫性があり、記述的な名称を持つ必要があります。
バージョン管理されたコンテンツ:オブジェクトをインプレースで更新(キーは同一、内容のみ更新)し、すべてのダウンロードで安定した人間が読み取り可能なファイル名を維持できます。
前提条件
開始する前に、以下の条件を満たしていることを確認してください。
対象オブジェクトを格納する OSS バケットが存在すること
oss:PutObject権限が付与されていること。詳細については、「RAM ユーザーへのカスタムポリシーのアタッチ」をご参照ください。
注意事項
Content-Dispositionの値に含まれるファイル名は、特殊文字を処理するため URL エンコードしてください。このヘッダーの更新は、すべてのオブジェクトメタデータを上書きします。他の既存のヘッダーを保持するには、まず現在のメタデータを取得し、
Content-Dispositionを更新したうえで、完全な更新済みセットを書き戻してください。update_object_metaを使用して、オブジェクトを再アップロードせずにメタデータを更新します。これにより、誤ったデータの上書きを回避できます。PutObjectの代わりにこの方法を使用してください。
サンプルコード
以下の Python コード例では、Content-Disposition ヘッダーを設定し、オブジェクトを desired-filename.txt というファイル名でダウンロードできるようにします。
# -*- coding: utf-8 -*-
import oss2
from oss2.credentials import EnvironmentVariableCredentialsProvider
from urllib.parse import quote
# 環境変数から認証情報を読み込みます。
# このコードを実行する前に、OSS_ACCESS_KEY_ID および OSS_ACCESS_KEY_SECRET を設定してください。
auth = oss2.ProviderAuth(EnvironmentVariableCredentialsProvider())
# <bucket_name> を実際のバケット名に置き換えます。
# エンドポイントは、バケットのリージョンに対応するものに置き換えてください。
# 例:中国 (杭州) リージョンの場合、https://oss-cn-hangzhou.aliyuncs.com
bucket = oss2.Bucket(auth, 'https://oss-cn-hangzhou.aliyuncs.com', '<bucket_name>')
# バケット内のオブジェクトのフルパス。バケット名は含めません。
object_name = 'exampledir/exampleobject.txt'
# ユーザーがダウンロード時に表示されるファイル名。
# 特殊文字を処理するため、URL エンコードします。
download_filename = quote('desired-filename.txt')
# このオブジェクトの今後のすべてのダウンロードでユーザーに表示されるファイル名を設定します。
#
# 注意:update_object_meta は、既存のすべてのメタデータヘッダーを上書きします。
# 他のヘッダーを保持するには、まず bucket.get_object_meta() で現在のメタデータを取得し、
# 変更をマージしたうえで、update_object_meta に完全な更新済みセットを渡してください。
headers = {'Content-Disposition': f'attachment; filename="{download_filename}"'}
bucket.update_object_meta(object_name, headers)その他のプログラミング言語での例については、「オブジェクトメタデータの管理」をご参照ください。
次のステップ
オブジェクト URL を使用したオブジェクトの共有 — 署名付き URL の生成および配布
オブジェクトメタデータの管理 — その他のメタデータヘッダーの更新
RAM ユーザーへのカスタムポリシーのアタッチ — 必要な権限の設定