创建和使用 Amazon S3 存储桶 - AWS SDK for JavaScript

帮助我们改进AWS SDK for JavaScript版本 3 (V3) 文档,方法是使用反馈链接,或者在上创建议题或拉取请求GitHub.

这些区域有:AWS SDK for JavaScriptV3 API 参考指南详细描述了所有的 API 操作AWS SDK for JavaScript版本 3 (V3)。

本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。

创建和使用 Amazon S3 存储桶


                        JavaScript code example that applies to Node.js execution

此 Node.js 代码示例演示:

  • 如何获取和显示账户中 Amazon S3 存储桶的列表。

  • 如何创建 Amazon S3 存储桶。

  • 如何将对象上传到指定的存储桶。

场景

在此示例中,使用了一系列 Node.js 模块来获取现有 Amazon S3 存储桶的列表,创建存储桶并将文件上传到指定存储桶。这些 Node.js 模块使用 SDK JavaScript 使用 Amazon S3 客户端类的以下方法来获取信息并将文件上传到 Amazon S3 存储桶:

还有一个示例使用以下方法节点获取生成预签名 URL:

先决条件任

要设置和运行此示例,您必须先完成以下任务:

重要

这些示例演示了如何使用 ECMASCRIPT6 (ES6) 导入/导出客户端服务对象和命令。

显示 Amazon S3 存储桶列表

创建libs创建文件名为的 Node.js 模块s3Client.js. 将以下代码复制并粘贴到其中,这将创建 Amazon S3 客户端对象。Replace领域使用您的AWSregion 区域。

// Create service client module using ES6 syntax. import { S3Client } from "@aws-sdk/client-s3"; // Set the AWS Region. const REGION = "REGION"; //e.g. "us-east-1" // Create an Amazon S3 service client object. const s3Client = new S3Client({ region: REGION }); export { s3Client };

这个代码是可用的GitHub 上的.

创建文件名为 s3_listbuckets.js 的 Node.js 模块。确保按前面所示配置开发工具包,包括安装所需的客户端和软件包。要访问 Amazon Simple Storage Service,请创建S3客户端服务对象。调用listBucketsAmazon S3 客户端服务对象的方法来检索存储桶的列表。回调函数的 data 参数具有 Buckets 属性,包含用于表示存储桶的映射数组。通过登录到控制台显示存储桶列表。

// Import required AWS SDK clients and commands for Node.js. import { ListBucketsCommand } from "@aws-sdk/client-s3"; import { s3Client } from "./libs/s3Client.js"; // Helper function that creates an Amazon S3 service client module. export const run = async () => { try { const data = await s3Client.send(new ListBucketsCommand({})); console.log("Success", data.Buckets); return data; // For unit tests. } catch (err) { console.log("Error", err); } }; run();

要运行示例,请在命令提示符处输入以下内容。

node s3_listbuckets.js

此示例代码可在 GitHub 上的此处找到。

创建 Amazon S3 存储桶

创建libs创建文件名为的 Node.js 模块s3Client.js. 将以下代码复制并粘贴到其中,这将创建 Amazon S3 客户端对象。Replace领域使用您的AWSregion 区域。

// Create service client module using ES6 syntax. import { S3Client } from "@aws-sdk/client-s3"; // Set the AWS Region. const REGION = "REGION"; //e.g. "us-east-1" // Create an Amazon S3 service client object. const s3Client = new S3Client({ region: REGION }); export { s3Client };

这个代码是可用的GitHub 上的.

创建文件名为 s3_createbucket.js 的 Node.js 模块。确保按前面所示配置开发工具包,包括安装所需的客户端和软件包。创建S3客户端服务对象。模块将获取单个命令行参数来指定新存储桶的名称。

添加变量来保存用于调用createBucketAmazon S3 客户端服务对象的方法,其中包括新创建存储桶的名称。在 Amazon S3 成功创建新存储桶之后,回调函数将新存储桶的位置记录到控制台。

