wake-up-neo.com

Ermitteln Sie beim Herunterladen mit WebClient den ursprünglichen Dateinamen

Gibt es eine Möglichkeit, den ursprünglichen Namen einer Datei zu ermitteln, die Sie mit dem WebClient herunterladen, wenn der Uri den Namen nicht enthält? 

Dies geschieht zum Beispiel auf Websites, bei denen der Download von einer dynamischen Seite stammt, deren Name nicht vorher bekannt ist. 

Mit meinem Browser erhält die Datei den falschen Namen. Aber wie kann dies mit dem WebClient geschehen? Z.

        WebClient wc= new WebClient();
        var data=   wc.DownloadData(@"www.sometime.com\getfile?id=123");

Die Verwendung von DownloadFile () ist keine Lösung, da diese Methode vorab einen Dateinamen benötigt.

16
Tim Dams

Sie müssen die Antwortheader untersuchen und prüfen, ob ein Content-Dispositionsheader vorhanden ist, der den tatsächlichen Dateinamen enthält.

WebClient wc = new WebClient();
var data=   wc.DownloadData(@"www.sometime.com\getfile?id=123");
string fileName = "";

// Try to extract the filename from the Content-Disposition header
if (!String.IsNullOrEmpty(wc.ResponseHeaders["Content-Disposition"]))
{
 fileName = wc.ResponseHeaders["Content-Disposition"].Substring(wc.ResponseHeaders["Content-Disposition"].IndexOf("filename=") + 9).Replace("\"", "");
}
30
HaukurHaf

Lesen Sie den Antwortheader "Content-Disposition" mit WebClient.ResponseHeaders

Es sollte sein:

    Content-Disposition: attachment; filename="fname.ext"

ihr Code sollte folgendermaßen aussehen:

string header = wc.ResponseHeaders["Content-Disposition"]??string.Empty;
const string filename="filename=";
int index = header.LastIndexOf(filename,StringComparison.OrdinalIgnoreCase);
if (index > -1)
{
    fileName = header.Substring(index+filename.Length);
}
6
giammin

So rufen Sie den Dateinamen ab, ohne die Datei herunterzuladen:

public string GetFilenameFromWebServer(string url)
{
    string result = "";

    var req = System.Net.WebRequest.Create(url);
    req.Method = "HEAD";
    using (System.Net.WebResponse resp = req.GetResponse())
    {
        // Try to extract the filename from the Content-Disposition header
        if (!string.IsNullOrEmpty(resp.Headers["Content-Disposition"]))
        {
            result = resp.Headers["Content-Disposition"].Substring(resp.Headers["Content-Disposition"].IndexOf("filename=") + 9).Replace("\"", "");
        }
    }

    return result;
}
1
Fidel

Wenn Sie wie ich mit einem Content-Disposition-Header arbeiten müssen, der nicht korrekt formatiert ist oder aus irgendeinem Grund nicht automatisch von der ContentDisposition-Klasse analysiert werden kann, haben Sie hier die Lösung:

string fileName = null;

// Getting file name
var request = WebRequest.Create(url);
request.Method = "HEAD";

using (var response = request.GetResponse())
{
    // Headers are not correct... So we need to parse manually
    var contentDisposition = response.Headers["Content-Disposition"];

    // We delete everything up to and including 'Filename="'
    var fileNameMarker= "filename=\"";
    var beginIndex = contentDisposition.ToLower().IndexOf(fileNameMarker);
    contentDisposition = contentDisposition.Substring(beginIndex + fileNameMarker.Length);

    //We only get the string until the next double quote
    var fileNameLength = contentDisposition.ToLower().IndexOf("\"");
    fileName = contentDisposition.Substring(0, fileNameLength);
}
0
Ogier