25

我需要接受查询字符串中的文件名列表。IE:

http://someSite/someApp/myUtil.ashx?files=file1.txt|file2.bmp|file3.doc

你对使用什么分隔符有什么建议吗?

4

8 回答 8

29

多次使用查询参数是合法的,并且是保证在所有情况下都没有解析问题的唯一方法:

http://someSite/someApp/myUtil.ashx?file=file1.txt&file=file2.bmp&file=file3.doc

;如果分号是文件名的一部分(变成),则分号必须是 URI 编码的%3B,但如果它用于分隔查询参数(这是它的保留用途)则不是。

请参阅此 rfc的第 2.2 节:

2.2. 保留字符

URI 包括由“保留”集中的字符分隔的组件和子组件。这些字符被称为“保留”,因为它们可能(或可能不)被通用语法、每个特定于方案的语法或 URI 的解引用算法的特定于实现的语法定义为分隔符。如果 URI 组件的数据与保留字符作为分隔符的用途发生冲突,则必须在形成 URI 之前对冲突数据进行百分比编码。

 reserved    = gen-delims / sub-delims

 gen-delims  = ":" / "/" / "?" / "#" / "[" / "]" / "@"

 sub-delims  = "!" / "$" / "&" / "'" / "(" / ")"
             / "*" / "+" / "," / ";" / "="
于 2013-01-09T07:48:47.370 回答
14

如果它们是文件名,一个不错的选择是文件名中不允许使用的字符。迄今为止所包含的建议, | &通常在文件名中被允许,因此可能会导致歧义。/另一方面,通常是不允许的,即使在 Windows 上也是如此。它在 URI 中是允许的,并且在查询字符串中没有特殊含义。

例子:

http://someSite/someApp/myUtil.ashx?files=file1.txt|file2.bmp|file3.doc不好,因为它可能引用了有效的文件file1.txt|file2.bmp

http://someSite/someApp/myUtil.ashx?files=file1.txt/file2.bmp/file3.doc明确指 3 个文件。

于 2009-03-13T14:08:34.043 回答
8

我建议让每个文件都有自己的查询参数,即

myUtil.ashx?file1=file1.txt&file2=file2.bmp&file3=file3.doc

这样你就可以使用标准的查询解析和循环

于 2009-03-13T13:50:37.033 回答
7

您是否需要将文件名列为字符串?大多数语言都接受查询字符串中的数组,所以你可以这样写

http://someSite/someApp/myUtil.ashx?files[]=file1.txt&files[]=file2.bmp&files[]=file3.doc

如果没有,或者由于其他原因您不能使用,您应该坚持使用文件名中不允许或不寻常的分隔符。管道 (|) 是一个很好的选择,否则您可以对不可见的字符进行 urlencode,因为它们在编码中很容易使用,但实际上很难包含在文件名中。

我通常尽可能使用数组,否则使用管道。

于 2009-03-13T13:52:03.927 回答
5

我一直使用双管“||”。除了 10 年的 Web 编程之外,我没有任何好的证据来支持为什么这是一个不错的选择,而且它从来都不是问题。

于 2009-03-13T13:47:02.690 回答
1

这是一个常见的问题。我的处理方式是:我创建了一个接受字符串列表的方法,然后找到了一个不在任何字符串中的字符。(我通过简单的字符串连接来完成此操作,然后测试各种字符。)一旦找到一个字符,将所有字符串连接在一起,但也在字符串前面加上分隔字符。所以在给定的问题中,一个例子是: http://someSite/someApp/myUtil.ashx?files=|file1.txt|file2.bmp|file3.doc 另一个例子是: http://someSite/someApp/ myUtil.ashx?files=,file1.txt,file2.bmp,file3.doc 但是因为我实际上使用了一种方法来保证我的分隔符不在其余的字符串中,所以它是安全的。第一次创建有点工作,但我已经在各种应用程序中多次使用它。

于 2016-01-25T17:00:47.723 回答
0

我想我会考虑使用逗号或分号。

于 2009-03-13T13:46:30.820 回答
0

我会在 MSalters 回答的基础上说,概括地说,最好的分隔符是对列表中的项目无效的分隔符。例如,如果您的列表是价格,则逗号是不好的分隔符,因为它可能与值混淆。出于这个原因,正如大多数这些答案所暗示的那样,我认为一个好的通用分隔符可能是“|” 因为它很少是有效值。“/”通常可能不是最好的分隔符,因为它有时对路径有效。

于 2012-12-21T16:56:26.610 回答