问题:
用户将上传文件并稍后获取。存储桶和对象将是私有的。为了上传文件,我正在使用 S3 预签名 URL。前端将获取此 URL 并将文件上传到此 URL。现在问题与获取文件有关,在上传过程中,我正在创建一个预签名 URL 并将其存储在数据库中,以便稍后获取。
const params = {
Bucket: process.env.DEFAULT_TENANT_BUCKET,
Key: filePath,
Expires: expiryTime
};
const s3 = new AWS.S3();
let uploadURL = s3.getSignedUrl('putObject', params);
return uploadURL;
const s3 = new AWS.S3();
let uploadURL = s3.getSignedUrl('getObject', params);
return getURL; // This will be stored in database
但是,即使我们没有明确指定任何过期时间,签名的URL也会在一段时间后过期。因此,我不能将这个预签名的URL存储在数据库中。
另一种方法:
不要将 getUrl
存储到数据库中,而是将 filePath
存储到数据库中,并在前端获取数据时创建并获取已签名的 URL。
上述方法的问题:
- 如果用户以 Excel 格式下载用户列表并包含文件的 URL,则该 URL 也会在一段时间后失效。
- 当用户列表很大时,创建已签名的 URL 可能需要一定的时间。
有更好的解决方法吗?