AWS Javascript SDK v3 中的 S3 getSignedUrl v2 等效项

xun*_*nux 9 amazon-s3 amazon-web-services node.js aws-sdk-js

我刚刚开始在我的应用程序上使用 aws-sdk 将文件上传到 S3,我正在争论是否使用 aws-sdk v2 还是 v3。

V2 是整个包,考虑到我只需要 s3 服务,而不是无数其他选项,它非常臃肿。然而,文档非常神秘,我很难让等效的 getSignedUrl 函数在 v3 中工作。

在 v2 中,我有这个代码来签署 url,它工作正常。我在服务器上使用express

import aws from 'aws-sdk';

const signS3URL = (req,res,next) => {
    const s3 = new aws.S3({region:'us-east-2'});
    const {fileName,fileType} = req.query;
    const s3Params = {
        Bucket : process.env.S3_BUCKET,
        Key : fileName,
        ContentType:fileType,
        Expires: 60,
    };

    s3.getSignedUrl('putObject',s3Params,(err,data)=>{
        if(err){
            next(err);
        }
        res.json(data);
    });
}
Run Code Online (Sandbox Code Playgroud)

现在我一直在阅读文档和示例,试图让 v3 等效工作,但我找不到任何如何使用它的工作示例。到目前为止我的设置方式如下

import {S3Client,PutObjectCommand} from '@aws-sdk/client-s3';
import {getSignedUrl} from '@aws-sdk/s3-request-presigner';

export const signS3URL = async(req,res,next) => {
    console.log('Sign')
    const {fileName,fileType} = req.query;
    const s3Params = {
        Bucket : process.env.S3_BUCKET,
        Key : fileName,
        ContentType:fileType,
        Expires: 60,
        // ACL: 'public-read'
    };

    const s3 = new S3Client()
    s3.config.region = 'us-east-2'
    const command = new PutObjectCommand(s3Params)
    console.log(command)


    await getSignedUrl(s3,command).then(signature =>{
        console.log(signature)
        res.json(signature)
    }).catch(e=>next(e))
}
Run Code Online (Sandbox Code Playgroud)

这段代码中存在一些错误,我可以识别的第一个错误是command使用PutObjectCommandSDK 提供的函数创建变量。该文档没有向我澄清我需要将其作为“输入”传递https://docs.aws.amazon.com/AWSJavaScriptSDK/v3/latest/clients/client-s3/interfaces/putobjectcommandinput.html

有使用 aws-sdk v3 经验的人知道如何做到这一点吗?

还有一个附带问题,我在哪里可以找到 v2 的 api 参考???因为我找到的只是 sdk 文档,上面写着“v3 现已可用”,而我似乎找不到 v2 的引用......

谢谢你的时间

GSS*_*ain 10

以下代码将为您提供 JSON 正文中的signedUrl,其密钥为signedUrl

const signS3URL = async (req, res, next) => {
    const { fileName, fileType } = req.query;
    const s3Params = {
        Bucket: process.env.S3_BUCKET,
        Key: fileName,
        ContentType: fileType,
        // ACL: 'bucket-owner-full-control'
    };
    const s3 = new S3Client({ region: 'us-east-2' })
    const command = new PutObjectCommand(s3Params);

    try {
        const signedUrl = await getSignedUrl(s3, command, { expiresIn: 60 });
        console.log(signedUrl);
        res.json({ signedUrl })
    } catch (err) {
        console.error(err);
        next(err);
    }
}
Run Code Online (Sandbox Code Playgroud)

保留 ,ACL就好像bucket-owner-full-control您希望拥有存储桶的 AWS 账户可以访问文件一样。

您可以从这里访问API Reference两个 JS SDK 版本

  • getSignedUrl 未定义,请使用有效的导入更新您的答案 (3认同)