はじめに
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 Policy の expiration が有効期限切れになりました。
|
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”] | 要求で指定されたkey とpolicy で指定されたキーが一致しません。
|
要求内のフォームフィールドの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 のいずれかを指定した場合、bucket
がpublic-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
は、expiration
とconditions
を含める必要があります。ここで、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」をご参照ください。
- UTF-8 JSON 本文はフォームフィールド
- PostObject の署名
Post リクエストを検証するには、AccessKeyID、policy、および Signature フォームフィールドを含める必要があります。 署名計算プロセスは次のとおりです。
UTF-8
でエンコードされたポリシーを作成します。- ポリシーを
base64
でエンコードします。 結果の値は、policy
フォームフィールドに入力される値です。この値は、署名される文字列として使用されます。 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 オブジェクト操作の条件は次のとおりです。
bucket
はmd-hz
である必要があります。key
は、md/conf/
で始める必要があります。- アップロードするファイルのサイズは、100 MB 未満である必要があります。
- 要求時間は、
2018-01-01T12:00:00.000Z
より前である必要があります。
- Cache-Control、Content-Type、Content-Disposition、Content-Encoding、Expires などの HTTP ヘッダーを指定する方法を教えてください。
フォームフィールドに、
Cache-Control
、Content-Type
、Content-Disposition
、Content-Encoding
、Expires
などの HTTP ヘッダーを指定します。 各 HTTP ヘッダーの意味については、「RFC2616」をご参照ください。 なお、Content-MD5
は Post Header で指定する必要があります。