2014-09-01 40 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