创建和使用 Amazon S3 存储桶 - Amazon SDK for JavaScript
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅中国的 Amazon Web Services 服务入门

Amazon SDK for JavaScriptV3 API 参考指南详细描述了Amazon SDK for JavaScript版本 3 (V3) 的所有 API 操作。

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

创建和使用 Amazon S3 存储桶


                        JavaScript code example that applies to Node.js execution

此 Node.js 代码示例演示:

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

  • 如何创建 Amazon S3 存储桶。

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

场场场场景

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

还有一个使用以下 node-fetch 方法生成预签名 URL 的示例:

先场景

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

重要

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

显示 Amazon S3 存储桶的列表

创建一个libs目录,然后使用该文件名创建 Node.js 模块s3Client.js。将以下代码复制并粘贴到其中,这将创建 Amazon S3 客户端对象。将 RE G ION 替换为您的Amazon区域。

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

此代码可在此处获得 GitHub

创建文件名为 s3_listbuckets.js 的 Node.js 模块。确保按照前面所示配置 SDK,包括安装所需的客户端和软件包。要访问亚马逊简单存储服务,请创建一个S3客户端服务对象。调用 Amazon S3 客户端服务对象的listBuckets方法来检索您的存储桶列表。回调函数的 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 客户端对象。将 RE G ION 替换为您的Amazon区域。

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

此代码可在此处获得 GitHub

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

添加一个变量来保存用于调用 Amazon S3 客户端服务对象createBucket方法的参数,包括新创建的存储桶的名称。在 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 客户端对象。将 RE G ION 替换为您的Amazon区域。

// Create service client module using ES6 syntax. import { S3Client } from "@aws-sdk/client-s3"; // Set the AWS Region. const REGION = "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 模块。确保按照前面所示配置 SDK,包括安装所需的客户端和软件包。

使用调用 Amazon S3 服务对象的PutObjectCommand方法所需的参数创建变量。在 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 客户端对象。将 RE G ION 替换为您的Amazon区域。

// Create service client module using ES6 syntax. import { S3Client } from "@aws-sdk/client-s3"; // Set the AWS Region. const REGION = "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 模块。确保按照前面所示配置 SDK,包括安装所需的客户端和软件包。

使用调用 Amazon S3 服务对象的PutObjectCommand方法所需的参数创建变量。在 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 客户端对象。将 RE G ION 替换为您的Amazon区域。

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

此代码可在此处获得 GitHub

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

使用调用 Amazon S3 服务对象的GetObjectCommand方法所需的参数创建变量。在 Bucket 参数中提供目标存储桶的名称。Key参数设置为文件名,您可以使用 Node.jspath 模块获得该文件名。

// 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 { // Get the object} from the Amazon S3 bucket. It is returned as a ReadableStream. const data = await s3Client.send(new GetObjectCommand(bucketParams)); // Convert the ReadableStream to a string. return await data.Body.transformToString(); } 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 客户端对象。将 RE G ION 替换为您的Amazon区域。

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

此代码可在此处获得 GitHub

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

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

// 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 客户端对象。将 RE G ION 替换为您的Amazon区域。

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

此代码可在此处获得 GitHub

创建文件名为 s3_list1000plusobjects.js 的 Node.js 模块。确保按照前面所示配置 SDK,包括安装所需的客户端和软件包。创建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 客户端对象。将 RE G ION 替换为您的Amazon区域。

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

此代码可在此处获得 GitHub

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

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

// 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 客户端对象。将 RE G ION 替换为您的Amazon区域。

// Create service client module using ES6 syntax. import { S3Client } from "@aws-sdk/client-s3"; // Set the AWS Region. const REGION = "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 模块。确保按照前面所示配置 SDK,包括安装所需的客户端和软件包。

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

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

有关创建预签名 URL 的更多信息,请参阅https://docs.amazonaws.cn/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 客户端对象。将 RE G ION 替换为您的Amazon区域。

// Create service client module using ES6 syntax. import { S3Client } from "@aws-sdk/client-s3"; // Set the AWS Region. const REGION = "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 模块。确保按照前面所示配置 SDK,包括安装所需的客户端和软件包。

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

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

有关创建预签名 URL 的更多信息,请参阅https://docs.amazonaws.cn/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