我正在尝试为用户创建一项签名策略,以便将其文件上传到 Google Cloud Storage。
我在这里面临的问题是文件名,我希望用户在上传时提供文件名,如官方 GCS 文档中所述,如果您想要从用户,这不起作用,因为我收到以下错误:
<?xml version='1.0' encoding='UTF-8'?>
<Error>
<Code>InvalidPolicyDocument</Code>
<Message>The content of the form does not meet the conditions specified in the policy document.</Message>
<Details>Failed condition: {"key":"${filename}"}</Details>
</Error>
我尝试使用 S3 的 createPresignedPost 方法执行相同的操作,效果很好。
参考 :https://cloud.google.com/storage/docs/xml-api/post-object-forms
任何帮助,将不胜感激。
我的用于从 GCS 生成策略的 Node.js 代码:
const { Storage } = require('@google-cloud/storage');
const storage = new Storage();
generateSignedPolicy = () => {
const bucket = 'some-bucket';
const file = storage.bucket(bucket).file("someFolder/${filename}");
const options = {
expires: Date.now() + (1000 * 300),
conditions : [
{ bucket : bucket },
]
};
return new Promise((resolve, reject) => {
file.generateSignedPostPolicyV4(options)
.then(([res]) => resolve(res))
.catch(error => reject(error))
})
}
使用上述代码生成的策略:
{
"url": "https://storage.googleapis.com/some-bucket/",
"fields": {
"key": "someFolder/${filename}",
"x-goog-date": "20221015T212358Z",
"x-goog-credential": "credential",
"x-goog-algorithm": "GOOG4-RSA-SHA256",
"policy": "policy",
"x-goog-signature": "signature"
}
}