// Get service clients module and commands using ES6 syntax. import { CreateBucketCommand } from "@aws-sdk/client-s3"; import { s3Client } from "./libs/s3Client.js"; // Set the bucket parameters. export const bucketParams = { Bucket: "BUCKET_NAME" }; // Create the Amazon S3 bucket. export const run = async () => { try { const data = await s3Client.send(new CreateBucketCommand(bucketParams)); console.log("Success", data); return data; // For unit tests. } catch (err) { console.log("Error", err); } }; run();

要运行示例,请在命令提示符处输入以下内容。

node s3_createbucket.js

此示例代码可在 GitHub 上的此处找到。

将文件上传到 Amazon S3 存储桶

本节介绍如何:

  • 创建新对象并将其上传到 Amazon S3 存储桶。

  • 将现有对象上传到 Amazon S3 存储桶。

创建对象并将其上传到 Amazon S3 存储桶

创建libs创建文件名为的 Node.js 模块s3Client.js. 将以下代码复制并粘贴到其中,这将创建 Amazon S3 客户端对象。Replace领域使用您的AWSregion 区域。

// Create service client module using ES6 syntax. import { S3Client } from "@aws-sdk/client-s3"; // Set the AWS Region. const REGION = "REGION"; //e.g. "us-east-1" // Create an Amazon S3 service client object. const s3Client = new S3Client({ region: REGION }); export { s3Client };

这个代码是可用的GitHub 上的.

创建文件名为 s3_create_and_upload_object.js 的 Node.js 模块。确保按前面所示配置开发工具包,包括安装所需的客户端和软件包。

创建调用所需的参数创建变量PutObjectCommandAmazon S3 服务对象的方法。在 Bucket 参数中提供目标存储桶的名称。对于Key参数中,提供对象的名称。

注意

要创建对象的目录,请使用格式directoryY_NAME/OBJECT_NAME.

// Import required AWS SDK clients and commands for Node.js. import { PutObjectCommand } from "@aws-sdk/client-s3"; import { s3Client } from "./libs/s3Client.js"; // Helper function that creates an Amazon S3 service client module. // Set the parameters. export const bucketParams = { Bucket: "BUCKET_NAME", // Specify the name of the new object. For example, 'index.html'. // To create a directory for the object, use '/'. For example, 'myApp/package.json'. Key: "OBJECT_NAME", // Content of the new object. Body: "BODY", }; // Create and upload the object to the S3 bucket. export const run = async () => { try { const data = await s3Client.send(new PutObjectCommand(bucketParams)); return data; // For unit tests. console.log( "Successfully uploaded object: " + bucketParams.Bucket + "/" + bucketParams.Key ); } catch (err) { console.log("Error", err); } }; run();

要运行示例,请在命令提示符处输入以下内容。

node s3_create_and_upload_object.js

此示例代码可在 GitHub 上的此处找到。

将现有对象上传到 Amazon S3 存储桶

创建libs创建文件名为的 Node.js 模块s3Client.js. 将以下代码复制并粘贴到其中,这将创建 Amazon S3 客户端对象。Replace领域使用您的AWSregion 区域。

// Create service client module using ES6 syntax. import { S3Client } from "@aws-sdk/client-s3"; // Set the AWS Region. const REGION = "REGION"; //e.g. "us-east-1" // Create an Amazon S3 service client object. const s3Client = new S3Client({ region: REGION }); export { s3Client };

这个代码是可用的GitHub 上的.

创建文件名为 s3_upload_object.js 的 Node.js 模块。确保按前面所示配置开发工具包,包括安装所需的客户端和软件包。

创建调用所需的参数创建变量PutObjectCommandAmazon S3 服务对象的方法。在 Bucket 参数中提供目标存储桶的名称。提供现有对象的名称及其路径。Key 参数设置为所选文件的名称,您可使用 Node.js path 模块来获取该名称。

// Import required AWS SDK clients and commands for Node.js. import { PutObjectCommand } from "@aws-sdk/client-s3"; import { s3Client } from "./libs/s3Client.js"; // Helper function that creates an Amazon S3 service client module. import {path} from "path"; import {fs} from "fs"; const file = "OBJECT_PATH_AND_NAME"; // Path to and name of object. For example '../myFiles/index.js'. const fileStream = fs.createReadStream(file); // Set the parameters export const uploadParams = { Bucket: "BUCKET_NAME", // Add the required 'Key' parameter using the 'path' module. Key: path.basename(file), // Add the required 'Body' parameter Body: fileStream, }; // Upload file to specified bucket. export const run = async () => { try { const data = await s3Client.send(new PutObjectCommand(uploadParams)); console.log("Success", data); return data; // For unit tests. } catch (err) { console.log("Error", err); } }; run();

