使用签名发布策略将对象发布到 GCS 时出错

2023-11-29

我正在尝试为用户创建一项签名策略,以便将其文件上传到 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"
  }
}


错误详细信息说:Failed condition: {"key":"${filename}"}

我查看了上面编写的代码,发现您正在尝试将模板变量放入普通字符串中。 ${ XXX } 的使用只能用在template string.

const file = storage.bucket(bucket).file("${filename}");

应该:

const file = storage.bucket(bucket).file(`${filename}`);

由于您没有修改有关文件名的任何内容,因此可以将其简化为:

const file = storage.bucket(bucket).file(filename);

当考虑变量文件名时,这段代码似乎有效:

const { Storage } = require('@google-cloud/storage');
const bucket = 'my-bucket';
const storage = new Storage();

async function generateSignedPolicy() {

    const file = storage
        .bucket(bucket)
        .file("someFolder/${filename}");


    const [response] = await file.generateSignedPostPolicyV4({
        expires: Date.now() + (1000 * 300),
        conditions: [],
        fields: {
            bucket,
            acl: 'private',
        }
    });

    // console.log(response);

    // Create an HTML form with the provided policy
    let output = `<form action="${response.url}" method="POST" enctype="multipart/form-data">\n`;
    // Include all fields returned in the HTML form as they're required
    for (const name of Object.keys(response.fields)) {
        const value = response.fields[name];
        output += `  <input name="${name}" value="${value}" type="hidden"/>\n`;
    }
    output += '  <input type="file" name="file"/><br />\n';
    output += '  <input type="submit" value="Upload File"/><br />\n';
    output += '</form>';

    console.log(output);

    // Copy file contents to an HTML file and open that file in your browser, select a file, and upload
    // There will be a 204 response and the file will be uploaded in someFolder
} 

generateSignedPolicy().catch((err) => {
    console.error(err);
})

我删除了所有条件并将存储桶设置为字段。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用签名发布策略将对象发布到 GCS 时出错 的相关文章

随机推荐

  • WinAPI C++ 客户端在读取之前检测匿名管道上的写入

    我正在编写一个 C Windows 客户端控制台应用程序 该应用程序从 STDIN 上的匿名管道读取数据 我希望能够按如下方式使用我的程序 echo input text here my app exe 并在应用程序中使用通过管道输入的文本
  • 为什么我的 JLabel 没有显示

    我正在调用此方法 称为检查我的抽象类之一 但由于某种原因 我添加到 JPanel 面板 的 JLabel 问题 没有显示 为什么会出现这种情况 任何解释 我都使用重绘和验证方法 但仍然没有显示任何内容 您遇到的问题是您阻塞了事件调度线程 阻
  • 了解 Java 中的一个大公司项目 [关闭]

    Closed 这个问题是基于意见的 目前不接受答案 理解java大公司项目的最好方法是什么 关于这个主题 有一个不错的播客 采访 Dave Thomas 务实的程序员 Dave here 他称之为 软件考古学 由于许多不同的原因 组织经常失
  • 将强类型属性名称作为参数传递

    我有一个收藏IEnumerable
  • mvc4 中 Global.asax 中的会话超时重定向

    我试图检测会话何时结束 然后在我的全局 asax 文件中完成此操作后将用户重定向到主页 我正在使用我发现的下面的代码here 全局 asax protected void Session Start if Context Session n
  • Razor 页面中 foreach 循环内的表单

    我有一个标准的 Razor 页面 其中列出了我的数据库中的所有订单 它的编码非常标准 IList
  • 是否可以在 THREE.js 中启用无限数量的渲染器?

    为了避免 XY 问题 让我解释一下我来自哪里 我想使用 THREE js 使用同一时间轴绘制大量堆叠在一起的波形 波形只是三线 我通过修改正交相机的视图范围来实现这些波形的缩放 平移 缩放 我最初尝试完成此任务 导致我创建多个具有固定高度的
  • 在 Laravel 5.5 中使用 str_limit 函数限制文本

    我一直在尝试限制我的博客内容文本str limit在我对其应用字符限制之前 它工作得很好 请查看我的刀片文件的代码中缺少什么 str limit blog gt content 在默认限制下工作正常 在视图上显示有限的文本 但是当我应用任何
  • PrimeFaces:验证时的条件更新

    是否可以仅在验证成功时有条件地更新 JSF 组件 我希望能够做类似的事情
  • 为什么我的浮点值无法正确打印?

    我正在尝试打印浮点值 0x40a00000 和 0xc0200000 但是我打印出来的值和根据 IEEE 754 浮点转换器的正确值 https www h schmidt net FloatConverter IEEE754 html 完
  • 如何让 Visual Studio 识别 XAML 更改?

    我刚刚开始使用 WPF 所以这里可能缺少一些简单的东西 我有一个正在 VS 2010 中编辑的窗口 当我手动更改 XAML 然后运行应用程序 F5 时 窗口仍保持编辑之前的状态 但是如果我进行重建然后运行应用程序 我的更改就会显示 有什么方
  • @Component Hibernate 类

    我在程序中休眠了带注释的类 由于我正在运行一个 Spring 项目 我已将它们包含在 servlet xml 文件中 com student dto 是实际的包名称 并在联系人实体上添加了 Component 有没有一种方法可以自动添加 C
  • R 中的捷克语编码

    我在新计算机上安装了 RStudio 并出现了编码问题 当我在控制台中键入带重音的文本 不涉及文件写入或读取 只是普通控制台 时 我丢失了捷克语口音 如本示例所示 请注意带重音的 N 和 gt uf uf ufi ky 1 Nuf nuf
  • C#cefsharp浏览器尝试设置代理[关闭]

    Closed 这个问题需要调试细节 目前不接受答案 我不太擅长使用 CefSharp 浏览器 所以我需要一些外部帮助 using System using System Collections Generic using System Co
  • npm @types 包的类型 globalDevDependency 的等价物是什么?

    我想升级一个 电子邮件受保护 项目到 tsc 2 并在流程沟中typings从我的工具链 对于常见的依赖项来说这不是问题 因为这些依赖项来自我的typings json dependencies bluebird registry npm
  • Matlab:打印符号方程

    我有一个符号方程 la 2x 3y 4z 0 问题是我想将其与我正在输入的完整句子一起打印到屏幕上 我希望在终端中显示 整流平面的方程为 2x 3y 4z D 我是 Matlab 新手 无法找到适合于此的函数 谢谢 蛇 您可以使用CHAR符
  • Tkinter 中的 Matplotlib 绘图 - 每次更新都会添加新的导航工具栏?

    我正在开发 Tkinter GUI 根据用户输入以交互方式生成 Matplotlib 绘图 为此 需要在用户更改输入后重新绘制 我已经让它原则上工作 但想包括NavigationToolbar 但是 我似乎无法获得更新NavigationT
  • 在 R 中的向量中保持字符串出现的滚动计数

    我的问题最好通过一个快速而简单的示例来解决 my strings c apple banana carrot apple apple dairy banana eggplant flowers flowers apple banana my
  • std::ostream 的重载 << 运算符

    ostream operator lt lt ostream osObject const storageRentals rentals osObject lt lt rentals summaryReport return osObjec
  • 使用签名发布策略将对象发布到 GCS 时出错

    我正在尝试为用户创建一项签名策略 以便将其文件上传到 Google Cloud Storage 我在这里面临的问题是文件名 我希望用户在上传时提供文件名 如官方 GCS 文档中所述 如果您想要从用户 这不起作用 因为我收到以下错误