有没有办法从URL获取文件扩展名

时间:2014-04-22 19:20:44

标签: .net vb.net file url

我想知道,为了确保从我的脚本下载的文件将具有我想要的扩展名。

该文件不会出现在以下网址:

http://example.com/this_url_will_download_a_file

或者也许是,但是,我认为我只会使用那种网址:

http://example.com/file.jpg

我不会用Url.Substring(Url.LastIndexOf(".") - 3, 3)检查它,因为这是一种非常糟糕的方式。

那么,你建议我做什么?

7 个答案:

答案 0 :(得分:11)

这很奇怪,但确实有效:

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

但是,正如crono所说,它不适用于参数:

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

结果:" .jpg?par = x"

答案 1 :(得分:4)

如果您只想获得.jpg的{​​{1}}部分,请使用Path.GetExtension作为heringer建议。

http://example.com/file.jpg

如果下载链接类似// The following evaluates to ".jpg" Path.GetExtension("http://example.com/file.jpg") ,那么文件名将作为Content-Disposition的一部分包含在内,这是一个HTTP标头,用于为显示“保存文件”的浏览器建议文件名对话。如果你想获得这个文件名,那么你可以使用Get filename without Content-Disposition建议的技术来启动下载并获取HTTP头,但取消下载而不实际下载任何文件

http://example.com/this_url_will_download_a_file

答案 2 :(得分:2)

我知道这是一个老问题,但对于看到这个问题的人可能会有帮助。

从url中获取文件名扩展名的最佳方法,也是参数是使用regex。

您可以使用此模式(仅限网址):

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

说明:

.+     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

示例:

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.

所以你可以像这样使用强大的网址模式:

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

说明:

.+        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

示例:

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+)

再见

答案 3 :(得分:1)

这是我使用的一个简单的。使用参数,绝对和相对URL等,等等。

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

是否进行单元测试

[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("") == "");
}

根据自己的需要进行调整

答案 4 :(得分:0)

这是我的解决方法:

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

首先,我确认自己的网址是有效的网址,然后从本地路径获取文件扩展名。

答案 5 :(得分:0)

有人建议从url请求文件并检查标题。在我看来,这太简单了……

如果URL上存在参数,则鲱鱼回答失败,解决方案很简单,只需查询字符串char Split上的?

string url = @"http://example.com/file.jpg";
string ext = System.IO.Path.GetExtension(url.Split('?')[0]);

答案 6 :(得分:0)

VirtualPathUtility.GetExtension(yourPath); 返回指定路径中的文件扩展名,包括前置时间。