要运行示例,请在命令提示符处输入以下内容。

node s3_upload_object.js

此示例代码可在 GitHub 上的此处找到。

从 Amazon S3 存储桶获取文件

创建libs创建文件名为的 Node.js 模块s3Client.js. 将以下代码复制并粘贴到其中,这将创建 Amazon S3 客户端对象。Replace领域使用您的AWSregion 区域。

// Create service client module using ES6 syntax. import { S3Client } from "@aws-sdk/client-s3"; // Set the AWS Region. const REGION = "REGION"; //e.g. "us-east-1" // Create an Amazon S3 service client object. const s3Client = new S3Client({ region: REGION }); export { s3Client };

这个代码是可用的GitHub 上的这里.

创建文件名为 s3_getobject.js 的 Node.js 模块。确保按前面所示配置开发工具包,包括安装所需的客户端和软件包。此模块将获取两个命令行参数,第一个用于指定目标存储桶,第二个用于指定要获取的文件。

创建调用所需的参数创建变量GetObjectCommandAmazon S3 服务对象的方法。在 Bucket 参数中提供目标存储桶的名称。这些区域有:Key参数设置为文件的名称,您可使用 Node.js 获取该名称。path模块。

// Import required AWS SDK clients and commands for Node.js. import { GetObjectCommand } from "@aws-sdk/client-s3"; import { s3Client } from "./libs/s3Client.js"; // Helper function that creates an Amazon S3 service client module. export const bucketParams = { Bucket: "BUCKET_NAME", Key: "KEY", }; export const run = async () => { try { // Create a helper function to convert a ReadableStream to a string. const streamToString = (stream) => new Promise((resolve, reject) => { const chunks = []; stream.on("data", (chunk) => chunks.push(chunk)); stream.on("error", reject); stream.on("end", () => resolve(Buffer.concat(chunks).toString("utf8"))); }); // Get the object} from the Amazon S3 bucket. It is returned as a ReadableStream. const data = await s3Client.send(new GetObjectCommand(bucketParams)); return data; // For unit tests. // Convert the ReadableStream to a string. const bodyContents = await streamToString(data.Body); console.log(bodyContents); return bodyContents; } catch (err) { console.log("Error", err); } }; run();

要运行示例,请在命令提示符处输入以下内容。

node s3_upload.js

此示例代码可在 GitHub 上的此处找到。

列出 Amazon S3 存储桶中的对象

此示例列出 Amazon S3 存储桶中最多 1000 个对象。

注意

要列出 1000 个以上的对象,请参阅列出 Amazon S3 存储桶中的 1000 个对象.

创建libs创建文件名为的 Node.js 模块s3Client.js. 将以下代码复制并粘贴到其中,这将创建 Amazon S3 客户端对象。Replace领域使用您的AWSregion 区域。

// Create service client module using ES6 syntax. import { S3Client } from "@aws-sdk/client-s3"; // Set the AWS Region. const REGION = "REGION"; //e.g. "us-east-1" // Create an Amazon S3 service client object. const s3Client = new S3Client({ region: REGION }); export { s3Client };

这个代码是可用的GitHub 上的.

创建文件名为 s3_listobjects.js 的 Node.js 模块。确保按前面所示配置开发工具包,包括安装所需的客户端和软件包。

添加变量来保存用于调用ListObjectsCommnadAmazon S3 服务对象的方法,包括要读取的存储桶的名称。回调函数记录对象(文件)列表或失败消息。

