如何在c#中检查url是文件类型还是网页类型?

Posted

技术标签:

【中文标题】如何在c#中检查url是文件类型还是网页类型?【英文标题】:how to check url is file type or webpage type in c#? 【发布时间】:2016-08-28 20:48:51 【问题描述】:

我用 C# 编写了用于抓取网站的应用程序。 现在我有一个问题 我可以确定此 URL 指向文件或网页! 如何在不发送请求的 URL 的情况下解决此问题?

【问题讨论】:

网址提供内容。 “文件”与“网页”是什么意思?您实际上是在要求 Content-Type 响应标头吗? 您使用的是哪个客户端?您应该能够向 url 发出 HEAD 请求并检查响应标头中的内容类型。 "How can I solve this problem without having to send the requested URL?" - 你不能。 URL 本身只是一个地址。它不提供任何关于该地址 at 的信息,它只是告诉您在哪里寻找某些东西。该地址的网络服务器可以返回anything。您必须发出 一些 请求(至少是 HEAD 请求)才能获取有关该地址内容的更多信息。 【参考方案1】:

您不能不发送请求...因为统一资源定位器无法与文件系统路径相提并论。例如,虽然以下 url 以 .jpg 结尾,但它显然不是图片:

google.com/search?q=asd.jpg

如果您决定改变主意,请参考以下方法:

public bool IsFileContent(string url)

    var request = HttpWebRequest.Create(url);
    request.Method = "HEAD";

    switch (request.GetResponse().ContentType)
    
        case "image/jpeg": return true;
        case "text/plain": return true;
        case "text/html": return false;

        default: // TODO: add more case as needed
            throw new ArgumentOutOfRangeException();
    

【讨论】:

【参考方案2】:

您要求做的事情实际上是不可能的。 URL 不会“指向文件或网页”。它们被路由到请求处理程序。请求处理程序可以返回 HTML 响应或文件下载或其他类型的响应。诸如“.html”或“.pdf”之类的一些扩展名暗示了响应的类型应该是什么。但是一个 URL 可能有一个不指示响应类型的扩展名,或者(就像在这个页面上一样)根本没有扩展名。

您无法仅从 URL 确定 HTTP 请求的响应类型。

【讨论】:

【参考方案3】:

在不发送任何请求的情况下,我唯一能想到的就是检查 url 末尾的文件扩展名。这不会给您 100% 的成功率,因为​​您可以使用不以扩展名结尾的 url 发送文件。话虽这么说,通常的做法是让文件 url 以带有扩展名的文件名结尾

【讨论】:

文件扩展名在 URL 上完全没有意义。 HTTP 不是文件系统。 @David 不,但是大多数上传到网络服务器或网络服务器上可供下载的文件都以文件扩展名(.pdf、.jpg 等)结尾。 那么是什么类型:/DownloadFile.aspx?fileID=123 或:/Files/123 或:/FindFiles.aspx?searchText=*.jpg 就像我说的那样,它不会给出 100% 的成功率......但这是我能想到的唯一一个可以在不发送任何请求的情况下给您一个想法的方法。跨度>

以上是关于如何在c#中检查url是文件类型还是网页类型?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 C# 中检查给定的 URL 是 HTTP 还是 HTTPS

如何获取URL链接的文件类型

如何高效地处理数百个项目中的数千个 C# 文件?

无论如何在 C# 中反序列化之前检查对象的类类型?

C# winform 如何根据URL直接下载网页保存在本地?

从 C# 中的字节 [] 获取内容类型 [关闭]