【问题标题】:How to encode blob names that end with a period?如何编码以句点结尾的 blob 名称?
【发布时间】:2019-01-02 22:08:38
【问题描述】:

Azure docs:

避免以点 (.)、正斜杠 (/) 或 两者的顺序或组合。

由于遗留 s3 兼容性,我无法避免此类名称,因此我必须对它们进行编码。

我应该如何编码这些名称?

我不想使用 base64,因为在 azure 的 blob 控制台中查看时,这会导致调试变得非常困难。

Go 有 https://golang.org/pkg/net/url/#QueryEscape,但它有 this limitation

来自 Go 的 url.QueryEscape 实现(具体来说, shouldEscape 私有函数),转义除 以下:字母、十进制数字、'-'、'_'、'.'、'~'。

【问题讨论】:

  • 没有通用的健壮方法可以做到这一点。您必须选择一些在文件名末尾有效且在您的上下文中不会自然出现在文件名末尾的字符。然后在写入时替换尾随点,在读取时执行相反的操作。
  • 为什么要保留斜线,要使名称像文件路径?
  • 我没有说斜线。
  • @lf215 您说由于旧版 s3 兼容性,您无法避免使用此类名称。什么这样的名字?以点或斜线结尾?我是不是误会了?

标签: azure go escaping azure-blob-storage


【解决方案1】:

我认为在您的应用程序范围之外没有任何通用的解决方案可以处理此问题。在您的应用程序范围内,您可以进行任何编码,因此您喜欢如何布置数据取决于个人喜好。没有“正确”的方式来做到这一点。

无论如何,我相信你应该选择这些属性:

  • 转换必须是双向的,并且在您的预期文件名空间中没有冲突
  • 请保留不带结尾点的文件名未编码
  • 对于以点结尾的文件,DO 只编码冲突的点,保持原始名称可读。

这将使大多数(非冲突)文件保持简短,并使用原始直观或希望有意义的名称,如果您能够重命名或逐步淘汰冲突文件,只需删除转换逻辑而不重构所有存储的数据及其网址。

我将为此建议 2 个示例。让我们建议您有文件:

/someParent/normal.txt
/someParent/extensionless
/someParent/single.
/someParent/double.. 

使用特殊的子容器

您可以从文件名末尾删除 N 个点并将它们转换为子容器名称“dot”、“dotdot”等。

结果 url 想:

/someParent/normal.txt
/someParent/extensionless
/someParent/dot/single
/someParent/dotdot/double

阅读时,您可以删除“点”*N 文件夹级别并将 N 点附加回文件名。 显然,这假设您不需要将这样的“点”文件夹作为数据本身。

如果存储的文件可以带有任何扩展名,那么这是首选,但您可以对文件夹结构做出一些假设。

使用可丢弃的人工扩展

由于冲突已经结束,您可以将一个从未使用过的虚拟扩展名附加到给定的文件中。例如“endswithdots”,但您可以根据预期的扩展名选择更合适的内容:

/someParent/normal.txt
/someParent/extensionless
/someParent/single.endswithdots
/someParent/double..endswithdots

读取文件扩展名是否为“endswithdots”时,您会从文件名末尾删除“endswithdots”部分。

如果您的数据可以具有任何容器结构,但您可以对传入的扩展做出一些假设,这是首选。


我建议不要使用 Base64 或其他全名编码,因为它会使文件名明显变长并丢失文件名可能包含的任何有意义的细节。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-03
    • 2022-01-17
    • 2015-08-11
    • 2013-10-29
    • 1970-01-01
    • 2017-08-23
    相关资源
    最近更新 更多