适用于 Node.js 的 AWS S3 SDK V3 - GetObjectCommand v/s getSignedUrl

rag*_*hav 5 amazon-s3 amazon-web-services node.js aws-sdk aws-sdk-nodejs

我正在构建一个网络应用程序,我需要让用户将文档上传到他们的帐户并阅读他们上传的所有文档。此外,我还希望允许用户上传个人资料照片。为了处理文件存储,我选择了 AWS S3。

但是,我在使用 SDK (v3) 时遇到了很多麻烦。请记住,我从未使用过以前的版本 (v2)。我通过 npm 安装了 2 个包,@aws-sdk/client-s3@aws-sdk/s3-request-presigner 。我无法为我需要的所有功能找到合适的文档。我遇到的文档并不完全适合初学者,也没有详细解释所有功能。例如,在 的情况下GetObjectCommand,我能够得到响应,但我不确定如何实际进入正文并使用内容。

我也不确定是否应该使用GetObjectCommandgetSignedUrl用于我的用例。对于上下文,我使用 Express 来构建我的服务器。

我的问题——

  1. 有没有比使用 SDK 更简单的方法来与 S3 进行交互?更容易我只是指正确记录。
  2. 我在看错误的文档吗?是否有其他资源可以使这更简单?
  3. 在什么情况下,人们会使用getSignedUrloverGetObjectCommand来读取并呈现 Web 应用程序的存储文件?

我将非常感谢任何和所有帮助。

bmu*_*mur 13

  1. 参见问题 2 的答复。
  2. https://docs.aws.amazon.com/sdk-for-javascript/v3/developer-guide/s3-example-creating-buckets.html - 该文档可能对初学者更友好
  3. 取决于您的用例。GetObjectCommand 是最简单的方法,但您很可能会遇到前置问题。预签名 URL 是您可以提供给用户以授予对特定 S3 对象的临时访问权限的 URL。

这是使用 GetObjectCommand 的代码getSignedUrl(我还更新了文档。)

const {
    S3,
    CreateBucketCommand,
    PutObjectCommand,
    GetObjectCommand,
    DeleteObjectCommand,
    DeleteBucketCommand,
} = require("@aws-sdk/client-s3");
const { getSignedUrl  } = require("@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.
const params = {
    Bucket: `test-bucket-${Math.ceil(Math.random() * 10 ** 10)}`,
    Key: `test-object-${Math.ceil(Math.random() * 10 ** 10)}`,
    Body: "BODY",
    Region: "REGION"
};

// Create an Amazon S3 client object.
const s3Client = new S3({ region: params.Region });

const run = async () => {
    // Create an Amazon S3 bucket.
    try {
        console.log(`Creating bucket ${params.Bucket}`);
        const data = await s3Client.send(
            new CreateBucketCommand({ Bucket: params.Bucket })
        );
        console.log(`Waiting for "${params.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 "${params.Key}" in bucket`);
        const data = await s3Client.send(
            new PutObjectCommand({
                Bucket: params.Bucket,
                Key: params.Key,
                Body: params.Body,
            })
        );
    } catch (err) {
        console.log("Error putting object", err);
    }
    // Create a presigned URL.
    try {
        // Create the command.
        const command = new GetObjectCommand(params);

        // Create the presigned URL.
        const signedUrl = await getSignedUrl(s3Client, command, {
            expiresIn: 3600,
        });
        console.log(
            `\nGetting "${params.Key}" using signedUrl with body "${params.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);
    }
 
};
run();
Run Code Online (Sandbox Code Playgroud)

  • 谢谢。2 点 - 1.我看到了那些文档,但我认为它们不完整(?)。例如,他们没有提到 getSignedUrl 并且似乎只涵盖了最基本的操作。此外,他们也没有深入研究返回文件的内容。有了这些,我就能够记录响应了。我发现[这个答案](https://github.com/aws/aws-sdk-js-v3/issues/1096#issuecomment-616743375)这可能允许我进一步进行,但我还没有尝试。2. 由于我在服务器端渲染页面,因此我倾向于 getSignedUrl。我认为这是更好的方法吗? (2认同)