Variables
Const ALGORITHM_IDENTIFIER
ALGORITHM_IDENTIFIER: "AWS4-HMAC-SHA256" = "AWS4-HMAC-SHA256"
Const ALGORITHM_QUERY_PARAM
ALGORITHM_QUERY_PARAM: "X-Amz-Algorithm" = "X-Amz-Algorithm"
Const AMZ_DATE_QUERY_PARAM
AMZ_DATE_QUERY_PARAM: "X-Amz-Date" = "X-Amz-Date"
Const CREDENTIAL_QUERY_PARAM
CREDENTIAL_QUERY_PARAM: "X-Amz-Credential" = "X-Amz-Credential"
Const SIGNATURE_QUERY_PARAM
SIGNATURE_QUERY_PARAM: "X-Amz-Signature" = "X-Amz-Signature"
Const TOKEN_QUERY_PARAM
TOKEN_QUERY_PARAM: "X-Amz-Security-Token" = "X-Amz-Security-Token"
@aws-sdk/s3-presigned-post
This package provide a function generating URL and fields. Users without AWS credentials can use the URL and fields to to make a POST request to S3. The documentation for the server side feature can be found in S3 API Reference. Please read related sections for more context.
Import
JavaScript Example:
const { createPresignedPost } = require("@aws-sdk/s3-presigned-post"); const { S3Client } = require("@aws-sdk/client-s3");
ES6 Example
import { createPresignedPost } from "@aws-sdk/s3-presigned-post"; import { S3Client } from "@aws-sdk/client-s3";
Create a POST Policy
You can optionally attach a policy to a presigned post. It specifies a list of conditions that the request must meet. For example:
const Conditions = [{ acl: "public-read" }, { bucket: "johnsmith" }, ["starts-with", "$key", "user/eric/"]];
Visit S3 POST documentation for supported policy elements. If you include a condition, you must specify the valid value in the
Fields
parameter as well. A value will not be added automatically to the fields dictionary according to the conditions.Generate a Presigned Post
Users can generate required url and fields for POST request:
const client = new S3Client({ region: "us-west-2" }); const Bucket = "johnsmith"; const Key = "user/eric/1"; const Fields = { acl: "public-read", }; const { url, fields } = await createPresignedPost(client, { Bucket, Key, Conditions, Fields, Expires: 600, //Seconds before the presigned post expires. 3600 by default. });
The
Bucket
,Key
and other values inFields
must meet the conditions specified inConditions
. TheKey
can also contain${filename}
that will be automatically replaced by the name of the file provided. See the S3 reference for more information.Post File using HTML Form
You can also post a file with HTML form:
<html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /> </head> <body> <!-- Copy the 'url' value returned by createPresignedPost() --> <form action="URL_VALUE" method="post" enctype="multipart/form-data"> <!-- Copy the 'fields' key:values returned by S3Client.generate_presigned_post() --> <input type="hidden" name="key" value="VALUE" /> <input type="hidden" name="AWSAccessKeyId" value="VALUE" /> <input type="hidden" name="policy" value="VALUE" /> <input type="hidden" name="signature" value="VALUE" /> File: <input type="file" name="file" /> <br /> <input type="submit" name="submit" value="Upload to Amazon S3" /> </form> </body> </html>
Post File using FormData in Node.js
In Node.js, use
form-data
package to post a file:const { createReadStream } = require("fs"); const FormData = require("form-data"); const form = new FormData(); Object.entries(fields).forEach(([field, value]) => { form.append(field, value); }); form.append("file", createReadStream("path/to/a/file")); form.submit(url, (err, res) => { //handle the response });