Подтвердить что ты не робот

Получить расширение файла или типа HasExtension bool из объекта Uri С#

Быстрый вопрос:

Может кто-нибудь придумать лучший способ, чем RegEx или обычный текстовый поиск, чтобы определить, имеет ли объект Uri (не строка URL) расширение файла?

Любые мысли приветствуются. Извините, если я что-то пропустил в .NET Framework/Uri-классе, который уже делает это.


Немного сложнее мудро.


Я принял ответ Craigtp; однако для того, что мне нужно, решение таково.

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

Всем, кто попробовал это. Чтобы получить полный и исчерпывающий ответ, вам, очевидно, понадобится словарь MIME-типов для дальнейшей проверки. Например, http://example/this.is.sort.of.valid.but.not.a.mime.type вернул бы "true" и имеет Path.HasExtension, однако для того, что мне нужно, у меня никогда не было бы этого типа пути, входящего.

4b9b3361

Ответ 1

Вы можете использовать метод HasExtension класса System.IO.Path чтобы определить, имеет ли строка Uri расширение.

Используя свойство AbsoluteUri объекта Uri, вы можете получить полную строку, которая представляет Uri. Передача этой строки в метод Path класса HasExtension будет правильно возвращать логическое значение, указывающее, содержит ли Uri расширение файла.

Скопируйте и вставьте следующий код в простое консольное приложение, чтобы проверить это. Только myUri3 и myUrl4 возвращают True, что также демонстрирует, что метод HasExtension может правильно обрабатывать дополнительные символы (например, строки запросов) после имени файла (и расширения).

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. Это позволяет обойти потенциальную проблему, как отметил Адриано в комментарии к этому ответу, что строка запроса может содержать символ точки (что может привести к HasExtension методе HasExtension).

После того, как Uri де-конструирован, мы можем теперь правильно определить, имеет ли строка Uri расширение, а также что это расширение.

Отсюда это просто случай сопоставления этого расширения со списком известных допустимых расширений. Эта часть - то, что .NET Framework никогда не даст вам, так как любое расширение файла потенциально допустимо (любое приложение может создать собственное расширение файла, если оно того пожелает!)

Ответ 2

Свойство 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

Что вы можете сделать, это получить AbsolutePath URI (который, например, соответствует /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

Ответ 3

Взгляните на класс UriBuilder. Вы можете не только получить определенные части URL-адреса, но вы также можете поменять их по желанию.

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;
}

Ответ 4

вот мое решение, чтобы сделать это правильно;)

        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);
        }