从 strapi 上传文件到 s3 工作正常。 我正在尝试使用签名 url 来保护文件:
var params = {Bucket:process.env.AWS_BUCKET, Key: `${path}${file.hash}${file.ext}`, Expires: 3000};
var secretUrl = ''
S3.getSignedUrl('getObject', params, function (err, url) {
console.log('Signed URL: ' + url);
secretUrl = url
});
S3.upload(
{
Key: `${path}${file.hash}${file.ext}`,
Body: Buffer.from(file.buffer, 'binary'),
//ACL: 'public-read',
ContentType: file.mime,
...customParams,
},
(err, data) => {
if (err) {
return reject(err);
}
// set the bucket file url
//file.url = data.Location;
file.url = secretUrl;
console.log('FIle URL: ' + file.url);
resolve();
}
);
file.url (secretUrl) 包含正确的 URL,我可以在浏览器中使用它来检索文件。 但是每当从 strapi 管理面板读取文件时,都不会显示文件或缩略图。 我发现 strapi 向文件添加了一个参数,例如 ?2304.4005,它破坏了文件到 AWS 的获取。我在哪里以及如何改变这种行为
感谢帮助
最佳答案
这是我创建签名 URL 以保护您的 Assets 的解决方案。该 URL 将在一定时间内有效。
创建一个包含您要保护的媒体字段的集合类型。在我的示例中,集合类型称为
invoice
,媒体字段称为document
。Customize the Strapi controller对于你的发票端点(在这个例子中我使用核心 Controller
findOne
)
const { sanitizeEntity } = require('strapi-utils');
var S3 = require('aws-sdk/clients/s3');
module.exports = {
async findOne(ctx) {
const { id } = ctx.params;
const entity = await strapi.services.invoice.findOne({ id });
// key is hashed name + file extension of your entity
const key = entity.document.hash + entity.document.ext;
// create signed url
const s3 = new S3({
endpoint: 's3.eu-central-1.amazonaws.com', // s3.region.amazonaws.com
accessKeyId: '...', // your accessKeyId
secretAccessKey: '...', // your secretAccessKey
Bucket: '...', // your bucket name
signatureVersion: 'v4',
region: 'eu-central-1' // your region
});
var params = {
Bucket:'', // your bucket name
Key: key,
Expires: 20 // expires in 20 seconds
};
var url = s3.getSignedUrl('getObject', params);
entity.document.url = url // overwrite the url with signed url
return sanitizeEntity(entity, { model: strapi.models.invoice });
},
};
关于amazon-web-services - 通过 S3 SignedUrl 保护 Strapi 上传文件夹,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65664843/