edit-icon download-icon

PostObject

最終更新日: Aug 01, 2018

はじめに

PostObjectは、フォームを使用してOSSにファイルをアップロードします。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}

OSSAccessKeyId、Signature、Content-Disposition、オブジェクトメタ(x-oss-meta-*)、などのフォームフィールドにはHost、User-Agent、Content-Length、Content-セキュリティトークン、その他のHTTPヘッダー(キャッシュ制御/コンテンツタイプ/キャッシュ制御/コンテンツタイプ/コンテンツ処理/コンテンツエンコーディング/有効期限/コンテンツエンコーディング/有効期限)とファイルです。fileはそれらのフォームフィールドの最後のフィールドでなければなりません。

詳細は、PostObjectを参照してください。

PostObjectの一般的なエラー

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

No エラー 原因 ソリューション
1 ErrorCode:MalformedPOSTRequest
ErrorMessage:あなたのPOSTリクエストの本体が整形式でないform-data
フォームフィールドフォーマットが無効です。 フォームフィールドの正しい形式については、表の後に PutObjectフォームフィールドの書式を参照してください。
2 ErrorCode:InvalidAccessKeyId
ErrorMessage:あなたが提供したOSSアクセスキーIDは私たちのレコードには存在しません。
AccessKeyIDが無効になっていたか、存在しなかった、一時ユーザーAccessKeyIDが期限切れになったか、または一時ユーザーがSTSトークンを提供しなかった トラブルシューティング方法については、OSS 403エラーを参照してください。
3 ErrorCode:AccessDenied
ErrorMessage:ポリシーに従って無効です:ポリシーの有効期限が切れました。
フォームフィールド policyexpirationが期限切れになりました。 expirationの形式が ISO8601 GMT に準拠していることを保証しながら、policyexpirationを調整してください。
4 ErrorCode:AccessDenied
ErrorMessage:SignatureDoesNotMatch計算したリクエストの署名が、指定した署名と一致しません。キーと署名方法を確認してください。
不正な署名 署名方法については、 PutObject署名を参照してください。
5 ErrorCode:InvalidPolicyDocument
ErrorMessage:無効なポリシー:無効な単純条件:単純条件には、1つのプロパティーが指定されている必要があります。
policyは要求に少なくとも一つの条件を含んでいます 表の後に PutObjectポリシー形式を参照してください。
6 ErrorCode:InvalidPolicyDocument
ErrorMessage:無効なポリシー:無効なJSON:unknown char e
リクエストの不正な policyフォーマット policyの書式をチェックして、``がなくてエスケープ文字が`であることを確認してください。
7 ErrorCode:InvalidPolicyDocument
ErrorMessage:無効なポリシー:無効なJSON:、または期待されています
リクエストの不正な policyフォーマット ]policyにないか確認してください。
8 ErrorCode:AccessDenied
ErrorMessage:ポリシーに従って無効:ポリシー条件が失敗しました:[“starts-with”、 “$ key”、 “user / eric /“]
要求によって指定された key 'と policyで指定されたkey’は一致しません リクエストのフォームフィールド keyの値を確認してください。
9 ErrorCode:AccessDenied
ErrorMessage:ポリシーに従って無効:ポリシー条件に失敗しました:[ “EQ”、 “$ バケット “、 “mingdi-BJX”]
バケット要求で指定されたとpolicy で指定されたものが一致しません endpointバケットの値を確認してください。
10 ErrorCode:AccessDenied
ErrorMessage:ポリシーに従って無効:ポリシー条件が失敗しました:[“starts-with”、 “$ x-oss-meta-prop”、 “prop-“]
要求によって指定され、 policyによって指定されたファイルメタデータx-oss-meta-propは一致しません リクエスト中の x-oss-meta-propの値を確認してください。
11 ErrorCode:AccessDenied
ErrorMessage:ポリシーに従って無効:ポリシー条件が失敗しました:[“eq”、 “$ {field}”、 “$ {value}”]
フォームフィールドで指定された {field}policyで指定された{field}は一致しません。 リクエストの {field}の値を確認してください。
12 ErrorCode:AccessDenied
ErrorMessage:このオブジェクトにアクセスする権利はないバケットのACLです。
現在のユーザーは必要な権限を持っていませんでした。 OSS の権限に関するトラブルシューティングを参照してください。
13 ErrorCode:InvalidArgument
ErrorMessage:バケットPOSTには、指定された「キー」が含まれている必要があります。それが指定されている場合、フィールドの順序を確認してください
フォームフィールドにはキーが指定されていないか、フォームフィールドファイルの後に配置されています。 フォームフィールドキーを追加するか、注文を調整します。

PutObjectフォームフィールドの書式

PutObject要求の形式については、次の点に注意してください。

  • ヘッダーにはContent-Type: multipart/form-data; boundary={boundary}を含む必要があります。
  • ヘッダーと本文は\r\n--{boundary}で区切られています。
  • フォームフィールドのフォーマットは Content-Disposition: form-data; name="{key}"\r\n\r\n{value}\r\n--{boundary}です。
  • フォームフィールド fileは最後のフォームフィールドでなければなりません。
  • フォーム・フィールド名は、ポリシー、キー、ファイル、OSSAccessKeyId、OSSAccessKeyId、Content-Dispositionなどの大文字小文字の区別があります。
  • バケットがpublic-read-writeの時、フォームフィールドOSSAccessKeyId、ポリシーおよび署名を指定する必要はありません。OSSAccessKeyIdやポリシーや署名のいずれかが指定されている場合は、他の2つのフォームフィールドは、バケットが public-read-writeであるかに関係なく、他の2つのフォームフィールドが指定されている必要があります。

次に、PostObjectリクエストの例を示します。

  1. POST / HTTP/1.1
  2. User-Agent: Mozilla/5.0 (Windows; U; Windows NT 6.1; zh-CN; rv:1.9.2.6)
  3. Content-Type: multipart/form-data; boundary=9431149156168
  4. Host: mingdi-hz.oss-cn-hangzhou.aliyuncs.com
  5. Accept: text/html, image/gif, image/jpeg, *; q=.2, */*; q=.2
  6. Connection: keep-alive
  7. Content-Length: 5052
  8. --9431149156168
  9. Content-Disposition: form-data; name="key"
  10. test-key
  11. --9431149156168
  12. Content-Disposition: form-data; name="Content-Disposition"
  13. attachment;filename=D:\img\1.png
  14. --9431149156168
  15. Content-Disposition: form-data; name="OSSAccessKeyId"
  16. 2NeL********j2Eb
注意:
  • - 上記のサンプルリクエストでは、 \r\nは改行、つまり改行を示します。また、これは以下のサンプルリクエストにも適用されます
  • - 上記のサンプルリクエストは一部のコードとなります。完全なリクエストについては、PostObjectを参照してください。

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

PutObjectポリシー形式

PutObject要求では、フォームフィールド policyが要求の有効性を検証するために使用され、PutObject要求によって満たされなければならない条件が宣言されます。具体的には、以下の条件があります。

  • UTF-8 JSONテキストは、フォームフィールド policyに渡される前にbase64でエンコードされている必要があります。
  • policyexpirationconditionsを含んでいなければなりません。conditionsは少なくとも一つの項目を含んでいなければなりません。

以下はbase64エンコーディングの前の policyの例です。

  1. {
  2. "expiration": "2018-01-01T12:00:00.000Z",
  3. "conditions": [
  4. ["content-length-range", 0, 104857600]
  5. ]
  6. }

expiration項目は、ISO8601 GMT時刻形式で要求の有効期限を指定します。たとえば、2018-01-01T12:00:00.000Zは、要求が午前12:00前に発生しなければならないことを指定します。2018年1月1日

ポストポリシーは、以下の「条件」をサポートしています。

名前 説明
バケット アップロードされたファイルの名前「 バケット 」。完全一致がサポートされています。 {“bucket”: “johnsmith” } or [“eq”, “$bucket”, “johnsmith”]
キー アップロードされたファイルの名前。完全一致とプレフィックス一致がサポートされています。 [“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”]
キャッシュ制御、コンテンツタイプ、コンテンツ処理、コンテンツエンコーディング、期限切れなど HTTPヘッダーはフォームフィールドとして渡されます。 完全一致とプレフィックス一致がサポートされています。 [“eq”, “$Content-Encoding”, “ZLIB”]

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

エスケープ文字 説明
/ スラッシュ
\ バックスラッシュ
二重引用符
$ ドルマーク
\b 空白
\f フォームフィード
\n ラインフィード
\r 改行
\t 水平タブ
\uxxxx ユニコード文字

PostObjectの詳細については、PostObjectを参照してください。

PutObject署名

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

i. UTF-8でエンコードされたポリシーを作成します。
ii. ポリシーをbase64でエンコードします。結果の値は、policyフォームフィールドに取り込まれる値であり、この値は署名される文字列として使用されます。
3.AccessKeySecretで文字列に署名してください。具体的には、文字列をhmac-sha1でハッシュし、base64でエンコードします。署名方法はヘッダーへの署名の追加と同じです。

すなわち:

  1. Signature = base64(hmac-sha1(AccessKeySecret, base64(policy)))

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

  1. Content-Disposition: form-data; name="Signature"
  2. {signature}
  3. --9431149156168

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

よくある質問

どのようにキーを指定するのですか?

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

  1. Content-Disposition: form-data; name="key"
  2. {key}
  3. --9431149156168

どのようにオブジェクトの内容を指定するのですか?

フォームフィールド fileにオブジェクトの内容を指定します。以下に例を示します。

  1. Content-Disposition: form-data; name="file"; filename="images.png"
  2. Content-Type: image/png
  3. {file-content}
  4. --9431149156168

注意:
  • - フォームフィールド fileは、フォームの最後のフィールドでなければなりません。つまり、他のフォームフィールドの後ろに置く必要があります。
  • filenameはアップロードされたローカルファイルの名前ですが、オブジェクト名はありません。

どのようにオブジェクトの content-typeを指定するのですか?

フォームフィールド fileではオブジェクトのcontent-typeを指定しますが、ヘッダーの content-typeでは指定しません。以下に例を示します。

  1. Content-Disposition: form-data; name="file"; filename="images.png"
  2. Content-Type: image/png
  3. {file-content}
  4. --9431149156168

どのようにオブジェクトコンテンツの content-md5検証を指定するのですか?

PostObjectリクエストヘッダに Content-MD5を指定してください。MD5値は本文全体、つまりすべてのフォームフィールドの値です。リクエストヘッダーの例を以下に示します。

  1. POST / HTTP/1.1
  2. User-Agent: Mozilla/5.0 (Windows; U; Windows NT 6.1; zh-CN; rv:1.9.2.6)
  3. Content-Type: multipart/form-data; boundary=9431149156168
  4. Content-MD5: tdqHe4hT/TuKb7Y4by+nJg==
  5. Host: mingdi-hz.oss-cn-hangzhou.aliyuncs.com
  6. Accept: text/html, image/gif, image/jpeg, *; q=.2, */*; q=.2
  7. Connection: keep-alive
  8. Content-Length: 5246
  9. --9431149156168

署名を指定する方法は?

署名計算方法については、「PutObject署名」を参照してください。署名はフォームフィールド「署名」で指定されます。

一時的なユーザのSTSトークンでPostObjectを実装する方法は?

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

  1. Content-Disposition: form-data; name="Signature"
  2. 5L0+KaeugxYygfqWLJLoy0ehOmA=
  3. --9431149156168
  4. Content-Disposition: form-data; name="x-oss-security-token"
  5. {Token}
  6. --9431149156168

コールバックを指定する方法は?

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

  1. Content-Disposition: form-data; name="callback"
  2. eyJjYWxsYmFja0JvZHlUeXBlIjogImFwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZCIsICJjYWxsYmFja0JvZHkiOiAiZmlsZW5hbWU9JHtvYmplY3R9JnNpemU9JHtzaXplfSZtaW1lVHlwZT0ke21pbWVUeXBlfSIsICJjYWxsYmFja1VybCI6ICJodHRwOi8vb3NzLWRlbW8uYWxpeXVuY3MuY29tOjIzNDUwIn0=
  3. --9431149156168

コールバックのカスタムパラメータは、フォームフィールドによっても指定されます。以下に例を示します。

  1. Content-Disposition: form-data; name="x:var1"
  2. {var1-value}
  3. --9431149156168

Content-Transfer-Encodingの指定方法は?

フォームフィールド fileContent-Transfer-Encodingを指定してください。以下は fileフォームフィールドの例です:

  1. Content-Disposition: form-data; name="file"; filename="images.png"
  2. Content-Type: image/png
  3. Content-Transfer-Encoding: base64
  4. {file-content}
  5. --9431149156168

どのようにカスタムメタ情報のObject User Metaを指定するのですか?

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

  1. Content-Disposition: form-data; name="x-oss-meta-uuid"
  2. {uuid}
  3. --9431149156168
  4. Content-Disposition: form-data; name="x-oss-meta-tag"
  5. {tag}
  6. --9431149156168

注意:
ファイルメタ情報の詳細については、オブジェクトメタを参照してください。

有効期限、キー、 バケット 、サイズ、ヘッダーなどの条件を指定する方法は?

PostObject for OSSは、さまざまな条件をサポートし、厳しいセキュリティ要件を満たすことができます。フォームフィールド policyに条件を指定します。詳細については、上記のPutObjectポリシーフォーマットを参照してください。次に、ポリシーの例を示します。

  1. {
  2. "expiration": "2018-01-01T12:00:00.000Z",
  3. "conditions": [
  4. ["eq", "$bucket", "md-hz"],
  5. ["starts-with", "$key", "md/conf/"],
  6. ["content-length-range", 0, 104857600]
  7. ]
  8. }

上記のポリシーでは、ユーザーPostObject操作の条件は次のとおりです。

  • バケットはMD-hzにする必要があります。
  • keymd/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で指定する必要があります。

PostObjectの例

リンク

PostObject