如何将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 命令行使用
使用JavaScript将图像URL中的链接从s3转换为文件对象