2014-04-22 9 views
10

Chcę to wiedzieć, aby upewnić się, że plik, który będzie pobierany z mojego skryptu, będzie miał wymagane rozszerzenie.Czy jest jakiś sposób, aby uzyskać rozszerzenie pliku z adresu URL:

Plik nie będzie w adresach URL, takich jak:

http://example.com/this_url_will_download_a_file 

A może tak, ale myślę, że będę używać tylko tego rodzaju URL:

http://example.com/file.jpg 

nie będę go sprawdzić z: Url.Substring(Url.LastIndexOf(".") - 3, 3), ponieważ jest to bardzo zły sposób.

Więc, co mam polecić?

+0

Można spróbować dostać ostatnią pozycję?. Jeśli znajdziesz, znajdź ostatnią pozycję. przedtem i zwróć wszystko pomiędzy. Jeśli nie ? znajduje się, cokolwiek przyjdzie po ostatniej pozycji. będzie twoim rozszerzeniem pliku. – Crono

+0

Podciąg powinien działać, po prostu upewnij się, że uwzględniasz rozszerzenia o długości większej niż 3. – Neolisk

+0

czy to Ty podajesz adresy URL? Czy są do Twojej witryny lub stron trzecich? –

Odpowiedz

6

To dziwne, ale to działa:

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

ale jak Crono zauważył poniżej, to nie będzie działać z parametrami:

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

wynik: ".jpg par = x"

+0

Nie będzie działać z zapytaniami sparametryzowanymi. – Crono

+0

tak, crono ma rację, nie widziałem tego nadchodzi :) – heringer

3

Jeśli chcesz tylko uzyskać .jpg część z http://example.com/file.jpg, po prostu użyj Path.GetExtension jako heringer sugeruje.

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

Jeśli link do pobrania jest coś http://example.com/this_url_will_download_a_file następnie nazwa pliku zostanie zawarta jako część Content-Disposition, nagłówek HTTP, który jest używany do zaproponować nazwę pliku dla przeglądarek, które wyświetli okno dialogowe „Zapisz plik”. Jeśli chcesz dostać tę nazwę, a następnie można użyć techniki zaproponowane przez Get filename without Content-Disposition aby rozpocząć pobieranie i uzyskać nagłówki HTTP, ale anulować pobieranie bez faktycznego pobierania dowolnego pliku

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

wiem, że jest to stare pytanie, ale może być pomocne dla osób, które widzą to pytanie.

Najlepsze podejście do uzyskania rozszerzenia z nazwy pliku wewnątrz adresu URL, również z parametrami, to wyrażenie regularne.

Można użyć tego wzorca (nie tylko adresy URL):

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

Objaśnienie:

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

Przykład:

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. 

Więc można użyć silny wzorzec dla URL, takich jak to:

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

Objaśnienie:

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

Przykład:

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

Bye