Есть ли способ получить расширение файла из URL-адреса

Я хочу знать, чтобы убедиться, что файл, который будет загружен из моего скрипта, будет иметь желаемое расширение.

Файл не будет по URL-адресам, таким как:

http://example.com/this_url_will_download_a_file

Или, может быть, да, но я думаю, что я буду использовать только такой URL:

http://example.com/file.jpg

Я не буду проверять это с: Url.Substring(Url.LastIndexOf(".") - 3, 3), потому что это очень плохой способ.

Итак, что вы рекомендуете мне делать?

Ответ 1

Это странно, но он работает:

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

result: ".jpg? par = x"

Ответ 2

Если вы просто хотите получить .jpg часть http://example.com/file.jpg, просто используйте Path.GetExtension как heringer.

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

Если ссылка для скачивания похожа на http://example.com/this_url_will_download_a_file, то имя файла будет содержаться как часть Content-Disposition, заголовок HTTP который используется для указания имени файла для браузеров, отображающих диалог "сохранить файл". Если вы хотите получить это имя файла, вы можете использовать технику, предложенную Получить имя файла без Content-Disposition, чтобы инициировать загрузку и получить заголовки HTTP, но отменить загрузку без фактически загружая любой файл

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

Ответ 3

Я знаю, что это старый вопрос, но он может быть полезен людям, которые видят этот вопрос.

Наилучший подход для получения расширения от имени файла внутри URL, также с параметрами - с помощью регулярных выражений.

Вы можете использовать этот шаблон (не только URL):

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

Таким образом, вы можете использовать сильный шаблон для URL-адресов, например:

.+\/{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+)

Ответ 4

здесь я использую простой. Работает с параметрами, с абсолютными и относительными URL и т.д. И т.д.

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

Unit тест, если вы будете

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

Настройтесь на свои собственные потребности

Ответ 5

Вот мое решение:

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

Сначала я проверяю, что мой URL-адрес является действительным, а затем я получаю расширение файла из локального пути.

Ответ 6

Некоторые предложили запросить файл с URL и проверить заголовки. Это излишество для чего-то настолько простого, на мой взгляд, так...

Heringers ответить не будет, если параметры присутствуют в URL-адресе, решение простое, просто Split строку запроса char ? ,

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

Ответ 7

VirtualPathUtility.GetExtension(yourPath); Возвращает расширение файла по указанному пути, включая начальный период.