What is @aws-sdk/s3-presigned-post?
@aws-sdk/s3-presigned-post is a package that allows you to generate presigned POST URLs for Amazon S3. These URLs enable users to upload files directly to S3 without needing to expose AWS credentials or write server-side code to handle the uploads.
What are @aws-sdk/s3-presigned-post's main functionalities?
Generate Presigned POST URL
This feature allows you to generate a presigned POST URL for uploading files to an S3 bucket. The code sample demonstrates how to create a presigned POST URL with specific conditions, such as a content length range.
const { S3Client } = require('@aws-sdk/client-s3');
const { createPresignedPost } = require('@aws-sdk/s3-presigned-post');
const client = new S3Client({ region: 'us-west-2' });
const params = {
Bucket: 'example-bucket',
Key: 'example-object',
Expires: 60, // URL expiration time in seconds
Conditions: [
['content-length-range', 0, 1048576], // 1 MB limit
],
};
async function generatePresignedPost() {
try {
const data = await createPresignedPost(client, params);
console.log('Presigned POST URL:', data.url);
console.log('Fields:', data.fields);
} catch (err) {
console.error('Error generating presigned POST URL', err);
}
}
generatePresignedPost();
Other packages similar to @aws-sdk/s3-presigned-post
aws-sdk
The 'aws-sdk' package is the official AWS SDK for JavaScript. It provides a comprehensive set of tools for interacting with AWS services, including S3. While it also allows you to generate presigned URLs, it is a much larger package with broader functionality compared to @aws-sdk/s3-presigned-post, which is focused specifically on presigned POST URLs.
s3-upload-stream
The 's3-upload-stream' package is designed to facilitate streaming uploads to S3. It provides a writable stream that can be piped to, making it useful for handling large files or real-time data. Unlike @aws-sdk/s3-presigned-post, it does not generate presigned URLs but focuses on streaming data to S3.
@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,
});
The Bucket
, Key
and other values in Fields
must meet the conditions specified in Conditions
. The Key
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>
<form action="URL_VALUE" method="post" enctype="multipart/form-data">
<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) => {
});