はじめに

PostObject は、HTML フォームを使用してファイルを指定したバケットにアップロードするために使用します。PostObject のメッセージのエンティティは、マルチフォーム形式の multipart/form-data を使用してエンコードされます。 詳しくは、「RFC 2388」をご参照ください。 PutObject 操作では、パラメーターは HTTP リクエストヘッダーにより転送されます。一方、PostObject 操作でのパラメーターは、メッセージ本文のフォームフィールドとして転送されます。

PostObject のメッセージは、ヘッダーと本文で構成されています。 ヘッダーと本文は、 \r\n--{boundary}で区切られています。 本文は、次の形式の一連のフォームフィールドで構成されています。: Content-Disposition: form-data; name="{key}"\r\n\r\n{value}\r\n--{boundary}

一般的なヘッダーには、Host、User-Agent、Content-Length、Content-Type、および Content-MD5 を含んでいます。フォームフィールドには、key、OSSAccessKeyId、Signature、Content-Disposition、object meta (x-oss-meta-*)、x-oss-security-token, その他の HTTP ヘッダー (Cache-Control/Content-Type/Cache-Control/Content-Type/Content-Disposition/Content-Encoding/Expires/Content-Encoding/Expires) および file が含まれます。 file は前述のフォームフィールドの最後のフィールドにある必要があります。

詳しくは、「Post Object」をご参照ください。

PostObject の一般的なエラー

次のテーブルに PostObject の一般的なエラーを示します。