// Import required AWS SDK clients and commands for Node.js. import { ListObjectsCommand } from "@aws-sdk/client-s3"; import { s3Client } from "./libs/s3Client.js"; // Helper function that creates an Amazon S3 service client module. // Create the parameters for the bucket export const bucketParams = { Bucket: "BUCKET_NAME" }; export const run = async () => { try { const data = await s3Client.send(new ListObjectsCommand(bucketParams)); console.log("Success", data); return data; // For unit tests. } catch (err) { console.log("Error", err); } }; run();

要运行示例,请在命令提示符处输入以下内容。

node s3_listobjects.js

此示例代码可在 GitHub 上的此处找到。

列出 Amazon S3 存储桶中的 1000 个对象

此示例列出 Amazon S3 存储桶中的 1000 多个对象。

创建libs创建文件名为的 Node.js 模块s3Client.js. 将以下代码复制并粘贴到其中,这将创建 Amazon S3 客户端对象。Replace领域使用您的AWSregion 区域。

// Create service client module using ES6 syntax. import { S3Client } from "@aws-sdk/client-s3"; // Set the AWS Region. const REGION = "REGION"; //e.g. "us-east-1" // Create an Amazon S3 service client object. const s3Client = new S3Client({ region: REGION }); export { s3Client };

这个代码是可用的GitHub 上的这里.

创建文件名为 s3_list1000plusobjects.js 的 Node.js 模块。确保按前面所示配置开发工具包,包括安装所需的客户端和软件包。创建S3客户端服务对象。

使用 while 循环列出每 1000 个项目,直到所有商品都被列出。然后声明truncated作为价值为的旗帜true,还有一个 while 循环,一次打印 1,000 个项目,直到旗帜出现false.

// Import required AWS SDK clients and commands for Node.js. import { ListObjectsCommand } from "@aws-sdk/client-s3"; import { s3Client } from "./libs/s3Client.js"; // Helper function that creates an Amazon S3 service client module. // Create the parameters for the bucket export const bucketParams = { Bucket: "BUCKET_NAME" }; export async function run() { // Declare truncated as a flag that the while loop is based on. let truncated = true; // Declare a variable to which the key of the last element is assigned to in the response. let pageMarker; // while loop that runs until 'response.truncated' is false. while (truncated) { try { const response = await s3Client.send(new ListObjectsCommand(bucketParams)); // return response; //For unit tests response.Contents.forEach((item) => { console.log(item.Key); }); // Log the key of every item in the response to standard output. truncated = response.IsTruncated; // If truncated is true, assign the key of the last element in the response to the pageMarker variable. if (truncated) { pageMarker = response.Contents.slice(-1)[0].Key; // Assign the pageMarker value to bucketParams so that the next iteration starts from the new pageMarker. bucketParams.Marker = pageMarker; } // At end of the list, response.truncated is false, and the function exits the while loop. } catch (err) { console.log("Error", err); truncated = false; } } } run();

要运行示例,请在命令提示符处输入以下内容。

node s3_list1000plusobjects.js

此示例代码可在 GitHub 上的此处找到。

删除 Amazon S3 存储桶

创建libs创建文件名为的 Node.js 模块s3Client.js. 将以下代码复制并粘贴到其中,这将创建 Amazon S3 客户端对象。Replace领域使用您的AWSregion 区域。

// Create service client module using ES6 syntax. import { S3Client } from "@aws-sdk/client-s3"; // Set the AWS Region. const REGION = "REGION"; //e.g. "us-east-1" // Create an Amazon S3 service client object. const s3Client = new S3Client({ region: REGION }); export { s3Client };

这个代码是可用的GitHub 上的这里.

创建文件名为 s3_deletebucket.js 的 Node.js 模块。确保按前面所示配置开发工具包,包括安装所需的客户端和软件包。

添加变量来保存用于调用deleteBucketAmazon S3 服务对象的方法,包括要删除的存储桶的名称。存储桶必须为空才能将其删除。回调函数记录成功或失败消息。

// Import required AWS SDK clients and commands for Node.js. import { DeleteBucketCommand } from "@aws-sdk/client-s3"; import { s3Client } from "./libs/s3Client.js"; // Helper function that creates an Amazon S3 service client module. // Set the bucket parameters export const bucketParams = { Bucket: "BUCKET_NAME" }; export const run = async () => { try { const data = await s3Client.send(new DeleteBucketCommand(bucketParams)); return data; // For unit tests. console.log("Success - bucket deleted"); } catch (err) { console.log("Error", err); } }; // Invoke run() so these examples run out of the box. run();

