2014-04-22 2 views
10

Ich möchte wissen, dass für, stellen Sie sicher, dass die Datei, die von meinem Skript heruntergeladen werden wird, die Erweiterung, die ich will.Gibt es eine Möglichkeit, die Dateierweiterung von einer URL zu bekommen

http://example.com/this_url_will_download_a_file 

Oder vielleicht ja, aber ich denke, dass ich nur diese Art von URL verwenden:

Die Datei wie nicht auf Urls seine

http://example.com/file.jpg 

Ich werde es nicht überprüfen mit: Url.Substring(Url.LastIndexOf(".") - 3, 3) weil das ein sehr schlechter Weg ist.

Also, was empfehlen Sie mir zu tun?

+0

Sie könnten versuchen, letzte Position zu bekommen?. Wenn gefunden, finde die letzte Position von. vorher und zurück alles dazwischen. Wenn nein? gefunden wird, was immer nach der letzten Position von kommt. wird deine Dateierweiterung sein. – Crono

+0

Substring sollte funktionieren, stellen Sie sicher, dass Sie für Erweiterungen mit einer Länge von mehr als 3 Konto. – Neolisk

+0

Sind Sie derjenige der URLs zur Verfügung stellt? Sind sie auf Ihrer eigenen Website oder Websites von Drittanbietern? –

Antwort

6

Es ist seltsam, aber es funktioniert:

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

aber als crono unten bemerkt, wird es nicht mit den Parametern arbeiten:

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

Ergebnis: ".jpg par = x"

+0

Es wird nicht mit parametrisierten Abfragen funktionieren. – Crono

+0

Ja, Crono hat Recht, ich habe es nicht kommen sehen :) – heringer

3

Wenn Sie nur den .jpg Teil von http://example.com/file.jpg bekommen möchten, dann verwenden Sie einfach Path.GetExtension wie heringer schlägt vor.

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

Wenn der Download-Link ist so etwas wie http://example.com/this_url_will_download_a_file dann der Dateiname wird als Teil der Content-Disposition enthalten sein, ein HTTP-Header, die verwendet wird, einen Dateinamen für Browser vorzuschlagen, die ein „Datei speichern“ -Dialog anzuzeigen. Wenn Sie diesen Dateinamen erhalten möchten, dann können Sie die Technik von Get filename without Content-Disposition vorgeschlagen verwenden, um den Download zu initiieren und die HTTP-Header, aber brechen Sie den Download, ohne tatsächlich eine der Datei herunterzuladen

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

Ich weiß, dass dies eine ist alte Frage, aber kann für Leute hilfreich sein, die diese Frage sehen.

Der beste Ansatz, um Dateinamenerweiterung innerhalb einer URL zu erhalten, auch mit Parametern, sind mit Regex.

Sie können dieses Muster verwenden (nicht Urls only):

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

Erläuterung:

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

Beispiel:

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. 

So können Sie ein starkes Muster für Urls verwenden wie dies:

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

Erläuterung:

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

Beispiel:

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

Verwandte Themen