Is there any way to get the file extension from a URL

前端 未结 7 1709
再見小時候
再見小時候 2021-02-12 07:04

I want to know that for make sure that the file that will be download from my script will have the extension I want.

The file will not be at URLs like:

h         


        
相关标签:
7条回答
  • 2021-02-12 07:30

    Here is my solution:

    if (Uri.TryCreate(url, UriKind.Absolute, out var uri)){
        Console.WriteLine(Path.GetExtension(uri.LocalPath));
    }
    

    First, I verify that my url is a valid url, then I get the file extension from the local path.

    0 讨论(0)
  • 2021-02-12 07:34

    It is weird, but it works:

    string url = @"http://example.com/file.jpg";
    string ext = System.IO.Path.GetExtension(url);
    MessageBox.Show(this, ext);
    

    but as crono remarked below, it will not work with parameters:

    string url = @"http://example.com/file.jpg?par=x";
    string ext = System.IO.Path.GetExtension(url);
    MessageBox.Show(this, ext);
    

    result: ".jpg?par=x"

    0 讨论(0)
  • 2021-02-12 07:42

    Some have suggested requesting the file from the url and checking the headers. That's overkill for something so simple in my opinion so...

    Heringers answer fails if parameters are present on the url, the solution is simple just Split on the query string char ?.

    string url = @"http://example.com/file.jpg";
    string ext = System.IO.Path.GetExtension(url.Split('?')[0]);
    
    0 讨论(0)
  • 2021-02-12 07:45

    here's a simple one I use. Works with parameters, with absolute and relative URLs, etc. etc.

    public static string GetFileExtensionFromUrl(string url)
    {
        url = url.Split('?')[0];
        url = url.Split('/').Last();
        return url.Contains('.') ? url.Substring(url.LastIndexOf('.')) : "";
    }
    

    Unit test if you will

    [TestMethod]
    public void TestGetExt()
    {
        Assert.IsTrue(Helpers.GetFileExtensionFromUrl("../wtf.js?x=wtf")==".js");
        Assert.IsTrue(Helpers.GetFileExtensionFromUrl("wtf.js")==".js");
        Assert.IsTrue(Helpers.GetFileExtensionFromUrl("http://www.com/wtf.js?wtf")==".js");
        Assert.IsTrue(Helpers.GetFileExtensionFromUrl("wtf") == "");
        Assert.IsTrue(Helpers.GetFileExtensionFromUrl("") == "");
    }
    

    Tune for your own needs.

    P.S. Do not use Path.GetExtension cause it does not work with query-string params

    0 讨论(0)
  • 2021-02-12 07:48

    VirtualPathUtility.GetExtension(yourPath) returns the file extension from the specified path, including the leading period.

    0 讨论(0)
  • 2021-02-12 07:49

    I know that this is an old question, but can be helpful to people that see this question.

    The best approach for getting an extension from filename inside an URL, also with parameters are with regex.

    You can use this pattern (not urls only):

    .+(\.\w{3})\?*.*
    

    Explanation:

    .+     Match any character between one and infinite
    (...)  With this, you create a group, after you can use for getting string inside the brackets
    \.     Match the character '.'
    \w     Matches any word character equal to [a-zA-Z0-9_]
    \?*    Match the character '?' between zero and infinite
    .*     Match any character between zero and infinite
    

    Example:

    http://example.com/file.png
    http://example.com/file.png?foo=10
    
    But if you have an URL like this:
    
    http://example.com/asd
    This take '.com' as extension.
    

    So you can use a strong pattern for urls like this:

    .+\/{2}.+\/{1}.+(\.\w+)\?*.*
    

    Explanation:

    .+        Match any character between one and infinite
    \/{2}     Match two '/' characters
    .+        Match any character between one and infinite
    \/{1}     Match one '/' character
    .+        Match any character between one and infinite
    (\.\w+)  Group and match '.' character and any word character equal to [a-zA-Z0-9_] from one to infinite
    \?*       Match the character '?' between zero and infinite
    .*        Match any character between zero and infinite
    

    Example:

    http://example.com/file.png          (Match .png)
    https://example.com/file.png?foo=10  (Match .png)
    http://example.com/asd               (No match)
    C:\Foo\file.png                      (No match, only urls!)
    
    http://example.com/file.png
    
        http:        .+
        //           \/{2}
        example.com  .+
        /            \/{1}
        file         .+
        .png         (\.\w+)
    
    0 讨论(0)
提交回复
热议问题