Este tópico descreve os erros comuns da operação PostObject e as respectivas soluções.
Introdução
O PostObject faz upload de arquivos para o OSS por meio de formulários. Nessa operação, a codificação das entidades de mensagem usa o formato multipart/form-data. Para mais informações, consulte RFC 2388. Diferentemente do Put Object, que transmite parâmetros via headers HTTP, o Post Object envia os parâmetros como campos de formulário no corpo da mensagem.
Uma mensagem PostObject contém header e body, separados por \r\n--{boundary}. O body inclui uma série de campos de formulário no seguinte formato: Content-Disposition: form-data; name="{key}"\r\n\r\n{value}\r\n--{boundary}.
Os headers mais comuns incluem Host, User-Agent, Content-Length, Content-Type e Content-MD5. Os campos de formulário abrangem key, OSSAccessKeyId, Signature, Content-Disposition, metadados do objeto (x-oss-meta-*), x-oss-security-token, outros headers HTTP (Cache-Control/Content-Type/Cache-Control/Content-Type/Content-Disposition/Content-Encoding/Expires/Content-Encoding/Expires) e file. O campo file deve ser obrigatoriamente o último entre os campos de formulário.
Para mais informações, consulte Post Object.
Erros comuns do PostObject
A tabela a seguir lista os erros mais frequentes no PostObject:
|
Nº |
Erro |
Causa |
Solução |
|
1 |
ErrorCode: MalformedPOSTRequest ErrorMessage: The body of your POST request is not well-formed multipart/form-data |
Formato de campo de formulário inválido. |
Consulte a seção Formato de campos de formulário do PostObject, abaixo da tabela, para verifique o formato correto. |
|
2 |
ErrorCode: InvalidAccessKeyId ErrorMessage: The OSS Access Key ID You provided does not exist in our records. |
O |
Consulte Solução de problemas de Invalid AccessKeyId para obter o método de solução de problemas. |
|
3 |
ErrorCode: AccessDenied ErrorMessage: Invalid according to Policy: Policy expired. |
O valor de |
Ajuste o parâmetro |
|
4 |
ErrorCode: SignatureDoesNotMatch ErrorMessage: The request signature we calculated does not match the signature you provided. Check your key and signing method. |
Assinatura incorreta. |
Consulte a seção Assinatura do PostObject para verifique o método de assinatura. |
|
5 |
ErrorCode: InvalidPolicyDocument ErrorMessage: Invalid Policy: Invalid Simple-Condition: Simple-Conditions must have exactly one property specified. |
A política contém pelo menos uma condição inválida na requisição. |
Consulte a seção Formato de política do PostObject. |
|
6 |
ErrorCode: InvalidPolicyDocument ErrorMessage: Invalid Policy: Invalid JSON: unknown char e |
Verifique o formato da |
|
|
7 |
ErrorCode: InvalidPolicyDocument ErrorMessage: Invalid Policy: Invalid JSON: , or ] expected |
Formato da |
Verifique se falta |
|
8 |
ErrorCode: AccessDenied ErrorMessage: Invalid according to Policy: Policy Condition failed: [“starts-with”, “$key”, “user/eric/“] |
A |
Verifique o valor do campo de formulário |
|
9 |
ErrorCode: AccessDenied ErrorMessage: Invalid according to Policy: Policy Condition failed: [“eq”, “$bucket”, “mingdi-bjx”] |
O |
Verifique o valor de |
|
10 |
ErrorCode: AccessDenied ErrorMessage: Invalid according to Policy: Policy Condition failed: [“starts-with”, “$x-oss-meta-prop”, “prop-“] |
Os metadados de arquivo |
Verifique o valor de |
|
11 |
ErrorCode: AccessDenied ErrorMessage: Invalid according to Policy: Policy Condition failed: [“eq”, “${field}”, “${value}”] |
O |
Verifique o valor de |
|
12 |
ErrorCode: AccessDenied ErrorMessage: You have no right to access this object because of bucket acl. |
O usuário atual não tem a permissão necessária. |
Consulte Problemas de permissão e solução de problemas do OSS. |
|
13 |
ErrorCode: InvalidArgument ErrorMessage: The bucket POST must contain the specified ‘key’. If it is specified, please check the order of the fields |
O campo de formulário não especifique |
Adicione o campo de formulário |
-
Formato de campos de formulário do PostObject
Observe os seguintes pontos sobre o formato das requisições PostObject:
O header deve incluir
Content-Type: multipart/form-data; boundary={boundary}.O header e o body são separados por
\r\n--{boundary}.-
Formato do campo de formulário:
Content-Disposition: form-data; name="{key}"\r\n\r\n{value}\r\n--{boundary} -
Os nomes dos campos de formulário diferenciam maiúsculas de minúsculas, como policy, key, file, OSSAccessKeyId, OSSAccessKeyId e Content-Disposition.
ImportanteO campo de formulário
filedeve ser obrigatoriamente o último campo do formulário. Quando o valor de
bucketforpublic-read-write, não é necessário especifique os campos de formulário OSSAccessKeyId, policy e Signature. Caso você especifique qualquer um desses três campos, informe também os outros dois, independentemente de obucketserpublic-read-writeou não.
Veja a seguir um exemplo de requisição 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********j2EbNotaNa requisição de exemplo anterior,
\r\nindica uma nova linha (line feed). O mesmo se aplica aos exemplos subsequentes.A requisição de exemplo acima está incompleta. Para visualizar a requisição completa, consulte Post Object.
Em caso de dúvidas, consulte os códigos de exemplo:
-
Formato de política do PostObject
Em uma requisição PostObject, o campo de formulário
policyvalida a requisição e declara as condições obrigatórias. Essas condições são:Codifique o texto json em UTF-8 para base64 antes de insira-lo no campo de formulário
policy.A
policydeve conterexpirationeconditions. O campoconditionsprecisa ter pelo menos um item.
O exemplo abaixo mostra uma
policyantes da codificação base64.{ "expiration": "2018-01-01T12:00:00.000Z", "conditions": [ ["content-length-range", 0, 104857600] ] }O item
expirationdefine o tempo de expiração da requisição no formato ISO8601 GMT. Por exemplo,2018-01-01T12:00:00.000Zdetermina que a requisição deve ocorrer antes das 12h00 de 1º de janeiro de 2018.O PostPolicy aceita as seguintes "conditions":
Nome
Descrição
Exemplo
bucket
Nome do bucket do arquivo enviado. Suporta correspondência exata.
{“bucket”: “johnsmith” } ou [“eq”, “$bucket”, “johnsmith”]
key
Nome do arquivo enviado. Suporta correspondência exata e por prefixo.
[“starts-with”, “$key”, “user/etc/”]
content-length-range
Tamanhos máximo e mínimo permitidos para o arquivo enviado.
[“content-length-range”, 0, 104857600]
x-oss-meta-*
Metadados do objeto especificados. Suporta correspondência exata e por prefixo.
[“starts-with”, “$x-oss-meta-prop”, “prop-“]
success_action_redirect
URL de redirecionamento após upload bem-sucedido. Suporta correspondência exata e por prefixo.
[“starts-with”, “$success_action_redirect”, “
http://www.aliyun.com”]success_action_status
Código de status retornado após upload bem-sucedido, caso success_action_redirect não seja especificado. Suporta correspondência exata e por prefixo.
[“eq”, “$success_action_status”, “204”]
Cache-Control, Content-Type, Content-Disposition, Content-Encoding, Expires, entre outros
Headers HTTP transmitidos como campos de formulário. Suporta correspondência exata e por prefixo.
[“eq”, “$Content-Encoding”, “ZLIB”]
O PostPolicy aceita os seguintes caracteres de escape e utiliza
\para o escape.Caractere de escape
Descrição
/
Barra
\
Barra invertida
“
Aspas duplas
$
Cifrão
\b
Espaço em branco
\f
Form feed
\n
Line feed
\r
Enter
\t
Tabulação horizontal
\uxxxx
Caractere Unicode
Para mais detalhes sobre o PostPolicy, consulte Post Policy.
-
Assinatura do PostObject
Para validar uma requisição Post, inclua os campos de formulário AccessKeyID, policy e Signature. O processo de cálculo da assinatura é o seguinte:
Crie uma política codificada em
UTF-8.Codifique a política em
base64. O resultado será o valor a ser preenchido no campo de formuláriopolicye servirá como string a ser assinada.Assine a string com o
AccessKeySecret. Para isso, aplique o hash hmac-sha1 na string e codifique o resultado em base64. O método de assinatura é idêntico ao descrito em Header Signature.
Ou seja:
Signature = base64(hmac-sha1(AccessKeySecret, base64(policy)))Especifique a assinatura calculada no campo de formulário
Signatureconforme abaixo:Content-Disposition: form-data; name="Signature" {signature} -- 9431149156168Em caso de dúvidas, consulte os códigos de exemplo:
Perguntas frequentes
-
Como especifique uma key?
A key corresponde ao nome do objeto e é definida no campo de formulário
key. Veja o exemplo:Content-Disposition: form-data; name="key" {key} --9431149156168 -
Como especifique o conteúdo do objeto?
Defina o conteúdo do objeto no campo de formulário
file. Confira o exemplo:Content-Disposition: form-data; name="file"; filename="images.png" Content-Type: image/png {File-content} -- 9431149156168NotaO campo de formulário
filedeve ser sempre o último, posicionado após todos os demais campos.O parâmetro
filenamerefere-se ao nome do arquivo local enviado, e não ao nome do objeto.
-
Como especifique o
content-typedo objeto?Informe o
content-typedo objeto no campo de formuláriofile, e não nocontent-typedo header. Exemplo:Content-Disposition: form-data; name="file"; filename="images.png" Content-Type: image/png {file-content} --9431149156168 -
Como configurar a verificação
content-md5para o conteúdo do objeto?Especifique o
content-md5no header da requisição Post Object. Lembre-se de que o valor MD5 abrange todo o body, ou seja, todos os campos de formulário. Exemplo de header de requisição: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 -
Como definir uma assinatura?
Consulte a seção
Assinatura do PostObjectpara entender o método de cálculo. A assinatura é transmitida no campo de formulárioSignature. -
Como implementar o Post Object com o STS Token de um usuário temporário?
O uso do AccessKeyID e AccessKeySecret de um usuário temporário segue a mesma lógica das chaves de usuário principal e subusuário. Informe o
Tokenno campo de formuláriox-oss-security-token. Veja o exemplo:Content-Disposition: form-data; name="Signature" 5L0+KaeugxYygfqWLJLoy0ehOmA= --9431149156168 Content-Disposition: form-data; name="x-oss-security-token" {Token} --9431149156168 -
Como configurar um callback?
Transmita o callback pelo campo de formulário
callback. Exemplo:Content-Disposition: form-data; name="callback" eyJjYWxsYmFja0JvZHlUeXBlIjogImFwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZCIsICJjYWxsYmFja0JvZHkiOiAiZmlsZW5hbWU9JHtvYmplY3R9JnNpemU9JHtzaXplfSZtaW1lVHlwZT0ke21pbWVUeXBlfSIsICJjYWxsYmFja1VybCI6ICJodHRwOi8vb3NzLWRlbW8uYWxpeXVuY3MuY29tOjIzNDUwIn0= --9431149156168Envie também parâmetros personalizados do callback via campos de formulário. Exemplo:
Content-Disposition: form-data; name="x:var1" {var1-value} --9431149156168 -
Como especifique o
Content-Transfer-Encoding?Defina o
Content-Transfer-Encodingno campo de formuláriofile. Abaixo, um exemplo do campofile:Content-Disposition: form-data; name="file"; filename="images.png" Content-Type: image/png Content-Transfer-Encoding: base64 {file-content} --9431149156168 -
Como definir metainformações personalizadas
Object User Meta?Informe as metainformações personalizadas nos campos de formulário. Exemplo:
Content-Disposition: form-data; name="x-oss-meta-uuid" {uuid} --9431149156168 Content-Disposition: form-data; name="x-oss-meta-tag" {tag} --9431149156168NotaPara mais informações sobre metainformações de arquivo, consulte Metainformações de arquivo Object Meta.
-
Como especifique condições como expiration, Key, Bucket, tamanho e header?
O PostObject para OSS aceita diversas condições e atende a rigorosos requisitos de segurança. Defina as condições no campo de formulário
policy. Exemplo de política:{ "expiration": "2018-01-01T12:00:00.000Z", "conditions": [ ["eq", "$bucket", "md-hz"], ["starts-with", "$key", "md/conf/"], ["content-length-range", 0, 104857600] ] }Na política acima, as condições para operações Post Object do usuário são:
O
bucketdeve sermd-hz.A
keydeve começar commd/conf/.O tamanho do arquivo enviado deve ser inferior a 100 MB.
A requisição deve ocorrer antes de
2018-01-01T12:00:00.000Z.
-
Como especifique headers HTTP como Cache-Control, Content-Type, Content-Disposition, Content-Encoding e Expires?
Defina os headers HTTP, incluindo
Cache-Control,Content-Type,Content-Disposition,Content-EncodingeExpires, diretamente nos campos de formulário. Para o significado desses headers HTTP, consulte RFC2616. No entanto, especifique oContent-MD5no Header do Post.