Azure 如何对以句点结尾的blob名称进行编码?

Azure 如何对以句点结尾的blob名称进行编码?,azure,go,escaping,azure-storage-blobs,Azure,Go,Escaping,Azure Storage Blobs,: 避免以点(、正斜杠(/)或空格结尾的blob名称 二者的顺序或组合 由于遗留的s3兼容性,我无法避免这些名称,因此我必须对它们进行编码 我应该如何对这些名称进行编码 我不想使用base64,因为在azure的blob控制台中查看时,这将使调试变得非常困难 Go有,但它有: 来自Go的url.QueryEscape实现(特别是 shouldEscape private function),转义除 以下是:字母、十进制数字、'-'、'.'、'.'、'~' 我认为没有任何通用的解决方案可以在您的应

:

避免以点(、正斜杠(/)或空格结尾的blob名称 二者的顺序或组合

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

我应该如何对这些名称进行编码

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

Go有,但它有:

来自Go的url.QueryEscape实现(特别是 shouldEscape private function),转义除 以下是:字母、十进制数字、'-'、'.'、'.'、'~'


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

不管怎样,我相信你应该选择这些房产:

  • 转换必须是双向的,并且在预期的文件名空间中没有冲突
  • 请保留文件名,不要以未编码的点结尾
  • 对于以点结尾的文件,只对冲突的点进行编码,保持原始名称的可读性
这将使大多数(非冲突的)文件保持简短,并具有原始直观或希望有意义的名称,如果您能够重命名或逐步淘汰冲突的文件,只需删除转换逻辑,而无需重新构造所有存储的数据及其URL

我将为此举两个例子。建议您拥有以下文件:

/someParent/normal.txt
/someParent/extensionless
/someParent/single.
/someParent/double.. 
使用特殊分包商 您可以从文件名末尾删除N个点,并将它们转换为子容器名称“点”、“点”等

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

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

不管怎样,我相信你应该选择这些房产:

  • 转换必须是双向的,并且在预期的文件名空间中没有冲突
  • 请保留文件名,不要以未编码的点结尾
  • 对于以点结尾的文件,只对冲突的点进行编码,保持原始名称的可读性
这将使大多数(非冲突的)文件保持简短,并具有原始直观或希望有意义的名称,如果您能够重命名或逐步淘汰冲突的文件,只需删除转换逻辑,而无需重新构造所有存储的数据及其URL

我将为此举两个例子。建议您拥有以下文件:

/someParent/normal.txt
/someParent/extensionless
/someParent/single.
/someParent/double.. 
使用特殊分包商 您可以从文件名末尾删除N个点,并将它们转换为子容器名称“点”、“点”等

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

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