要运行示例,请在命令提示符处输入以下内容。

node s3_deletebucket.js

此示例代码可在 GitHub 上的此处找到。

创建预签名 URL

本节演示了如何创建预签名 URL 以获取和放入 Amazon S3 存储桶中的对象。

创建预签名 URL 以将对象上传到 Amazon S3 存储桶

创建libs创建文件名为的 Node.js 模块s3Client.js. 将以下代码复制并粘贴到其中,这将创建 Amazon S3 客户端对象。Replace领域使用您的AWSregion 区域。

// Create service client module using ES6 syntax. import { S3Client } from "@aws-sdk/client-s3"; // Set the AWS Region. const REGION = "REGION"; //e.g. "us-east-1" // Create an Amazon S3 service client object. const s3Client = new S3Client({ region: REGION }); export { s3Client };

这个代码是可用的GitHub 上的这里.

创建文件名为 s3_presignedURL_v3.js 的 Node.js 模块。确保按前面所示配置开发工具包,包括安装所需的客户端和软件包。

创建一个函数,用于创建存储桶和要上传的对象,创建一个预签名的 URL 来上传对象,然后上传对象。在此示例中,自动删除对象和存储桶,以确保您不会产生任何不必要的费用。

创建调用所需的参数创建变量PutObjectCommandAmazon S3 服务对象的命令。在此示例中,存储桶名称、文件名或密钥、正文和到期时间已预填充。

有关创建预签名 URL 的更多信息,请参阅。https://docs.aws.amazon.com/AmazonS3/latest/dev/PresignedUrlUploadObject.html.

// Import the required AWS SDK clients and commands for Node.js import { CreateBucketCommand, DeleteObjectCommand, PutObjectCommand, DeleteBucketCommand } from "@aws-sdk/client-s3"; import { s3Client } from "./libs/s3Client.js"; // Helper function that creates an Amazon S3 service client module. import { getSignedUrl } from "@aws-sdk/s3-request-presigner"; import fetch from "node-fetch"; // Set parameters // Create a random name for the Amazon Simple Storage Service (Amazon S3) bucket and key export const bucketParams = { Bucket: `test-bucket-${Math.ceil(Math.random() * 10 ** 10)}`, Key: `test-object-${Math.ceil(Math.random() * 10 ** 10)}`, Body: "BODY" }; export const run = async () => { try { // Create an S3 bucket. console.log(`Creating bucket ${bucketParams.Bucket}`); await s3Client.send(new CreateBucketCommand({ Bucket: bucketParams.Bucket })); console.log(`Waiting for "${bucketParams.Bucket}" bucket creation...`); } catch (err) { console.log("Error creating bucket", err); } try { // Create a command to put the object in the S3 bucket. const command = new PutObjectCommand(bucketParams); // Create the presigned URL. const signedUrl = await getSignedUrl(s3Client, command, { expiresIn: 3600, }); console.log( `\nPutting "${bucketParams.Key}" using signedUrl with body "${bucketParams.Body}" in v3` ); console.log(signedUrl); const response = await fetch(signedUrl, {method: 'PUT', body: bucketParams.Body}); console.log( `\nResponse returned by signed URL: ${await response.text()}\n` ); } catch (err) { console.log("Error creating presigned URL", err); } try { // Delete the object. console.log(`\nDeleting object "${bucketParams.Key}"} from bucket`); await s3Client.send( new DeleteObjectCommand({ Bucket: bucketParams.Bucket, Key: bucketParams.Key }) ); } catch (err) { console.log("Error deleting object", err); } try { // Delete the S3 bucket. console.log(`\nDeleting bucket ${bucketParams.Bucket}`); await s3Client.send( new DeleteBucketCommand({ Bucket: bucketParams.Bucket }) ); } catch (err) { console.log("Error deleting bucket", err); } }; run();

要运行示例,请在命令行中键入以下内容。

node s3_put_presignedURL_v3.js

此示例代码可在 GitHub 上的此处找到。

