我想知道,为了确保从我的脚本下载的文件将具有我想要的扩展名。
该文件不会出现在以下网址:
http://example.com/this_url_will_download_a_file
或者也许是,但是,我认为我只会使用那种网址:
http://example.com/file.jpg
我不会用Url.Substring(Url.LastIndexOf(".") - 3, 3)
检查它,因为这是一种非常糟糕的方式。
那么,你建议我做什么?
答案 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); 返回指定路径中的文件扩展名,包括前置时间。