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

前端 未结 7 1319
囚心锁ツ
囚心锁ツ 2021-02-12 06:48

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:28

    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:33

    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:34

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

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

    If you just want to get the .jpg part of http://example.com/file.jpg then just use Path.GetExtension as heringer suggests.

    // The following evaluates to ".jpg"
    Path.GetExtension("http://example.com/file.jpg")
    

    If the download link is something like http://example.com/this_url_will_download_a_file then the filename will be contained as part of the Content-Disposition, a HTTP header that is used to suggest a filename for browsers that display a "save file" dialog. If you want to get this filename then you can use the technique suggested by Get filename without Content-Disposition to initiate the download and get the HTTP headers, but cancel the download without actually downloading any of the file

    HttpWebResponse res = (HttpWebResponse)request.GetResponse();
    using (Stream rstream = res.GetResponseStream())
    {
        string fileName = res.Headers["Content-Disposition"] != null ?
            res.Headers["Content-Disposition"].Replace("attachment; filename=", "").Replace("\"", "") :
            res.Headers["Location"] != null ? Path.GetFileName(res.Headers["Location"]) : 
            Path.GetFileName(url).Contains('?') || Path.GetFileName(url).Contains('=') ?
            Path.GetFileName(res.ResponseUri.ToString()) : defaultFileName;
    }
    res.Close();
    
    0 讨论(0)
  • 2021-02-12 07:44

    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:45

    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)
提交回复
热议问题