从Uri对象C#获取文件扩展名或“HasExtension”类型bool

问题描述 投票:23回答:4

快速提问:

任何人都可以想到一个更好的方法然后RegEx或一般文本搜索来确定Uri对象(不是URL字符串)是否有文件扩展名?

欢迎任何想法。如果我在.NET框架/ Uri类中遗漏了已经做到这一点的事情,我深表歉意。


稍微复杂一点。


我接受了克雷格普的答案;但是,因为我需要解决方案。

var hasExtension = Path.HasExtension(requestUri.AbsolutePath);

对所有参与此事的人。要获得完整而全面的答案,您显然需要一个mime类型字典来进行进一步检查。例如http://example/this.is.sort.of.valid.but.not.a.mime.type将返回“true”有Path.HasExtension,但是,根据我的需要,我永远不会有这种类型的路径进入。

c# .net uri
4个回答
21
投票

您可以使用HasExtension类的System.IO.Path方法来确定Uri的字符串是否具有扩展名。

通过使用AbsoluteUri对象的Uri属性,您可以检索表示Uri的完整字符串。将此字符串传递给Path类的HasExtension方法将正确返回一个布尔值,指示Uri是否包含文件扩展名。

将以下代码复制并粘贴到一个简单的控制台应用程序中以对其进行测试。只有myUri3myUrl4返回True,这也表明HasExtension方法可以在文件名(和扩展名)之后正确处理其他字符(即Querystrings)。

using System;
using System.IO;
namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            Uri myURI1 = new Uri(@"http://www.somesite.com/");
            Uri myURI2 = new Uri(@"http://www.somesite.com/filenoext");
            Uri myURI3 = new Uri(@"http://www.somesite.com/filewithext.jpg");
            Uri myURI4 = new Uri(@"http://www.somesite.com/filewithext.jpg?q=randomquerystring");

            Console.WriteLine("Does myURI1 have an extension: " + Path.HasExtension(myURI1.AbsoluteUri));
            Console.WriteLine("Does myURI2 have an extension: " + Path.HasExtension(myURI2.AbsoluteUri));
            Console.WriteLine("Does myURI3 have an extension: " + Path.HasExtension(myURI3.AbsoluteUri));
            Console.WriteLine("Does myURI4 have an extension: " + Path.HasExtension(myURI4.AbsoluteUri));

            Console.ReadLine();
        }
    }
}

编辑:

根据提问者关于确定扩展名是否为有效扩展名的编辑,我在下面编写了一些新代码(复制并粘贴到控制台应用程序中):

using System;
using System.IO;
namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            Uri myUri1 = new Uri("http://www.somesite.com/folder/file.jpg?q=randomquery.string");
            string path1 = String.Format("{0}{1}{2}{3}", myUri1.Scheme, Uri.SchemeDelimiter, myUri1.Authority, myUri1.AbsolutePath);
            string extension1 = Path.GetExtension(path1);
            Console.WriteLine("Extension of myUri1: " + extension1);

            Uri myUri2 = new Uri("http://www.somesite.com/folder/?q=randomquerystring");
            string path2 = String.Format("{0}{1}{2}{3}", myUri2.Scheme, Uri.SchemeDelimiter, myUri2.Authority, myUri2.AbsolutePath);
            string extension2 = Path.GetExtension(path2);
            Console.WriteLine("Extension of myUri1: " + extension2);

            Console.ReadLine();
        }
    }
}

这个新代码现在解构了Uri对象的所有组成部分(即Scheme - http部分等),并特别删除了Uri的任何查询字符串部分。这解决了潜在的问题,正如Adriano在对这个答案的评论中指出的那样,查询字符串可能包含一个点字符(从而可能弄乱了HasExtension方法)。

一旦Uri被解构,我们现在可以正确地确定Uri字符串是否具有扩展名以及该扩展名是什么。

从这里开始,仅仅是将此扩展与已知有效扩展列表进行匹配的情况。这部分是.NET框架永远不会给你的东西,因为任何文件扩展名都可能有效(任何应用程序都可以构成它自己的文件扩展名,如果它需要的话!)


8
投票

其他人建议的Uri.IsFile属性不起作用。

来自文档

The IsFile property is true when the Scheme property equals UriSchemeFile.

file://server/filename.ext"

http://msdn.microsoft.com/en-us/library/system.uri.isfile.aspx

你可以做的是获取URI的AbsolutePath(例如对应于/ contact或/images/logo.png),然后使用FileInfo类来检查/获取扩展名。

var uris = new List<Uri>()
{
  new Uri("http://mysite.com/contact"),
  new Uri("http://mysite.com/images/logo.png"),
  new Uri("http://mysite.com/images/logo.png?query=value"),
};

foreach (var u in uris)
{
  var fi = new FileInfo(u.AbsolutePath);
  var ext = fi.Extension;
  if (!string.IsNullOrWhiteSpace(ext))
  {
    Console.WriteLine(ext);
  }
}

您可能需要检查支持的扩展列表以处理更复杂的情况(contact.is.sortof.valid和contact.is.sortof.valid.png)

测试:

"http://mysite.com/contact"                             //no ext
"http://mysite.com/contact?query=value"                 //no ext
"http://mysite.com/contact?query=value.value"           //no ext
"http://mysite.com/contact/"                            //no ext
"http://mysite.com/images/logo.png"                     //.png
"http://mysite.com/images/logo.png?query=value"         //.png
"http://mysite.com/images/logo.png?query=value.value"   //.png
"http://mysite.com/contact.is.sortof.valid"             //.valid
"http://mysite:123/contact.is.sortof.valid"              //.valid

0
投票

看看UriBuilder类。您不仅可以检索网址的某些部分,还可以随意切换它们。

public bool HasExtension(Uri myUri)
{
    var validExtensions = new List<string>() { ".png", ".jpg" };
    var builder = UriBuilder(myUri)
    foreach (var extension in validExtensions) {
        if(builder.Path.Equals(extension, StringComparison.InvariantCultureIgnoreCase))
            return true;
    return false;
}

-1
投票

这是我的解决方案,使其正确;)

        var inputString = ("http://ask.com/pic.JPG http://aSk.com/pIc.JPG "
        + "http://ask.com/pic.jpg "
        + "http://yoursite.com/contact "
        + "http://yoursite.com/contact?query=value "
        + "http://yoursite.com/contact?query=value.value "
        + "http://yoursite.com/contact/ "
        + "http://yoursite.com/images/Logo.pnG "
        + "http://yoursite.com/images/lOgo.pNg?query=value "
        + "http://yoursite.com/images/logo.png?query=value.value "
        + "http://yoursite.com/contact.is.sortof.valid "
        + "http://mysite:123/contact.is.sortof.valid").Split(' ');

        var restultString = "";

        foreach (var is1 in inputString)
        {
            restultString += (!string.IsNullOrEmpty(restultString) ? " " : "") +
                  (Path.HasExtension(is1) ? Path.ChangeExtension(is1, Path.GetExtension(is1).ToLower()) : is1);
        }
© www.soinside.com 2019 - 2024. All rights reserved.