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.
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("\"", "");
}
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);
}
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;
}
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);
}