创建预签名 URL 以从 Amazon S3 存储桶获取对象

创建libs创建文件名为的 Node.js 模块s3Client.js. 将以下代码复制并粘贴到其中,这将创建 Amazon S3 客户端对象。Replace领域使用您的AWSregion 区域。

// Create service client module using ES6 syntax. import { S3Client } from "@aws-sdk/client-s3"; // Set the AWS Region. const REGION = "REGION"; //e.g. "us-east-1" // Create an Amazon S3 service client object. const s3Client = new S3Client({ region: REGION }); export { s3Client };

这个代码是可用的GitHub 上的这里.

创建文件名为 s3_get_presignedURL_v3.js 的 Node.js 模块。确保按前面所示配置开发工具包,包括安装所需的客户端和软件包。

创建一个用于创建存储桶并上传数据元的函数,然后创建一个预签名 URL 以从存储桶中获取对象。在此示例中,自动删除对象和存储桶,以确保您不会产生任何不必要的费用。

创建调用所需的参数创建变量GetObjectCommandAmazon S3 服务对象的命令。在此示例中,存储桶名称、文件名或密钥、正文和到期时间已预填充。

有关创建预签名 URL 的更多信息,请参阅。https://docs.aws.amazon.com/AmazonS3/latest/dev/PresignedUrlUploadObject.html.

// Import the required AWS SDK clients and commands for Node.js import { CreateBucketCommand, PutObjectCommand, GetObjectCommand, DeleteObjectCommand, DeleteBucketCommand } from "@aws-sdk/client-s3"; import { s3Client } from "./libs/s3Client.js"; // Helper function that creates an Amazon S3 service client module. import { getSignedUrl } from "@aws-sdk/s3-request-presigner"; const fetch = require("node-fetch"); // Set parameters // Create a random names for the S3 bucket and key. export const bucketParams = { Bucket: `test-bucket-${Math.ceil(Math.random() * 10 ** 10)}`, Key: `test-object-${Math.ceil(Math.random() * 10 ** 10)}`, Body: "BODY" }; export const run = async () => { // Create an S3 bucket. try { console.log(`Creating bucket ${bucketParams.Bucket}`); const data = await s3Client.send( new CreateBucketCommand({ Bucket: bucketParams.Bucket }) ); return data; // For unit tests. console.log(`Waiting for "${bucketParams.Bucket}" bucket creation...\n`); } catch (err) { console.log("Error creating bucket", err); } // Put the object in the S3 bucket. try { console.log(`Putting object "${bucketParams.Key}" in bucket`); const data = await s3Client.send( new PutObjectCommand({ Bucket: bucketParams.Bucket, Key: bucketParams.Key, Body: bucketParams.Body, }) ); return data; // For unit tests. } catch (err) { console.log("Error putting object", err); } // Create a presigned URL. try { // Create the command. const command = new GetObjectCommand(bucketParams); // Create the presigned URL. const signedUrl = await getSignedUrl(s3Client, command, { expiresIn: 3600, }); console.log( `\nGetting "${bucketParams.Key}" using signedUrl with body "${bucketParams.Body}" in v3` ); console.log(signedUrl); const response = await fetch(signedUrl); console.log( `\nResponse returned by signed URL: ${await response.text()}\n` ); } catch (err) { console.log("Error creating presigned URL", err); } // Delete the object. try { console.log(`\nDeleting object "${bucketParams.Key}"} from bucket`); const data = await s3Client.send( new DeleteObjectCommand({ Bucket: bucketParams.Bucket, Key: bucketParams.Key }) ); return data; // For unit tests. } catch (err) { console.log("Error deleting object", err); } // Delete the S3 bucket. try { console.log(`\nDeleting bucket ${bucketParams.Bucket}`); const data = await s3Client.send( new DeleteBucketCommand({ Bucket: bucketParams.Bucket, Key: bucketParams.Key }) ); return data; // For unit tests. } catch (err) { console.log("Error deleting object", err); } }; run();

要运行示例,请在命令行中键入以下内容。

node s3_get_presignedURL_v3.js

此示例代码可在 GitHub 上的此处找到。