有什么方法可以生成没有任何到期日期的预签名 URL? 我正在开发一个电子邮件应用程序,我的附件将保存在 S3 中。 另请告诉我通过 JavaScript SDK 下载附件的最佳方式是什么。
我正在使用下面的代码
var params = {Bucket: 'bucket', Key: 'key', Expires: 60};
var url = s3.getSignedUrl('getObject', params);
console.log('The URL is', url);
预签名 URL 的最长过期时间为自创建之日起一周。所以没有办法让预签名的 url 没有过期时间。
这取决于您如何生成 S3 预签名 URL。具体来说,您使用哪个签名版本以及您使用什么类型的 IAM 凭证。
可用于创建预签名 URL 的凭据包括:
将附件上传到 S3 时,您会生成一个带有文件名的令牌,即 JWT 令牌。
。 如果下载只能在您的应用程序内完成,并且链接无法在应用程序外部共享或使用,那么您可以跳过通过 API 网关返回文件。授权将保持如上所述。但 Lambda 函数不返回文件,而是返回一个预签名的 URL,有效期可能为 10 分钟。您的应用程序使用该 URL 进行另一个请求并从 S3 接收文件。
至于你问题的第二部分如何下载文件,简单
fetch(preSignedS3URL)
就足够了。
这里是使用
javascript
的示例,但您可以根据自己的需要进行调整:
const express = require("express");
const { GetObjectCommand, S3Client } = require("@aws-sdk/client-s3");
const app = express();
const port = 5000;
const client = new S3Client({});
app.get("/", (req, res) => {
res.send("Hello World!");
});
app.get("*", async function (req, res, next) {
console.log(req.url);
if (req.url.startsWith("/photos")) {
const command = new GetObjectCommand({
Bucket: "test-bucket",
Key: req.url.slice(7),
});
try {
const response = await client.send(command);
const str = await response.Body.transformToByteArray();
res.writeHead(200, { "Content-Type": "image/jpeg" });
res.write(str, "binary");
res.end(null, "binary");
} catch (err) {
console.error(err);
}
} else {
return next();
}
});
app.listen(port, () => {
console.log(`Example app listening on port ${port}`);
});
这样,您就可以在电子邮件中使用了
https://your-production-url/photos/whatever-your-object-key-is.jpg
,没有任何问题。
const image = image.split('&Expires')[0]
这是我使用的解决方法之一