HTML フォームを使用して、指定したバケットにオブジェクトをアップロードします。

Post object

  • リクエスト構文
    POST / HTTP/1.1 
    Host: BucketName.oss-cn-hangzhou.aliyuncs.com
    User-Agent: browser_data
    Content-Length:ContentLength
    Content-Type: multipart/form-data; boundary=9431149156168
    --9431149156168
    Content-Disposition: form-data; name="key"
    key
    --9431149156168
    Content-Disposition: form-data; name="success_action_redirect"
    success_redirect
    --9431149156168
    Content-Disposition: form-data; name="Content-Disposition"
    attachment;filename=oss_download.jpg
    --9431149156168
    Content-Disposition: form-data; name="x-oss-meta-uuid"
    myuuid
    --9431149156168
    Content-Disposition: form-data; name="x-oss-meta-tag"
    mytag
    --9431149156168
    Content-Disposition: form-data; name="OSSAccessKeyId"
    access-key-id
    --9431149156168
    Content-Disposition: form-data; name="policy"
    encoded_policy
    --9431149156168
    Content-Disposition: form-data; name="Signature"
    signature
    --9431149156168
    Content-Disposition: form-data; name="file"; filename="MyFilename.jpg"
    Content-Type: image/jpeg
    file_content
    --9431149156168
    Content-Disposition: form-data; name="submit"
    Upload to OSS
    --9431149156168--
  • リクエストヘッダー
    PostObject リクエストのメッセージ本文は、multipart/form-data 形式でエンコードされます。 PostObject 操作では、パラメーターはリクエストメッセージ本文のフォームフィールドとして渡されます。これは、PostObject 操作の HTTP リクエストヘッダーで渡されるパラメーターとは異なります。
    ヘッダー 必須 説明
    OSSAccessKeyId String はい (条件による) バケット所有者の AccessKey ID。

    デフォルト値:なし

    制限:バケットに対する公開読み取り/書き込みが許可されていない場合、および OSSAccessKeyId (または Signature) フォームフィールドが指定されている場合、このフィールドは必須です。

    policy String はい (条件による) リクエスト内のフィールドの有効性。 policy フィールドを含まないリクエストは匿名リクエストとして扱われ、公開読み取り/書き込みが許可されたバケットにのみアクセスできます。

    デフォルト値:なし

    制限:バケットに対する公開読み取り/書き込みが許可されていない場合、または OSSAccessKeyId (または Signature) フォームフィールドが指定されている場合、このフォームフィールドは必須です。

    Signature String はい (条件による) Access Key Secret と Policy に基づいて計算される署名情報。 OSS は署名情報をチェックして、PostObject リクエストの有効性を検証します。 詳細は、5.7.4.2 Post Signature をご参照ください。

    デフォルト値:なし

    制限:バケットに対する公開読み取り/書き込みが許可されていない場合、または OSSAccessKeyId (または Policy) フォームフィールドが指定されている場合、このフォームフィールドは必須です。

    Cache-ControlContent-TypeContent-DispositionContent-EncodingExpires String いいえ HTTP リクエストヘッダー。 詳細は、「PutObject」をご参照ください。

    デフォルト値:なし

    file String はい ファイルまたはテキストのコンテンツ。 このフィールドはフォームの最後に指定する必要があります。 ファイルタイプに基づき、ブラウザーで Content-Type が自動的に設定され、ユーザー設定が上書きされます。 OSS では一度に 1 つのファイルのみをアップロードできます。

    デフォルト値:なし

    key String はい アップロードするオブジェクトの名前。 オブジェクト名に a/b/c/b.jpg などのパスが含まれている場合、自動的にディレクトリが作成されます。

    デフォルト値:なし

    success_action_redirect String いいえ アップロードが成功した後にクライアントがリダイレクトされる URL。 このフォームフィールドが指定されていない場合、返される結果を success_action_status で指定します。 アップロードが失敗した場合、エラーコードが返され、クライアントは URL にリダイレクトされません。

    デフォルト値:なし

    success_action_status String いいえ success_action_redirect が指定されていない場合、前述のようにアップロードが成功した後、クライアントに返されるステータスコード。

    デフォルト値:なし

    値:200、201、および 204 (デフォルト)

    • このフィールドの値を 200 または 204 に設定した場合、空のファイルとステータスコード 200 または 204 が返されます。
    • このフィールドの値を 201 に設定した場合、XML ファイルとステータスコード 201 が返されます。
    • このフィールドを指定しないか、無効な値に設定した場合、空のファイルとステータスコード 204 が返されます。
    x-oss-meta-* String いいえ ユーザーが設定するユーザーメタ値。

    デフォルト値:なし

    x-oss-server-side-encryption String いいえ オブジェクト作成時のサーバー側暗号化アルゴリズム。

    値:AES256KMS

    KMS アルゴリズムを使用する前に、KMS サービスを購入する必要があります。 そうしないと、エラーコード KmsServiceNotEnabled が返されます。

    このパラメーターを指定すると、レスポンスヘッダーで返され、アップロードしたオブジェクトは暗号化されます。 暗号化されたオブジェクトをダウンロードするとき、x-oss-server-side-encryption フィールドがレスポンスヘッダーに含まれ、オブジェクトの暗号化に使用したアルゴリズムが値として設定されます。

    x-oss-server-side-encryption-key-id String いいえ KMS で管理されるプライマリキー。

    このパラメーターは、x-oss-server-side-encryption が KMS に設定されている場合に有効です。

    x-oss-object-acl String いいえ 作成されるオブジェクトの ACL。

    有効な値:public-readprivatepublic-read-write

    x-oss-security-token String いいえ このアクセスに STS 一時許可を使用する場合、この項目を SecurityToken 値に指定する必要があります。 同時に OSSAccessKeyId には、ペアとなる一時 AccessKeyId を使用する必要があります。 署名の計算は、一般的な AccessKeyId 署名と同じです。

    デフォルト値:なし

  • レスポンスヘッダー
    ヘッダー 説明
    x-oss-server-side-encryption String リクエストに x-oss-server-side-encryption が指定されている場合、レスポンスにこのヘッダー (使用された暗号化アルゴリズムを示す) が含まれます。
  • レスポンス要素
    パラメーター 説明
    PostResponse Container PostObject リクエストの結果を保存するコンテナー。

    サブ要素:Bucket、ETag、Key、Location

    Bucket String バケット名。

    親要素:PostResponse

    ETag String オブジェクトの生成時に作成されるエンティティタグ (ETag)。 PostObject で作成されたオブジェクトの場合、ETag 値はオブジェクトの UUID で、オブジェクトのコンテンツが変更されたかどうかのチェックに使用されます。

    親要素:PostResponse

    Location String 新しく作成されたオブジェクトの URL。

    親要素:PostResponse

  • 詳細分析
    • PostObject 操作を実行するには、バケットに対する書き込み権限が必要です。 バケットに対する公開読み取り/書き込みが許可されている場合、署名情報をアップロードしないよう選択することができます。 それ以外の場合、PostObject 操作で署名を検証する必要があります。 PutObject とは異なり、PostObject では AccessKeySecret を使用してポリシーの署名を計算します。 計算された署名文字列を Signature フォームフィールドの値として使用します。 OSS は、この値をチェックして、署名の有効性を検証します。
    • バケットに対する公開読み取り/書き込みが許可されているかどうかにかかわらず、OSSAccessKeyId、Policy、Signature のいずれかのフォームフィールドをアップロードすると、残りの 2 つのフォーム フィールドは必須になります。 残りの 2 つのフォームフィールドを指定しないと、エラーコード InvalidArgument が返されます。
    • PostObject 操作で送信されるフォームエンコーディングは "multipart/form-data" でなければなりません。 つまり、ヘッダー内の Content-Type は、multipart/form-data; boundary=xxxxxx という形式にする必要があります (boundary は境界文字列)。
    • 送信フォームの URL を、バケットのドメイン名にすることができます。 URL にオブジェクトを指定する必要はありません。 リクエストには、POST / HTTP/1.1 を使用し、POST /ObjectName HTTP/1.1 は使用しません。
    • フォームとポリシーは、UTF-8 でエンコードする必要があります。
    • Content-MD5 リクエストヘッダーをアップロードした場合、本文の Content-MD5 が計算され、2 つが同じかどうかがチェックされます。 2 つの値が異なる場合、エラーコード InvalidDigest が返されます。
    • PostObject リクエストに Header 署名または URL 署名が含まれている場合、これらの署名はチェックされません。
    • PutObject リクエストにプレフィックス x-oss-meta- のフォームフィールドが含まれている場合、そのフォームフィールドはユーザーメタ ( x-oss-meta-location など) として扱われます。 1 つのオブジェクトに同様のパラメーターを複数設定できますが、すべてのユーザーメタの合計サイズは 8 KB を超えることはできません。
    • PostObject リクエスト内の本文全体の長さは、5 GB を超えることはできません。 ファイル長が大きすぎる場合、エラー コード EntityTooLarge が返されます。
    • オブジェクトのアップロード時に x-oss-server-side-encryption を指定する場合、このヘッダーの値を AES256 または KMS に設定する必要があります。 それ以外の場合、 400 エラーがエラーコード InvalidEncryptionAlgorithmError と共に返されます。 このヘッダーを指定すると、レスポンスヘッダーにもこのヘッダーが含まれ、アップロードされたオブジェクトの暗号化アルゴリズムが保存されます。 オブジェクトダウンロード時、レスポンスヘッダーには x-oss-server-side-encryption が含まれ、このオブジェクトの暗号化アルゴリズムが値として設定されます。
    • フォームフィールドは大文字と小文字が区別されませんが、値は大文字と小文字が区別されます。
    • リクエスト例
      POST / HTTP/1.1
      Host: oss-example.oss-cn-hangzhou.aliyuncs.com
      Content-Length: 344606
      Content-Type: multipart/form-data; boundary=9431149156168
      --9431149156168
      Content-Disposition: form-data; name="key"
      /user/a/objectName.txt
      --9431149156168
      Content-Disposition: form-data; name="success_action_status"
      200
      --9431149156168
      Content-Disposition: form-data; name="Content-Disposition"
      content_disposition
      --9431149156168
      Content-Disposition: form-data; name="x-oss-meta-uuid"
      uuid
      --9431149156168
      Content-Disposition: form-data; name="x-oss-meta-tag"
      metadata
      --9431149156168
      Content-Disposition: form-data; name="OSSAccessKeyId"
      44CF9590006BF252F707
      --9431149156168
      Content-Disposition: form-data; name="policy"
      eyJleHBpcmF0aW9uIjoiMjAxMy0xMi0wMVQxMjowMDowMFoiLCJjb25kaXRpb25zIjpbWyJjb250ZW50LWxlbmd0aC1yYW5nZSIsIDAsIDEwNDg1NzYwXSx7ImJ1Y2tldCI6ImFoYWhhIn0sIHsiQSI6ICJhIn0seyJrZXkiOiAiQUJDIn1dfQ==
      --9431149156168
      Content-Disposition: form-data; name="Signature"
      kZoYNv66bsmc10+dcGKw5x2PRrk=
      --9431149156168
      Content-Disposition: form-data; name="file"; filename="MyFilename.txt"
      Content-Type: text/plain
      abcdefg
      --9431149156168
      Content-Disposition: form-data; name="submit"
      Upload to OSS
      --9431149156168--
    • レスポンス例
      HTTP/1.1 200 OK
      x-oss-request-id: 61d2042d-1b68-6708-5906-33d81921362e 
      Date: Fri, 24 Feb 2012 08:43:27 GMT
      ETag: 5B3C1A2E053D763E1B002CC607C5****
      Connection: keep-alive
      Content-Length: 0  
      Server: AliyunOSS

