javascript - AWS S3 CreatePresignedPost 未生成某些必填字段
问题描述
我正在尝试生成一个预签名的帖子,以授予浏览器从存储桶上传/删除特定文件的权限,但似乎createPresignedPost
没有生成一些必填字段。getSignedUrl
作品。
const signedUrl = await new Promise<PresignedPost>( (resolve, reject) => {
this.s3.createPresignedPost({
Bucket: this.env.config.s3.buckets.images,
Fields: { key },
Conditions: [
["content-length-range", 0, 10 * 1024 * 1024]
],
Expires: 3600,
}, (err, preSigned) => { if (err) { reject(err) } else { resolve(preSigned) }});
});
// This works, but doesn't allow the object to be deleted, and does not allow setting a maximum file size
//
// const rawUrl = new URL(await this.s3.getSignedUrlPromise('putObject', {
// Bucket: this.env.config.s3.buckets.images,
// Key: key,
// Expires: 3600,
// }));
//
// const signedUrl = {
// url: rawUrl.origin + rawUrl.pathname,
// fields: Object.fromEntries(Array.from(rawUrl.searchParams.entries()))
// };
createPresignedPost 生成:
{
url: 'https://s3.eu-west-3.amazonaws.com/xxx-images',
fields: {
key: 'incoming/ae83pfxu7kf4dfdv4hbvorsxq31hadtjcp97ehwt30ds5',
bucket: 'xxx-images',
'X-Amz-Algorithm': 'AWS4-HMAC-SHA256',
'X-Amz-Credential': 'xxx',
'X-Amz-Date': '20200509T145014Z',
Policy:
'eyJleHBpcmF0aW9uIjoiMjAyMC0wNS0wOVQxNTo1MDoxNFoiLCJjb25kaXRpb25zIjpbWyJjb250ZW50LWxlbmd0aC1yYW5nZSIsMCwxMDQ4NTc2MF0seyJrZXkiOiJpbmNvbWluZy9hZTgzcGZ4dTdrZjRkZmR2NGhidm9yc3hxMzFoYWR0amNwOTdlaHd0MzBkczUifSx7ImJ1Y2tldCI6InByZWZsaWdodGVtYWlsLWltYWdlcyJ9LHsiWC1BbXotQWxnb3JpdGhtIjoiQVdTNC1ITUFDLVNIQTI1NiJ9LHsiWC1BbXotQ3JlZGVudGlhbCI6IkFLSUE1RE5UN0lOWjJKTU5TQVhILzIwMjAwNTA5L2V1LXdlc3QtMy9zMy9hd3M0X3JlcXVlc3QifSx7IlgtQW16LURhdGUiOiIyMDIwMDUwOVQxNDUwMTRaIn1dfQ==',
'X-Amz-Signature': 'xxx' } }
尝试使用这些参数放置文件会给出:
<?xml version="1.0" encoding="UTF-8"?>
<Error>
<Code>AuthorizationQueryParametersError</Code>
<Message>Query-string authentication version 4 requires the X-Amz-Algorithm, X-Amz-Credential, X-Amz-Signature, X-Amz-Date, X-Amz-SignedHeaders, and X-Amz-Expires parameters.</Message>
<RequestId>xxx</RequestId>
<HostId>xxx</HostId>
</Error>
较旧的 API 调用也会生成缺少的“X-Amz-SignedHeaders”和“X-Amz-Expires”参数。
谁能帮我解决我做错了什么?
解决方案
您应该使用POST
而不是,PUT
因为您正在使用createPresignedPost
生成 URL。
推荐阅读
- python - 决定是否在 pip-tools 中允许不安全的包版本的正确方法是什么?
- gnuplot - 使用特定的数据表示在 Gnupot 中生成箱线图
- singlestore - 与 Memsql 相关的查询
- c# - 如何解决无法为“CUserMasterLocal”创建 DbSet,因为此类型未包含在上下文模型中
- mongodb - mongodb macvlan docker容器中的连接被拒绝
- android - Flutter 使用换行对齐两个文本小部件
- r - DESeq2 代码有助于分析 R 中疾病和对照患者之间的差异基因表达
- reactjs - 使用钩子获取数据时的无限循环
- python - 从字典中的字典中删除值但保留键
- python - 如何管理 django 内置的登录错误?