【问题标题】:AWS S3 SDK V3 for Node.js - GetObjectCommand v/s getSignedUrl适用于 Node.js 的 AWS S3 开发工具包 V3 - GetObjectCommand v/s getSignedUrl
【发布时间】:2021-05-13 04:13:23
【问题描述】:

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

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

我也不确定在我的用例中是否应该使用 GetObjectCommandgetSignedUrl。就上下文而言,我使用 Express 来构建我的服务器。

我的问题 -

  1. 有没有比使用 SDK 更简单的方法来与我的应用程序的 S3 交互?更简单是指正确记录。
  2. 我是否查看了错误的文档?是否有其他资源可以让这更简单?
  3. 在哪些情况下会使用 getSignedUrl 而不是 GetObjectCommand 来读取并为 Web 应用程序呈现存储的文件?

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

【问题讨论】:

    标签: node.js amazon-web-services amazon-s3 aws-sdk aws-sdk-nodejs


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

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

    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();
    

    【讨论】:

    • 谢谢。 2 分 - 1. 我看过那些文档,但我认为它们不完整(?)。例如,他们没有提到 getSignedUrl 并且似乎只涵盖了最基本的操作。此外,他们也没有深入研究访问返回文件的内容。有了这些,我就能够记录响应。我找到了 [this answer] (github.com/aws/aws-sdk-js-v3/issues/1096#issuecomment-616743375),这可能让我可以继续进行,但我还没有尝试过。 2. 由于我正在渲染我的页面服务器端,我倾向于 getSignedUrl。我认为这是更好的方法是否正确?
    • 用代码示例更新了我的回复。是的,您可以使用 fs 根据您引用的示例读取或写入响应。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-28
    • 2021-10-02
    • 2011-11-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多