将URL转换为有效的文件名并再次转回URL

6
我需要存储一些对于每个用户访问的站点都是唯一的信息。(实际上是他浏览过的站点的缩略图。)
这个缩略图(jpeg文件)需要有一个名称,指示它代表哪个站点,以便以后可以查看。
您能推荐一个简单的url到有效文件名和反向转换的方法吗?
例如:www.ibm.com 可以映射到 www_ibm_com
我不确定这是否总是适用于所有有效的url,在某些情况下,url具有非常复杂的查询字符串。
是否有一个好的正则表达式或c#库可供使用?
提前感谢并祝你开心。
2个回答

3
首先值得指出的是,“.”在文件名中是完全合法的,但“/”不是。因此,在您引用的示例中,“www.ibm.com/path1/file1.jpg”是无需翻译的。
在这里,一个简单的string.Replace会是最好的解决方案——假设您可以找到一个在文件名中合法但在URL中非法的字符。
假设非法的URL字符是“§”(在URL中可能是合法的),那么您将得到:
string.Replace("/", "§");

将其翻译为文件名并:

string.Replace("§", "/");

翻译回去。

URL编码页面定义了URL的有效、无效和不安全(有效但具有特殊含义)字符。ISO-Latin集合的“上半部分”80-FF hex(128-255十进制)中的字符是不合法的,但在文件名中可能是可以的。

您需要为URL中每个无效文件名字符集中的字符执行此操作。您可以使用GetInvalidFileNameChars获取此内容。

更新

假设您找不到合适的字符对,则另一种解决方案是使用查找表。一个列保存URL,另一个列保存生成的文件名。只要生成的名称是唯一的(GUID就可以),您就可以进行双向查找以从一个转到另一个。


@ChrisF - 你有没有可能知道哪些在文件名中是非法的URL字符?如果我知道这个清单,我可以使用你的方法。你知道在哪里能找到吗? - user425445
这个方法可能存在一些问题。举例来说,如果URL中本来就有'.'字符,而这个字符又是一个有效的文件名字符,那么就可能导致歧义。最好的办法是选择一种约定,类似于将URL的特殊字符转换为它们的ASCII值时使用 '%' 的方式。 - Shamim Hafiz - MSFT
@Gunner - 如果您看了我的回答,我指出您需要找到一个合法的文件字符,但是非法的URL。在这种情况下,它不能出现在URL中,因此将“/”转换为“.”是安全的。您需要重复处理所有非法字符。 - ChrisF
@Julian - 你可以在 GUID 前面添加站点名称(例如 ibm_com)。 - ChrisF
根据您链接的URL编码页面,§是URL中的非法字符。 - Marcel
显示剩余3条评论

1

www.ibm.com其实是一个有效的文件名。更麻烦的是斜杠。所以如果URL包含子目录,你需要将斜杠进行转换。

主要问题在于可能会出现重复。例如,ibm.com/path1_path2和ibm.com/path1/path2都会被翻译成相同的值。

我喜欢ChrisF的建议,找到一个在文件名中合法但在URL中不合法的字符,尽管我并不知道头脑中是否有这样的字符。

如果你找不到这样的字符,那么你可能需要使用一个不太可能出现的字符。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接