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

时间:2018-07-26 01:54:57

标签: azure go escaping azure-storage-blobs

Azure docs

  

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

由于兼容s3,我无法避免使用此类名称,因此必须对其进行编码。

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

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

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

  

来自Go的url.QueryEscape实现(具体而言,   shouldEscape私有函数),转义除   以下:字母,十进制数字,“-”,“ _”,“。”,“〜”。

1 个答案:

答案 0 :(得分:2)

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

无论如何,我相信您应该使用以下属性:

  • 转换必须是双向的,并且在预期的文件名空间中必须没有冲突
  • 不要使文件名不带结束点而未编码
  • 对于点号结尾的文件,请仅对冲突的点进行编码,以保持原始名称的可读性。

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

我将为此举两个例子。让我们建议您有文件:

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

使用特殊的子容器

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

结果网址如下:

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