gpt4 book ai didi

amazon-s3 - 使用 Amazon Java SDK 和额外/字符的 Amazon S3 预签名 URL

转载 作者:行者123 更新时间:2023-12-02 02:18:50 25 4
gpt4 key购买 nike

我一直在创建预签名的 HTTP PUT URL,在我想开始在 S3 中使用“文件夹”之前,一切都运行良好;我希望 key 具有字符“/”。

现在我收到 Signature doesn't match when I send the HTTP PUT requests due to the fact the fact'/' probably changes to %2F... Amazon 控制台管理不理解它并将其显示为一个文件而不是子文件夹。

有什么想法吗?

附言
使用带有 POCO NET 库的 C++ 发送 HTTP PUT 请求。

编辑
我正在使用 C++ 中的 Poco HttpRequest 到我的 Java Web 服务器来生成签名的 url(在响应中返回)。
然后 C++ 使用此 url 再次使用 Poco 将文件放入 s3。
问题是从 Web 服务器返回的 url 是通过 Poco URI 对象解析的,Poco URI 对象自动解码 s3 对象键从而更改它。
考虑到这一点,我能够解决我的问题。

最佳答案

棘手 - 我将尝试自下而上地处理这个问题。

免责声明:我目视检查 Poco 库而不是实际调试代码示例,这应该会更快地产生更可靠的结果,见下文;)

分析

If I escape the character before creating the presigned URL it worksgreat, but then the Amazon console management doesn't understand itand shows it as one file instead of subfolders.

后者源于 S3 实际上在存储级别上没有文件夹的概念,参见例如Index Document Support 中的索引文档和文件夹部分:

Objects stored in Amazon S3 are stored within a flat container, i.e.,an Amazon S3 bucket, and it does not provide any hierarchicalorganization, similar to a file system's. However, you can create alogical hierarchy using object key names and use these names to inferlogical folders that contain these objects.

这正是 AWS Management Console 的内容也在这里做:

The AWS Management Console also supports the concept of folders, byusing the same key naming convention used in the preceding sample.

但是,您关于假设 / 被编码为 %2F 的测试证明,这确实是 Poco 的方式: :Net 在执行 HTTP PUT 请求时对 URL 进行编码。

可能的解决方案

为了让您的方案按预期工作,您需要弄清楚 URL 在哪里以这种方式编码 - 我原则上可以想到两个组件:

Poco::网络

找出为什么 Poco::Net 对不同于 S3 的 URL 进行编码(如果有的话,请参见下文)最好通过调试您的代码来完成,我将从这里开始:

HTTPRequest使用类 URI反过来,自动对传递给它的所有 URI 和 URI 部分执行一些规范化,特别是百分比编码的字符被解码。反过来由方法处理 encode() ,这是事情变得有趣并需要断点的地方,请参阅URI.cpp :

  • 第 575 行及以后。 - 这里 encode() 发挥了它的魔力,这似乎确实存在,因为函数内的代码和通过 reserved 参数传入的各种字符都不包含冒犯 /(请参阅第 47 行,了解正在使用的各个常量)
  • 因此,您可能想在此函数中设置一个断点并回溯调用堆栈,以查明哪些代码实际上在预先进行编码,这可能根本不会产生违规行为,请参见下文。

Java => C++ 转换

你还没有指定,实际上是用哪个 channel 将AWS Java SDK生成的预签名URL依次传递给C++。考虑到 Poco::Net 功能的代码审查(请注意,仅目视检查,我自己还没有调试过)得出的结论是,在库本身中没有发现明显的违规者,因此它似乎更有可能已经编码进入您的 C++ 层(当然可以通过调试轻松验证)- 例如,您是否偶然在这些组件之间使用任何类型的 Web 服务?

祝你好运!

关于amazon-s3 - 使用 Amazon Java SDK 和额外/字符的 Amazon S3 预签名 URL,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9247995/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com