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

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

我正在构建一个网络应用程序,我需要让用户将文档上传到他们的帐户并阅读他们上传的所有文档。此外,我还希望允许用户上传个人资料照片。为了处理文件存储,我选择了 AWS S3。
但是,我在使用 SDK (v3) 时遇到了很多麻烦。请记住,我从未使用过以前的版本 (v2)。我通过 npm 安装了 2 个包,@aws-sdk/client-s3@aws-sdk/s3-request-presigner .我无法为我需要的所有功能找到合适的文档。 docs我遇到的不是完全适合初学者的,也没有详细解释所有功能。例如,在 GetObjectCommand 的情况下,我能够得到回应,但我不确定如何实际进入正文并使用内容。
我也不确定是否应该使用 GetObjectCommandgetSignedUrl对于我的用例。对于上下文,我使用 Express 来构建我的服务器。
我的问题——

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

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

    最佳答案

  • 参见问题 2 的回复。
  • https://docs.aws.amazon.com/sdk-for-javascript/v3/developer-guide/s3-example-creating-buckets.html - 文档可能对初学者更友好
  • 取决于您的用例。 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();
    

    关于node.js - 适用于 Node.js 的 AWS S3 SDK V3 - GetObjectCommand v/s getSignedUrl,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66120548/

    相关文章:

    javascript - Node 和 http.get 中的管道函数

    node.js - 如何在 node.js 中从 AWS Lambda 将原始 JSON 记录到 Cloudwatch?

    java - 仅使用实例角色从 Java 应用程序向 SES 发送邮件

    hadoop - HDFS是否在Hadoop的键值存储之上实现?怎么样?

    amazon-web-services - 如何通过网络限制S3存储桶访问

    json - 使用 JSON 数据运行 Hive 查询时出错?

    javascript - 与 NodeJS 中的 Array.reduce() 相反

    javascript - 如何在 Sails.js 中为自定义路由启用 CORS

    node.js - Jade 动态数据

    css - 为什么 elastic beanstalk 不为 django 管理站点呈现 css?