Post Policy

POST でリクエストされる policy フォームフィールドは、有効なリクエストかどうかの検証に使用されます。 policy は、UTF-8 と Base64 でエンコードされた JSON テキストです。 PostObject リクエストで満たさなければならない条件を記述します。 post フォームフィールドは、公開読み取り/書き込みバケットをアップロードする場合はオプションです。 ただし、このフィールドを使用して、POST リクエストを制限することを強く推奨します。

ポリシー例

{ "expiration": "2014-12-01T12:00:00.000Z",
  "conditions": [
    {"bucket": "johnsmith" },
    ["starts-with", "$key", "user/eric/"]
  ]
}

PostObject リクエストでは、ポリシーに expiration と conditions が含まれている必要があります。

  • Expiration

    Expiration には、ポリシーの有効期限を ISO8601 GMT 表記で指定します。 たとえば、"2014-12-01T12:00:00.000Z" は、PostObject リクエストを 2014 年 12 月 1 日の 12:00 より前に送信する必要があることを意味します。

  • Conditions
    Conditions は、PostObject リクエストのフォームフィールドの有効な値を指定するリストです。
    OSS でポリシーがチェックされた後、フォームフィールドの値が展開されます。 したがって、ポリシーに設定されたフォームフィールドの有効な値は、展開前のフォームフィールドの値と同じです。

    次の表は、ポリシーでサポートされている条件の一覧です。

    パラメーター 説明
    content-length-range アップロードするファイルの最大許容サイズと最小許容サイズ。 この条件は、content-length-range 一致モードをサポートします。
    Cache-ControlContent-TypeContent-DispositionContent-EncodingExpires HTTP リクエストヘッダー。 この条件は、完全一致モードと前方一致モードをサポートします。
    key アップロードするファイルのオブジェクト名。 この条件は、完全一致モードと前方一致モードをサポートします。
    success_action_redirect アップロードが成功した後にクライアントがリダイレクトされる URL。 この条件は、完全一致モードと前方一致モードをサポートします。
    success_action_status success_action_redirect が指定されていない場合、アップロードが成功した後に返されるステータスコード。 この条件は、完全一致モードと前方一致モードをサポートします。
    x-oss-meta-* ユーザーが設定するメタ値。 この条件は、完全一致モードと前方一致モードをサポートします。

    PostObject リクエストに他のフォームフィールドが含まれている場合、そのフィールドはポリシーの条件に追加され、有効性がチェックされます。

  • 条件一致モード
    条件一致モード 説明
    完全一致 フォームフィールドの値は、条件で宣言された値と完全に同じ必要があります。 たとえば、key フォームフィールドの値が a でなければならない場合、条件を {“key”: “a”} または [“eq”, “$key”, “a”] にする必要があります。
    前方一致 フォームフィールドの値は、指定した値で始まる必要があります。 たとえば、key の値が user/user1 で始まらなければならない場合、条件を [“starts-with”, “$key”, “user/user1”] にする必要があります。
    指定したファイル サイズ 指定可能なファイル サイズの範囲。 たとえば、指定可能なファイル サイズが 1 から 10 バイトの場合、条件を ["content-length-range", 1, 10] にする必要があります。
  • エスケープ文字

    PostObject リクエストの policy フォームフィールドでは、変数を示すために $ を使用します。 したがって、$ を記述するには、エスケープ文字を使用する必要があります。 また、JSON 文字列の一部の文字はエスケープされます。 PostObject リクエストの policy フォームフィールドの JSON 文字列内の文字を次の表に示します。

    エスケープ文字 説明
    \/ スラッシュ
    \ バックスラッシュ
    \” 二重引用符
    \$ ドル記号
    スペース スペース
    \f フォームフィード
    \n 改行
    \r キャリッジリターン
    \t 水平タブ
    \uxxxx Unicode 文字

Post Signature

検証済みの PostObject リクエストの場合、HTML フォームに policy と signature が含まれている必要があります。 policy には、リクエストで指定可能な値を指定します。 signature を計算する手順は次のとおりです。

  1. UTF-8 でエンコードされたポリシーを作成します。
  2. このポリシーを base64 でエンコードします。 エンコード結果は policy フォームフィールドの値です。この値は、署名する文字列として使用されます。
  3. AccessKeySecret を使用して文字列に署名します。 署名方法は、ヘッダー内の署名の計算方法と同じです。つまり、署名する文字列を policy フォームフィールドで置き換えます。