subir pesados mvc descargar como bajar archivos archivo c# .net webclient

c# - pesados - Obtenga un nombre de archivo original al descargar con WebClient



descargar c# (4)

Debe examinar los encabezados de respuesta y ver si hay un encabezado de disposición de contenido presente que incluya el nombre de archivo real.

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

¿Hay alguna forma de saber el nombre original de un archivo que descarga utilizando el WebClient cuando Uri no contiene el nombre?

Esto sucede, por ejemplo, en sitios donde la descarga se origina en una página dinámica donde el nombre no se conoce de antemano.

Usando mi navegador, el archivo obtiene el nombre correcto. Pero, ¿cómo se puede hacer esto usando el WebClient? P.ej

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

Usar DownloadFile () no es una solución, ya que este método necesita un nombre de archivo por adelantado.


Lea el encabezado de respuesta "Content-Disposition" con WebClient.ResponseHeaders

Debería ser:

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

su código debe verse como

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


Para obtener el nombre de archivo sin descargar el archivo:

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


Si usted, como yo, tiene que lidiar con un encabezado de Disposición de contenido que no está formateado correctamente o que la clase ContentDisposition no puede analizar automáticamente por alguna razón, aquí está mi solución:

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