2014-09-01 15 views
0

我想将包括路径和查询部分在内的链接网址转换为有效的文件名。我已选择使用Base64,如下所示。如何将网址转换为文件名?

是否有更好的Base64代码,如避免Byte[]? url到文件名的最佳做法是什么?我想有超过文件名长度限制的问题。

string encoded = 
    System.Convert.ToBase64String(System.Text.Encoding.UTF8.GetBytes(url)); 
string decoded = 
    System.Text.Encoding.UTF8.GetString(System.Convert.FromBase64String(encoded)); 

if (decoded != url) 
    throw(new SomeException()); 
+1

文件名是否应该是人类可读/可理解的?你是否仍然需要能够将其恢复到原来的Url? – 2014-09-01 10:06:58

+0

对于初始开发,需要缓存API的返回JSON以进行缓存,脱机使用。这些URL每次都是一样的。我不需要人类可读,但我需要将文件名转换回url。 – BSalita 2014-09-01 10:13:10

回答

2

我会说最好的做法是,如果可能,文件名不应该与URL有直接关系。除非您控制将调用此方法的URL,否则您将面临安全隐患。如果您可以生成一些本地ID,那么最好使用它作为文件名,然后将该ID链接到URL。这样你就可以完全控制正在写入的文件名,而使用URL可以打开潜在的攻击者。

+1

您期望什么安全危险?我假设转换会阻止文件被称为'“../../../ windows/[...]”'并且过去我看不到太多的安全问题。我肯定使用过像'wget'这样的实用工具,它可以将网页下载到镜像该网址的文件夹结构中,并且没有听说过与此有关的任何安全问题...... – Chris 2014-09-01 10:06:27

+0

@Erik,我确实控制了网址。 – BSalita 2014-09-01 10:14:21

+0

@Chris,长期来说,是的,我确实需要wget做的代码。码? – BSalita 2014-09-01 10:15:58

1

如果/当您需要将名称翻译回原始Url时,您可能需要创建单独的映射表。生成一个唯一的文件名并将其与原始Url放在一起并保存在表中。您可以使用API​​(Guid,Random,DateTime)或简单的计数器来获取唯一的文件名。

这种方式不必担心重复和非法字符,因为你在控制文件名的生成。

由于您正在缓存JSON请求/响应,请谨慎使用POST:两个请求的URL可能相同,但内容可能不同,因此您可能不希望为第一个请求使用缓存。

一般而言,您不会缓存POST的,但某些REST API使用POST绕过最大的Url GET请求长度。

+0

Erno,关于POST的好点。在我的情况下,它总是一个GET。 – BSalita 2014-09-01 11:14:58