Ejemplo: carga basada en el navegador con HTTP POST (con AWS Signature Version 4)
En esta sección, se muestra un ejemplo del uso de una solicitud HTTP POST para cargar contenido directamente en Amazon S3.
Para obtener más información sobre la versión 4 de firma, consulte Proceso de firma de Signature Version 4.
Carga de un archivo en Amazon S3 con HTTP POST
Este ejemplo proporciona una política POST de ejemplo y un formulario que puede utilizar para cargar un archivo. El tema utiliza la política de ejemplo y las credenciales ficticias muestran el flujo de trabajo y el hash de la firma y la política resultantes. Puede utilizar estos datos como conjunto de pruebas para verificar el código de cálculo de la firma.
El ejemplo utiliza las credenciales de ejemplo siguientes de los cálculos de la firma. Puede usar estas credenciales para verificar el código de cálculo de la firma. Sin embargo, a continuación, debe sustituirlas por sus propias credenciales cuando envíe las solicitudes a AWS.
| Parámetro | Valor |
|---|---|
AWSAccessKeyId |
AKIAIOSFODNN7EXAMPLE |
AWSSecretAccessKey |
wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY |
Ejemplo de política y formulario
La política POST siguiente admite cargas en Amazon S3 con condiciones específicas.
{ "expiration": "2015-12-30T12:00:00.000Z", "conditions": [ {"bucket": "sigv4examplebucket"}, ["starts-with", "$key", "user/user1/"], {"acl": "public-read"}, {"success_action_redirect": "http://sigv4examplebucket.s3.amazonaws.com/successful_upload.html"}, ["starts-with", "$Content-Type", "image/"], {"x-amz-meta-uuid": "14365123651274"}, {"x-amz-server-side-encryption": "AES256"}, ["starts-with", "$x-amz-meta-tag", ""], {"x-amz-credential": "AKIAIOSFODNN7EXAMPLE/20151229/us-east-1/s3/aws4_request"}, {"x-amz-algorithm": "AWS4-HMAC-SHA256"}, {"x-amz-date": "20151229T000000Z" } ] }
Esta política POST establece las siguientes condiciones en la solicitud:
-
La carga se debe realizar antes de las 12:00 UTC el 30 de diciembre de 2015.
-
El contenido solo se puede cargar en
sigv4examplebucket. El bucket debe estar en la región que especificó en el ámbito de las credenciales (parámetro del formulariox-amz-credential), ya que la firma que proporcionó solo es válida dentro de este ámbito. -
Puede proporcionar cualquier nombre de clave que comience por
user/user1. Por ejemplo,user/user1/MyPhoto.jpg. -
El ACL debe estar establecido en
public-read. -
Si la carga se realiza correctamente, se redirige al navegador del usuario a
http://sigv4examplebucket.s3.amazonaws.com/successful_upload.html. -
El objeto debe ser un archivo de imagen.
-
La etiqueta
x-amz-meta-uuidse debe establecer en14365123651274. -
x-amz-meta-tagpuede incluir cualquier valor.
A continuación, se incluye una versión de esta política POST codificada en Base64. Este valor se utiliza como StringToSign en el cálculo de firmas.
eyAiZXhwaXJhdGlvbiI6ICIyMDE1LTEyLTMwVDEyOjAwOjAwLjAwMFoiLA0KICAiY29uZGl0aW9ucyI6IFsNCiAgICB7ImJ1Y2tldCI6ICJzaWd2NGV4YW1wbGVidWNrZXQifSwNCiAgICBbInN0YXJ0cy13aXRoIiwgIiRrZXkiLCAidXNlci91c2VyMS8iXSwNCiAgICB7ImFjbCI6ICJwdWJsaWMtcmVhZCJ9LA0KICAgIHsic3VjY2Vzc19hY3Rpb25fcmVkaXJlY3QiOiAiaHR0cDovL3NpZ3Y0ZXhhbXBsZWJ1Y2tldC5zMy5hbWF6b25hd3MuY29tL3N1Y2Nlc3NmdWxfdXBsb2FkLmh0bWwifSwNCiAgICBbInN0YXJ0cy13aXRoIiwgIiRDb250ZW50LVR5cGUiLCAiaW1hZ2UvIl0sDQogICAgeyJ4LWFtei1tZXRhLXV1aWQiOiAiMTQzNjUxMjM2NTEyNzQifSwNCiAgICB7IngtYW16LXNlcnZlci1zaWRlLWVuY3J5cHRpb24iOiAiQUVTMjU2In0sDQogICAgWyJzdGFydHMtd2l0aCIsICIkeC1hbXotbWV0YS10YWciLCAiIl0sDQoNCiAgICB7IngtYW16LWNyZWRlbnRpYWwiOiAiQUtJQUlPU0ZPRE5ON0VYQU1QTEUvMjAxNTEyMjkvdXMtZWFzdC0xL3MzL2F3czRfcmVxdWVzdCJ9LA0KICAgIHsieC1hbXotYWxnb3JpdGhtIjogIkFXUzQtSE1BQy1TSEEyNTYifSwNCiAgICB7IngtYW16LWRhdGUiOiAiMjAxNTEyMjlUMDAwMDAwWiIgfQ0KICBdDQp9
Al copiar y pegar la política anterior, debería incluir retornos de carro y líneas nuevas para que el hash calculado coincida con este valor (es decir, texto ASCII, con terminadores de línea CRLF).
Si utilizamos credenciales de ejemplo para crear una firma, el valor de la firma es el siguiente (en el cálculo de firmas, la fecha es la misma que la x-amz-date de la política (20151229):
8afdbf4008c03f22c2cd3cdb72e4afbb1f6a588f3255ac628749a66d7f09699e
El formulario de ejemplo siguiente especifica la política POST anterior y admite una solicitud POST al sigv4examplebucket. Copie o pegue el contenido en un editor de texto y guárdelo como exampleform.html. A continuación, puede cargar los archivos de imagen en el bucket específico mediante exampleform.html. La solicitud se realizará correctamente si la firma que proporciona coincide con la firma que calcula Amazon S3.
nota
Debe actualizar el nombre del bucket, las fechas, la credencial, la política y la firma con valores válidos para poder cargarlo correctamente en S3.
<html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /> </head> <body> <form action="http://sigv4examplebucket.s3.amazonaws.com/" method="post" enctype="multipart/form-data"> Key to upload: <input type="input" name="key" value="user/user1/${filename}" /><br /> <input type="hidden" name="acl" value="public-read" /> <input type="hidden" name="success_action_redirect" value="http://sigv4examplebucket.s3.amazonaws.com/successful_upload.html" /> Content-Type: <input type="input" name="Content-Type" value="image/jpeg" /><br /> <input type="hidden" name="x-amz-meta-uuid" value="14365123651274" /> <input type="hidden" name="x-amz-server-side-encryption" value="AES256" /> <input type="text" name="X-Amz-Credential" value="AKIAIOSFODNN7EXAMPLE/20151229/us-east-1/s3/aws4_request" /> <input type="text" name="X-Amz-Algorithm" value="AWS4-HMAC-SHA256" /> <input type="text" name="X-Amz-Date" value="20151229T000000Z" /> Tags for File: <input type="input" name="x-amz-meta-tag" value="" /><br /> <input type="hidden" name="Policy" value='<Base64-encoded policy string>' /> <input type="hidden" name="X-Amz-Signature" value="<signature-value>" /> File: <input type="file" name="file" /> <br /> <!-- The elements after this will be ignored --> <input type="submit" name="submit" value="Upload to Amazon S3" /> </form> </html>
Los parámetros de publicación no distinguen entre mayúsculas y minúsculas. Por ejemplo, puede especificar x-amz-signature o X-Amz-Signature.