如何编码以句点结尾的blob名称?

问题描述 投票:0回答:1

Azure docs

避免使用以点(。),正斜杠(/)或两者的序列或组合结尾的blob名称。

由于传统的s3兼容性,我无法避免这样的名称,因此我必须对它们进行编码。

我应该如何编码这样的名字?

我不想使用base64,因为这样在查看azure的blob控制台时会很难调试。

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

从Go的url.QueryEscape(特别是shouldEscape私有函数)的实现中,除了以下字符之外的所有字符都会转义:字母,十进制数字,' - ','_','。','〜'。

azure go escaping azure-storage-blobs
1个回答
1
投票

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

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

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

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

我会建议2个例子。让我们建议你有文件:

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

使用特殊的子容器

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

结果网址希望:

/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或其他全名编码,因为它会使文件名显着更长,并丢失文件名可能包含的任何有意义的细节。

© www.soinside.com 2019 - 2024. All rights reserved.