在ajax
上运行良好,但在服务器上运行正常。返回的所有网址都已已过期。
localhost
在<Error>
<Code>AccessDenied</Code>
<Message>Request has expired</Message>
<Expires>2016-04-26T09:44:22Z</Expires><ServerTime>2016-04-26T11:34:36Z</ServerTime><RequestId>33AF4E321F37ADA6</RequestId><HostId>+AXA3itXG9aKlt+EQkYxTHJCsxkEkymj+o2COPYo4+v26Vaxx17j/agh+hCq5NoHNzvJp2GI8Y=</HostId>
</Error>
上,为同一对象生成的URL在localhost
参数中有所不同,但在服务器上则不同。为服务器上的同一对象返回相同的URL(expires
param每次都相同)。
服务器是Amazon EC2。凭据保存在expires
和服务器
/.aws/credentials
文件中
模型中的代码
localhost
在S3上编辑了CORS配置
var AWS = require('aws-sdk');
var s3 = new AWS.S3();
exports.download = function (req, res) {
var fileName = req.params.name;
var key = req.user._id + '/' + fileName;
var params = { Bucket: 'myBucket', Key: key };
s3.getSignedUrl('getObject', params, function (err, url) {
if (err) {
console.log('Getting Signed URL', err);
res.send(err);
} else {
console.log('Getting Signed URL', url);
res.send(url);
}
});
};
答案 0 :(得分:1)
...
// here you need to provide signed URL expiration time as the 3rd parameter
var params = { Bucket: 'myBucket', Key: key , Expires: <expire time>};
s3.getSignedUrl('getObject', params, function (err, url) {
...
答案 1 :(得分:0)
可能不适用于这个特定问题,但我会添加这个,以防有人像我在尝试解决我的问题时一样遇到这个问题。我遇到了同样的签名 URL 过期问题,因为我在我的开发环境中使用 WSL2 + Docker,并且在让我的笔记本电脑进入睡眠状态后,时钟搞砸了。 “修复”是重新启动 WSL2。还有其他选择,但我没有机会测试它们。 this issue
中有一些额外的细节