如何将url转换为文件名?

Posted

技术标签:

【中文标题】如何将url转换为文件名?【英文标题】:How to convert url into filename? 【发布时间】:2014-09-01 09:47:03 【问题描述】:

我想将包含路径和查询部分的任意 url 转换为有效的文件名。我选择使用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());

【问题讨论】:

文件名还应该是人类可读/可理解的吗?您还需要能够将其转回原来的 Url 吗? 对于初始开发,需要缓存API返回的JSON以供缓存,离线使用。 URL 每次总是相同的。我不需要人类可读,但我确实需要将文件名转换回 url。 【参考方案1】:

我想说最好的做法是,如果可能,文件名不应与 URL 有直接关系。除非您控制调用此方法的 URL,否则您将面临安全危险。最好能生成一些本地 ID,将其用作文件名,然后将该 ID 链接到 URL。这样一来,您始终可以完全控制正在写入的文件名,而使用 URL 会使您容易受到潜在的攻击者的攻击。

【讨论】:

您预计会有哪些安全隐患?我假设转换将阻止文件被称为"../../../windows/[...]" 并且过去我看不到太多安全问题。我当然使用过像 wget 这样的实用程序,它可以将网页下载到镜像 url 的文件夹结构中,并且没有听说过任何与此相关的安全问题...... @Erik,我确实控制 URL。 @Chris,从长远来看,是的,我确实想要执行 wget 功能的代码。代码? @BSalita 如果你确实控制了 URL,我想一个方便的方法是使用完整的 URL 字符串,然后使用它的 GetHashCode() 方法作为标识符。 @Erik,如果文件名的生命周期是一个进程,GetHashCode() 可能会起作用。否则在执行之间不能保证。【参考方案2】:

如果/当您需要将名称转换回原始网址时,您可能需要创建一个单独的映射表。生成一个唯一的文件名并将其存储在表中,并在其旁边放置原始 Url。您可以使用 API(Guid、Random、DateTime)或简单的计数器来获取唯一的文件名。

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

当您缓存 JSON 请求/响应时,请注意使用 POST:两个请求的 url 可能相同,但内容可能不同,因此您可能不想为下一个请求使用缓存。

通常您不会缓存 POST,但一些 REST API 使用 POST 绕过最大 Url GET 请求长度。

【讨论】:

Erno,关于 POST 的要点。在我的情况下,它总是一个 GET。

以上是关于如何将url转换为文件名?的主要内容,如果未能解决你的问题,请参考以下文章

如何将 Windows 路径转换为文件:URL,在批处理文件中,适合 SVN 命令行使用

如何将 blob URL 转换为音频文件并将其保存到服务器

如何将图像转换为 url?

使用JavaScript将图像URL中的链接从s3转换为文件对象

如何将 magenta.js 音符序列转换为 midi 文件?

如何在 ASP.NET 中将文件路径转换为 ​​URL