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

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

这些区域有:Amazon SDK for JavaScriptV3 API 参考指南详细描述了Amazon 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 模块使用开发工具包,通过 Amazon S3 客户端类的以下方法从 Amazon S3 存储桶获取信息并上传文件到其中:

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

先决条件任

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

重要

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

显示 Amazon S3 存储桶列表

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

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 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领域和您的Amazonregion region。

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 { s3 } from "./libs/s3Client.js"; // Set the bucket parameters const bucketParams = { Bucket: "BUCKET_NAME" }; // Create the Amazon S3 bucket. const run = async () => { try { const data = await s3.send(new CreateBucketCommand(bucketParams)); console.log("Success", data.Location); return data; } 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领域和您的Amazonregion region。

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 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 specified Amazon 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领域和您的Amazonregion region。

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 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领域和您的Amazonregion region。

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 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领域和您的Amazonregion region。

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 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领域和您的Amazonregion region。

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 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 we will base our while loop on let truncated = true; // Declare a variable that we will assign the key of the last element in the response to 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 final element in the response to our variable 'pageMarker' if (truncated) { pageMarker = response.Contents.slice(-1)[0].Key; // Assign value of pageMarker to bucketParams so that the next iteration will start} from the new pageMarker. bucketParams.Marker = pageMarker; } // At end of the list, response.truncated is false and our 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领域和您的Amazonregion region。

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 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领域和您的Amazonregion region。

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.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 Amazon S3 service client module. import { getSignedUrl } from "@aws-sdk/s3-request-presigner"; import fetch from "node-fetch"; // Set parameters // Create a random names 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 Amazon 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 the command. 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); console.log( `\nResponse returned by signed URL: ${await response.text()}\n` ); return response; } 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 Amazon S3 bucket. console.log(`\nDeleting bucket ${bucketParams.Bucket}`); await s3.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领域和您的Amazonregion region。

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.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 Amazon S3 service client module. import { getSignedUrl } from "@aws-sdk/s3-request-presigner"; const fetch = require("node-fetch"); // Set parameters // Create random names 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 () => { // Create an Amazon 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 Amazon 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 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 上的此处找到。