Problem description
The policy form field in a PostObject request is blank, causing a request error.
Causes
The policy field validates the form fields in a PostObject request. A request without policy is treated as an anonymous request, which can only access buckets with a public-read-write access control list (ACL).
A request error occurs if either of the following conditions is true:
The bucket ACL is not
public-read-writeand the request includes nopolicyfield.The request includes
OSSAccessKeyIdorSignature, but thepolicyfield is blank.
Examples
In the following request, OSSAccessKeyId and Signature are set, but the policy field has no value (line 25).
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"
44CF9590006BF252****
--9431149156168
Content-Disposition: form-data; name="policy"
--9431149156168
Content-Disposition: form-data; name="Signature"
kZoYNv66bsmc10+dcGKw5x2P****
--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--Solutions
Set the policy form field to a valid Base64-encoded value:
Write a policy document in JSON. The document must include
expirationandconditions. Pythonpolicy = { "expiration": "2023-02-19T13:19:00.000Z", "conditions": [ ["content-length-range", 0, 1048576000] ] }JavaScript
var policyText = { "expiration": "2023-02-18T21:39:00.000Z", "conditions": [ ["content-length-range", 0, 1048576000] ] };Encode the policy in Base64 and set the result as the value of the
policyfield. Pythonencoded_policy = base64.b64encode(json.dumps(policy).encode('utf-8'))JavaScript
var policyBase64 = Base64.encode(JSON.stringify(policyText));
References
For the full
policyfield specification, see the "Appendix: Policy" section of PostObject.To learn how to sign and submit a policy from a browser, see Add signatures on the client by using JavaScript and upload data to OSS.
For other common PostObject errors, see PostObject error handling.