Topik ini menjelaskan kesalahan umum pada operasi PostObject dan solusinya.
Pengenalan
PostObject digunakan untuk mengunggah file ke OSS menggunakan formulir. Dalam Post Object, entitas pesan dienkripsi dalam format multipart/form-data. Untuk informasi lebih lanjut, lihat RFC 2388. Pada Put Object, parameter dilewatkan melalui header HTTP, sedangkan pada Post Object, parameter dilewatkan sebagai bidang formulir dalam badan pesan.
Pesan PostObject terdiri dari header dan body. Header dan body dipisahkan oleh \r\n--{boundary}. Body mencakup serangkaian bidang formulir dengan format berikut: Content-Disposition: form-data; name="{key}"\r\n\r\n{value}\r\n--{boundary}.
Header umum mencakup Host, User-Agent, Content-Length, Content-Type, dan Content-MD5, sementara bidang formulir mencakup key, OSSAccessKeyId, Signature, Content-Disposition, object meta (x-oss-meta-*), x-oss-security-token, header HTTP lainnya (Cache-Control/Content-Type/Content-Disposition/Content-Encoding/Expires), dan file. file harus menjadi bidang terakhir di antara bidang formulir tersebut.
Untuk informasi lebih lanjut, lihat Post Object.
Kesalahan umum PostObject
Tabel berikut menunjukkan kesalahan umum yang terjadi pada operasi PostObject:
No. | Kesalahan | Penyebab | Solusi |
1 | ErrorCode: MalformedPOSTRequest ErrorMessage: Badan permintaan POST Anda tidak diformat dengan baik sebagai multipart/form-data | Format bidang formulir tidak valid. | Lihat format bidang formulir PostObject setelah tabel untuk format yang benar dari bidang formulir. |
2 | ErrorCode: InvalidAccessKeyId ErrorMessage: OSS Access Key Id yang Anda berikan tidak ada dalam catatan kami. |
| Lihat Pemecahan Masalah Invalid AccessKeyId untuk metode pemecahan masalah. |
3 | ErrorCode: AccessDenied ErrorMessage: Tidak valid sesuai Kebijakan: Kebijakan kedaluwarsa. |
| Atur ulang |
4 | ErrorCode: AccessDenied ErrorMessage: SignatureDoesNotMatch Tanda tangan permintaan yang kami hitung tidak cocok dengan tanda tangan yang Anda berikan. Periksa kunci dan metode penandatanganan Anda. | Tanda tangan salah. | Lihat PostObject signature untuk metode penandatanganan. |
5 | ErrorCode: InvalidPolicyDocument ErrorMessage: Kebijakan Tidak Valid: Simple-Condition Tidak Valid: Simple-Conditions harus memiliki tepat satu properti yang ditentukan. | Kebijakan berisi setidaknya satu kondisi dalam permintaan. | Lihat format kebijakan PostObject. |
6 | ErrorCode: InvalidPolicyDocument ErrorMessage: Kebijakan Tidak Valid: JSON Tidak Valid: karakter tidak dikenal e | Periksa format |
|
7 | ErrorCode: InvalidPolicyDocument ErrorMessage: Kebijakan Tidak Valid: JSON Tidak Valid: , atau ] diharapkan | Format | Periksa apakah |
8 | ErrorCode: AccessDenied ErrorMessage: Tidak valid sesuai Kebijakan: Kondisi Kebijakan gagal: [“starts-with”, “$key”, “user/eric/“] |
| Periksa nilai bidang formulir |
9 | ErrorCode: AccessDenied ErrorMessage: Tidak valid sesuai Kebijakan: Kondisi Kebijakan gagal: [“eq”, “$bucket”, “mingdi-bjx”] |
| Periksa nilai |
10 | ErrorCode: AccessDenied ErrorMessage: Tidak valid sesuai Kebijakan: Kondisi Kebijakan gagal: [“starts-with”, “$x-oss-meta-prop”, “prop-“] | Metadata file | Periksa nilai |
11 | ErrorCode: AccessDenied ErrorMessage: Tidak valid sesuai Kebijakan: Kondisi Kebijakan gagal: [“eq”, “${field}”, “${value}”] |
| Periksa nilai |
12 | ErrorCode: AccessDenied ErrorMessage: Anda tidak memiliki hak untuk mengakses objek ini karena acl bucket. | Pengguna saat ini tidak memiliki izin yang diperlukan. | |
13 | ErrorCode: InvalidArgument ErrorMessage: Bucket POST harus berisi 'key' yang ditentukan. Jika sudah ditentukan, periksa urutan bidang | Bidang formulir tidak menentukan | Tambahkan bidang formulir |
Format Bidang Formulir PostObject
Untuk format permintaan PostObject, perhatikan item berikut:
Header harus mencakup
Content-Type: multipart/form-data; boundary={boundary}.Header dan body dipisahkan oleh
\r\n--{boundary}.Format bidang formulir:
Content-Disposition: form-data; name="{key}"\r\n\r\n{value}\r\n--{boundary}Nama bidang formulir bersifat peka huruf besar-kecil, seperti policy, key, file, OSSAccessKeyId, OSSAccessKeyId, dan Content-Disposition.
PentingBidang formulir
fileharus menjadi bidang formulir terakhir.Ketika nilai
bucketadalahpublic-read-write, Anda tidak harus menentukan bidang formulir OSSAccessKeyId, policy, dan Signature. Jika salah satu dari OSSAccessKeyId, policy, dan Signature ditentukan, dua bidang formulir lainnya harus ditentukan tanpa memperhatikan apakahbucketadalahpublic-read-writeatau tidak.
Berikut ini menjelaskan contoh permintaan 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********j2EbCatatanDalam permintaan sampel sebelumnya,
\r\nmenunjukkan baris baru, yaitu line feed. Selain itu, ini juga berlaku untuk permintaan sampel berikutnya.Permintaan sampel sebelumnya tidak lengkap. Untuk permintaan lengkap, lihat Post Object.
Jika Anda memiliki pertanyaan, lihat kode sampel:
Format Kebijakan PostObject
Dalam permintaan PostObject, bidang formulir
policydigunakan untuk memverifikasi validitas permintaan dan mendeklarasikan kondisi yang harus dipenuhi oleh permintaan PostObject. Secara spesifik, kondisi-kondisi tersebut adalah:Teks JSON UTF-8 harus dienkripsi dengan base64 sebelum dimasukkan ke dalam bidang formulir
policy.policyharus mencakupexpirationdanconditionsdi manaconditionsharus berisi setidaknya satu item.
Berikut ini menunjukkan contoh
policysebelum encoding base64.{ "expiration": "2018-01-01T12:00:00.000Z", "conditions": [ ["content-length-range", 0, 104857600] ] }Item
expirationmenentukan waktu kedaluwarsa permintaan dalam format waktu GMT ISO8601. Sebagai contoh,2018-01-01T12:00:00.000Zmenentukan bahwa permintaan harus dilakukan sebelum pukul 12:00 pagi pada tanggal 1 Januari 2018.PostPolicy mendukung kondisi "conditions" berikut:
Nama
Deskripsi
Contoh
bucket
Nama bucket dari file yang diunggah. Cocok persis didukung.
{“bucket”: “johnsmith” } atau [“eq”, “$bucket”, “johnsmith”]
key
Nama file yang diunggah. Cocok persis dan cocok awalan didukung.
[“starts-with”, “$key”, “user/etc/”]
content-length-range
Ukuran maksimum dan minimum file yang diunggah.
[“content-length-range”, 0, 104857600]
x-oss-meta-*
Meta objek yang ditentukan. Cocok persis dan cocok awalan didukung.
[“starts-with”, “$x-oss-meta-prop”, “prop-“]
success_action_redirect
URL pengalihan setelah unggahan berhasil. Cocok persis dan cocok awalan didukung.
[“starts-with”, “$success_action_redirect”, “
http://www.aliyun.com”]success_action_status
Kode status yang dikembalikan setelah unggahan berhasil jika success_action_redirect tidak ditentukan. Cocok persis dan cocok awalan didukung.
[“eq”, “$success_action_status”, “204”]
Cache-Control, Content-Type, Content-Disposition, Content-Encoding, Expires, dan sebagainya
Header HTTP yang dilewatkan sebagai bidang formulir. Cocok persis dan cocok awalan didukung.
[“eq”, “$Content-Encoding”, “ZLIB”]
PostPolicy mendukung karakter escape berikut dan menggunakan
\untuk escape.Karakter Escape
Deskripsi
/
Garis miring
\
Garis miring terbalik
"
Tanda kutip ganda
$
Tanda dolar
\b
Ruang kosong
\f
Form feed
\n
Pemberian makan baris
\r
Masuk
\t
Tab horizontal
\uxxxx
Karakter Unicode
Untuk informasi lebih lanjut tentang PostPolicy, lihat Kebijakan Post.
Signature PostObject
Untuk verifikasi permintaan Post, ia harus mencakup bidang formulir AccessKeyID, policy, dan Signature. Proses perhitungan tanda tangan adalah sebagai berikut:
Buat kebijakan yang dienkripsi dengan
UTF-8.Enkripsi kebijakan dengan
base64. Nilai yang dihasilkan adalah nilai yang akan diisi ke dalam bidang formulirpolicy, dan nilai ini digunakan sebagai string yang akan ditandatangani.Tandatangani string dengan
AccessKeySecret. Secara khusus, hash string dengan hmac-sha1 dan kemudian enkripsi dengan base64. Metode tanda tangan sama dengan metode untuk Header Signature.
Yaitu:
Signature = base64(hmac-sha1(AccessKeySecret, base64(policy)))Tentukan tanda tangan yang dihitung dalam bidang formulir
Signaturesebagai berikut:Content-Disposition: form-data; name="Signature" {signature} -- 9431149156168Jika Anda memiliki pertanyaan, lihat kode sampel:
FAQ
Bagaimana cara menentukan key?
Key adalah nama objek, yang ditentukan dalam bidang formulir
key. Berikut ini menunjukkan contoh:Content-Disposition: form-data; name="key" {key} --9431149156168Bagaimana cara menentukan konten objek?
Tentukan konten objek dalam bidang formulir
file. Berikut ini menunjukkan contoh:Content-Disposition: form-data; name="file"; filename="images.png" Content-Type: image/png {File-content} -- 9431149156168CatatanBidang formulir
fileharus menjadi bidang terakhir dalam formulir, yaitu harus ditempatkan setelah bidang formulir lainnya.filenameadalah nama file lokal yang diunggah tetapi bukan nama objek.
Bagaimana cara menentukan
content-typedari objek?Tentukan
content-typedari objek dalam bidang formulirfiletetapi tidak dalamcontent-typeheader. Berikut ini menunjukkan contoh:Content-Disposition: form-data; name="file"; filename="images.png" Content-Type: image/png {file-content} --9431149156168Bagaimana cara menentukan verifikasi
content-md5untuk konten objek?Tentukan
content-md5dalam header permintaan Post Object. Perhatikan bahwa nilai MD5 adalah untuk seluruh body yaitu untuk semua bidang formulir. Berikut ini menunjukkan contoh header permintaan: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 --9431149156168Bagaimana cara menentukan tanda tangan?
Lihat
PostObject signatureuntuk metode perhitungan tanda tangan. Tanda tangan dibawa oleh bidang formulirSignature.Bagaimana cara mengimplementasikan Post Object dengan STS Token pengguna sementara?
Penggunaan AccessKeyID dan AccessKeySecret dari kunci pengguna sementara sama dengan kunci pengguna utama dan kunci sub-pengguna.
Tokendibawa oleh bidang formulirx-oss-security-token. Berikut ini menunjukkan contoh:Content-Disposition: form-data; name="Signature" 5L0+KaeugxYygfqWLJLoy0ehOmA= --9431149156168 Content-Disposition: form-data; name="x-oss-security-token" {Token} --9431149156168Bagaimana cara menentukan callback?
Callback dibawa oleh bidang formulir
callback. Berikut ini menunjukkan contoh:Content-Disposition: form-data; name="callback" eyJjYWxsYmFja0JvZHlUeXBlIjogImFwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZCIsICJjYWxsYmFja0JvZHkiOiAiZmlsZW5hbWU9JHtvYmplY3R9JnNpemU9JHtzaXplfSZtaW1lVHlwZT0ke21pbWVUeXBlfSIsICJjYWxsYmFja1VybCI6ICJodHRwOi8vb3NzLWRlbW8uYWxpeXVuY3MuY29tOjIzNDUwIn0= --9431149156168Parameter kustom callback juga dibawa oleh bidang formulir. Berikut ini menunjukkan contoh:
Content-Disposition: form-data; name="x:var1" {var1-value} --9431149156168Bagaimana cara menentukan
Content-Transfer-Encoding?Tentukan
Content-Transfer-Encodingdalam bidang formulirfile. Berikut ini menunjukkan contoh bidang formulirfile:Content-Disposition: form-data; name="file"; filename="images.png" Content-Type: image/png Content-Transfer-Encoding: base64 {file-content} --9431149156168Bagaimana cara menentukan informasi meta kustom
Object User Meta?Tentukan informasi meta kustom dalam bidang formulir. Berikut ini menunjukkan contoh:
Content-Disposition: form-data; name="x-oss-meta-uuid" {uuid} --9431149156168 Content-Disposition: form-data; name="x-oss-meta-tag" {tag} --9431149156168CatatanUntuk informasi lebih lanjut tentang informasi meta file, lihat Informasi Meta File Objek Meta.
Bagaimana cara menentukan kondisi seperti kedaluwarsa, Key, Bucket, ukuran, dan header?
PostObject untuk OSS mendukung berbagai kondisi dan dapat memenuhi persyaratan keamanan yang ketat. Tentukan kondisi dalam bidang formulir
policy. Berikut ini menunjukkan contoh kebijakan:{ "expiration": "2018-01-01T12:00:00.000Z", "conditions": [ ["eq", "$bucket", "md-hz"], ["starts-with", "$key", "md/conf/"], ["content-length-range", 0, 104857600] ] }Dalam kebijakan sebelumnya, kondisi untuk operasi Post Object pengguna adalah sebagai berikut:
bucketharusmd-hz.keyharus dimulai denganmd/conf/.Ukuran file yang diunggah harus kurang dari 100 MB.
Waktu permintaan harus lebih awal dari
2018-01-01T12:00:00.000Z.
Bagaimana cara menentukan header HTTP seperti Cache-Control, Content-Type, Content-Disposition, Content-Encoding dan Expires?
Tentukan header HTTP termasuk
Cache-Control,Content-Type,Content-Disposition,Content-Encoding, danExpiresdalam bidang formulir. Untuk makna header HTTP tersebut, lihat RFC2616. Namun,Content-MD5perlu ditentukan dalam Header Post.