No. エラー 原因 ソリューション
1 ErrorCode: MalformedPOSTRequest ErrorMessage: POST リクエストの本文が multipart/form-data の正しい形式ではありません。 無効なフォームフィールド形式です。 フォームフィールドの正しい形式については、次のテーブルの PostObject フォームフィールド形式をご参照ください。
2 ErrorCode: InvalidAccessKeyId ErrorMessage: 指定の OSS アクセスキー ID がレコードに存在しません。 AccessKeyID が無効か存在していませんでした。一時的なユーザーの AccessKeyID が期限切れ、または一時的なユーザーが STS トークンを提供しませんでした。 トラブルシューティングのメソッドについては、「Invalid AccessKeyId Troubleshooting」をご参照ください。
3 ErrorCode: AccessDenied ErrorMessage: ポリシーにより、無効です。: ポリシーの有効期限が切れました。 フォームフィールド ID Policyexpiration が有効期限切れになりました。 expiration の形式が ISO 8601 GMT に準拠していることを確認して、ポリシーの expiration を調整します。
4 ErrorCode: AccessDenied ErrorMessage: 計算したリクエストの署名が、ユーザーから提出された署名と一致しません。 キーと署名方法を確認します。 署名が正しくありません。 署名メソッドについては、「 PostObject signature」をご参照ください。
5 ErrorCode: InvalidPolicyDocument ErrorMessage: 無効なポリシーです。: Simple-Condition が無効です。: Simple-Conditions には、1 つのプロパティを指定する必要があります。 ポリシーは、要求内に少なくとも1 つの条件が含まれています。 「PostObject policy format」をご参照ください。
6 ErrorCode: InvalidPolicyDocument ErrorMessage: 無効なポリシーです。: 無効なJSON: unknown char e 不明な文字ポリシーの形式をチェックして、" がないこと、およびエスケープ文字が \ であったかどうかを確認します。
7 ErrorCode: nvalidPolicyDocument ErrorMessage: 無効なポリシーです。 無効なJSON: 要求内の policy 形式が正しくありません。 , または ] がある必要があります。 ポリシーに , または ] があるかことを確認します。
8 ErrorCode: AccessDenied ErrorMessage: ポリシーにより無効です。: ポリシー条件に一致しません。: [“eq”, “$bucket”, “mingdi-bjx”] 要求で指定されたkeypolicyで指定されたキーが一致しません。 要求内のフォームフィールドのkeyの値を確認します。
9 ErrorCode: AccessDenied ErrorMessage: ポリシーにより無効です。: ポリシー条件に一致しません。: [“starts-with”, “$x-oss-meta-prop”, “prop-“] 要求で指定されたbucketと、policyにより指定されたバケットが一致しません。 エンドポイントのbucketの値を確認します。
10 ErrorCode: AccessDenied ErrorMessage: ポリシーにより無効です。:ポリシーの条件に一致しません。: [“starts-with”, “$x-oss-meta-prop”, “prop-“] 要求で指定されたファイルメタデータ x-oss-meta-prop とポリシーで指定されたファイルメタデータが一致しません。 要求内の x-oss-meta-prop の値を確認します。
11 ErrorCode: AccessDenied ErrorMessage: ポリシーにより無効です。:ポリシーの条件に一致しません。: [“eq”, “${field}”, “${value}”] フォームフィールドで指定された {field} とポリシーで指定された {field} が一致しないか、または {field} が要求内で指定されていません。 リクエストの {field} の値を確認します。
12 ErrorCode: AccessDenied ErrorMessage: バケットの ACL により、このオブジェクトにアクセスする権限がありません。 現在のユーザーに必要なアクセス許可がありませんでした。 「OSS Permission Problems and Troubleshooting」をご参照ください。
13 ErrorCode: InvalidArgument ErrorMessage: バケットの POST は指定された "キー" を含んでいる必要があります。 指定されている場合は、フィールドの順序を確認します。 フォームフィールドに key が指定されていないか、フォームフィールド fileより後に配置されています。 フォームフィールド key を追加するか、順序を調整します。
  • PostObject フォームフィールド形式

    PostObject 要求の形式については、以下の点に注意してください。

    • ヘッダーには、Content-Type: multipart/form-data; boundary={boundary}が含まれている必要があります。
    • ヘッダーと本文は \r\n--{boundary} で区切られています。
    • フォームフィールドの形式は、Content-Disposition: form-data; name="{key}"\r\n\r\n{value}\r\n--{boundary} です。
    • policy、key、file、OSSAccessKeyId、OSSAccessKeyId、Content-Disposition など、フォームのフィールド名は大文字と小文字が区別されます。
      重要 フォームフィールドの file は、最後のフォームフィールドである必要があります。
    • bucket の値が public-read-write の場合は、フォームフィールドの OSSAccessKeyId、policy、および Signature を指定する必要はありません。 OSSAccessKeyId、policy、および Signature のいずれかを指定した場合、bucketpublic-read-write かどうかに関係なく、他の 2 つのフォームフィールドを指定する必要があります。

    以下に PostObject リクエストの例を示します。

    POST / HTTP / 1.1
    User-Agent: Mozilla/5.0 (Windows; U; Windows NT 6.1; zh-CN; rv:1.9.2.6)
    Content-Type: multipart/form-data; boundary=9431149156168
    Host: mingdi-hz.oss-cn-hangzhou.aliyuncs.com
    Accept: text/html, image/gif, image/jpeg, *; q=. 2, */*; q=. 2
    Connection: keep-alive
    Content-Length: 5052
    -- 9431149156168
    Content-Disposition: form-data; name="key"
    test-key
    --9431149156168
    Content-Disposition: form-data; name="Content-Disposition"
    attachment;filename=D:\img\1.png
    --9431149156168
    Content-Disposition: form-data; name="OSSAccessKeyId"
    2NeL********j2Eb
    • 上記の要求の例では、\r\n は新しい行、つまり改行を示しています。 また、これは以下の要求の例にも適用されます。
    • 上記の要求の例は不完全な記述です。完全な要求については、 「Post Object」をご参照ください。

    ご質問がある場合は、サンプルコードをご参照ください。

  • PostObject ポリシー形式

    PostObject リクエストでは、フォームフィールドポリシーを使用してリクエストの有効性を検証し、PostObject リクエストが満たす必要がある条件を宣言します。 具体的には、条件は以下のとおりです。

    • UTF-8 JSON 本文はフォームフィールド policy に渡される前に、base64 でエンコードする必要があります。
    • policy は、expirationconditions を含める必要があります。ここで、conditions には少なくとも 1 つの項目を含める必要があります。

    以下は、base64 エンコード前の policy の例を示しています。

    
       {
        "expiration": "2018-01-01T12:00:00.000Z",
        "conditions": [
            ["content-length-range", 0, 104857600]
        ]
    }

    expiration の項目は、要求の有効期限切れ時間を ISO 8601 GMT 時間形式で指定します。 例えば、2018-01-01T12:00:00.000Z は、要求が 2018 年 1 月 1 日午前 12:00 より前に実行される必要があることを指定しています。

    PostPolicy は以下の “conditions” をサポートします。

    名前 説明
    bucket アップロードされるファイルのバケット名です。完全一致がサポートされています。 {“bucket”: “johnsmith” } or [“eq”, “$bucket”, “johnsmith”]
    key アップロードされるファイルの名前です。完全一致とプレフィックスの一致がサポートされています。 [“starts-with”, “$key”, “user/etc/“]
    content-length-range アップロードされるファイルの最大および最小許容サイズです。 [“content-length-range”, 0, 104857600]
    x-oss-meta-* 指定されたオブジェクトメタです。完全一致とプレフィックスの一致がサポートされています。 [“starts-with”, “$x-oss-meta-prop”, “prop-“]
    success_action_redirect アップロードが成功したときのリダイレクト URL です。完全一致とプレフィックスの一致がサポートされています。 [“starts-with”, “$success_action_redirect”, “http://www.aliyun.com“]
    success_action_status success_action_redirect が指定されていない場合、アップロードが成功したときに返される状態コード。 完全一致とプレフィックスの一致がサポートされています。 [“eq”, “$success_action_status”, “204”]
    Cache-Control、Content-Type、Content-Disposition、Content-Encoding、Expires などがあります。 フォームフィールドとして転送された HTTP ヘッダーです。完全一致とプレフィックスの一致がサポートされています。 [“eq”, “$Content-Encoding”, “ZLIB”]

    PostPolicy は次のエスケープ文字をサポートします。エスケープ文字には \ を使用します。

    エスケープ文字 説明
    / スラッシュ
    \ バックスラッシュ
    二重引用符
    $ ドル記号
    \b 空白
    \f フォームフィード
    \n 改行
    \r 入力
    \t 水平タブ
    \uxxxx Unicode 文字

    PostPolicy の詳細については、「Post Policy」をご参照ください。

  • PostObject の署名

    Post リクエストを検証するには、AccessKeyID、policy、および Signature フォームフィールドを含める必要があります。 署名計算プロセスは次のとおりです。

    1. UTF-8 でエンコードされたポリシーを作成します。
    2. ポリシーを base64 でエンコードします。 結果の値は、policy フォームフィールドに入力される値です。この値は、署名される文字列として使用されます。
    3. AccessKeySecret を使用して文字列に署名します。 具体的には、hmac-sha1 で文字列をハッシュしてから、base64 でエンコードします。 署名メソッドは、ヘッダー署名と同じです。
    すなわち、以下のようになります。:
    Signature = base64(hmac-sha1(AccessKeySecret, base64(policy)))

    次のようにフォームフィールドの Signature で計算された署名を指定します。

    Content-Disposition: form-data; name="Signature"
    {signature}
    -- 9431149156168

    疑問がある場合は、サンプルコードをご参照ください。

よくあるご質問

  • キーを指定する方法を教えてください。

    キーは、フォームフィールドの key で指定されているオブジェクト名です。 以下に例を示します。

    Content-Disposition: form-data; name="key"
    {key}
    --9431149156168
  • オブジェクトコンテンツを指定する方法を教えてください。

    フォームフィールド file でオブジェクトコンテンツを指定します。 以下に例を示します。

    Content-Disposition: form-data; name="file"; filename="images.png"
    Content-Type: image/png
    {File-content}
    -- 9431149156168
    • フォームフィールド file はフォームの最後のフィールド、つまり他のフォームフィールドの後に配置する必要があります。
    • filename はアップロードされたローカルファイルの名前であり、オブジェクト名ではありません。
  • オブジェクトの content-type を指定する方法を教えてください。

    フォームフィールド file でオブジェクトの content-type を指定します。ヘッダーの content-type では指定しないでください。 以下に例を示します。

    Content-Disposition: form-data; name="file"; filename="images.png"
    Content-Type: image/png
    {file-content}
    --9431149156168
  • オブジェクトコンテンツの content-md5 検証を指定する方法を教えてください。

    Post Object リクエストヘッダーに content-md5 を指定します。 MD5 値は本文全体、つまりすべてのフォームフィールドに対するものです。 リクエストヘッダーの例を次に示します。

    POST / HTTP/1.1
    User-Agent: Mozilla/5.0 (Windows; U; Windows NT 6.1; zh-CN; rv:1.9.2.6)
    Content-Type: multipart/form-data; boundary = 9431149156168
    Content-MD5: tdqHe4hT/TuKb7Y4by+nJg==
    Host: mingdi-hz.oss-cn-hangzhou.aliyuncs.com
    Accept: text/html, image/gif, image/jpeg, *; q=. 2, */*; q=. 2
    Connection: keep-alive
    Content-Length: 5246
    --9431149156168
  • 署名を指定する方法を教えてください。

    署名の計算メソッドについては PostObject signature をご参照ください。 署名はフォームフィールドSignatureによって運ばれます。

  • 一時的なユーザーの STS トークンを使用して Post Object を実装する方法を教えてください。

    一時的なユーザーキーの AccessKeyID および AccessKeySecret の使用方法は、マスターユーザーキーおよびサブユーザーキーの使用方法と同じです。 Token はフォームフィールド x-oss-security-token によって伝えられます。 以下に例を示します。

    Content-Disposition: form-data; name="Signature"
    5L0+KaeugxYygfqWLJLoy0ehOmA=
    --9431149156168
    Content-Disposition: form-data; name="x-oss-security-token"
    {Token}
    --9431149156168
  • コールバックを指定する方を教えてください。

    コールバックはフォームフィールド callback によって伝えられます。 以下に例を示します。

    Content-Disposition: form-data; name="callback"
    eyJjYWxsYmFja0JvZHlUeXBlIjogImFwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZCIsICJjYWxsYmFja0JvZHkiOiAiZmlsZW5hbWU9JHtvYmplY3R9JnNpemU9JHtzaXplfSZtaW1lVHlwZT0ke21pbWVUeXBlfSIsICJjYWxsYmFja1VybCI6ICJodHRwOi8vb3NzLWRlbW8uYWxpeXVuY3MuY29tOjIzNDUwIn0=
    --9431149156168

    コールバックカスタムパラメーターもフォームフィールドによって伝えられます。 以下に例を示します。

    Content-Disposition: form-data; name="x:var1"
    {var1-value}
    --9431149156168
  • Content-Transfer-Encoding を指定する方法を教えてください。

    フォームフィールド file で、Content-Transfer-Encoding を指定します。 以下に、file フォームフィールドの例を示します。

    Content-Disposition: form-data; name="file"; filename="images.png"
    Content-Type: image/png
    Content-Transfer-Encoding: base64
    {file-content}
    --9431149156168
  • カスタムメタ情報 Object User Meta を指定する方法を教えてください。

    フォームフィールドにカスタムメタ情報を指定します。 以下に例を示します。

    Content-Disposition: form-data; name="x-oss-meta-uuid"
    {uuid}
    --9431149156168
    Content-Disposition: form-data; name="x-oss-meta-tag"
    {tag}
    --9431149156168
    ファイルメタ情報の詳細については、「File Meta Information Object Meta」をご参照ください。
  • 有効期限、キー、バケット、サイズ、ヘッダーなどの条件を指定する方法を教えてください。

    OSS の PostObject はさまざまな条件をサポートしており、厳しいセキュリティ要件を満たすことができます。 フォームフィールド policy で条件を指定します。 以下にポリシーの例を示します。

    
        "expiration": "2018-01-01T12:00:00.000Z",
        "conditions": [
            ["eq", "$bucket", "md-hz"],
            ["starts-with", "$key", "md/conf/"],
            ["content-length-range", 0, 104857600]
    
    					

    前述のポリシーでは、ユーザーの Post オブジェクト操作の条件は次のとおりです。

    • bucketmd-hz である必要があります。
    • key は、md/conf/ で始める必要があります。
    • アップロードするファイルのサイズは、100 MB 未満である必要があります。
    • 要求時間は、2018-01-01T12:00:00.000Z より前である必要があります。
  • Cache-Control、Content-Type、Content-Disposition、Content-Encoding、Expires などの HTTP ヘッダーを指定する方法を教えてください。

    フォームフィールドに、Cache-ControlContent-TypeContent-DispositionContent-EncodingExpires などの HTTP ヘッダーを指定します。 各 HTTP ヘッダーの意味については、「RFC2616」をご参照ください。 なお、Content-MD5 は Post Header で指定する必要があります。

Post オブジェクトの例

共通リンク