c# - org - Obtén el nombre del archivo mientras lo descargas
mapwindows 5 (5)
Aquí está el código completo requerido, asumiendo que el servidor ha aplicado el encabezado de disposición de contenido:
using (WebClient client = new WebClient())
{
using (Stream rawStream = client.OpenRead(url))
{
string fileName = string.Empty;
string contentDisposition = client.ResponseHeaders["content-disposition"];
if (!string.IsNullOrEmpty(contentDisposition))
{
string lookFor = "filename=";
int index = contentDisposition.IndexOf(lookFor, StringComparison.CurrentCultureIgnoreCase);
if (index >= 0)
fileName = contentDisposition.Substring(index + lookFor.Length);
}
if (fileName.Length > 0)
{
using (StreamReader reader = new StreamReader(rawStream))
{
File.WriteAllText(Server.MapPath(fileName), reader.ReadToEnd());
reader.Close();
}
}
rawStream.Close();
}
}
Si el servidor no configuró este encabezado, intente la depuración y vea qué ResponseHeaders tiene, uno de ellos probablemente contendrá el nombre que desea. Si el navegador muestra el nombre, debe venir de algún lugar ... :)
Estamos proporcionando archivos que se guardan en nuestra base de datos y la única manera de recuperarlos es por su id
como en:
www.AwesomeURL.com/AwesomeSite.aspx?requestedFileId=23
Todo funciona correctamente mientras uso la Clase de WebClient .
Solo hay un problema al que me enfrento:
¿Cómo puedo obtener el nombre de archivo real ?
Mi código se parece a este cajero automático:
WebClient client = new WebClient ();
string url = "www.AwesomeURL.com/AwesomeSite.aspx?requestedFileId=23";
client.DownloadFile(url, "IDontKnowHowToGetTheRealFileNameHere.txt");
Todo lo que sé es la identificación .
Esto no sucede cuando intento acceder a la url
desde el navegador donde se encuentra el nombre correcto => DownloadedFile.xls .
¿Cuál es la forma correcta de obtener la respuesta correcta?
Debe mirar el encabezado de content-disposition
través de:
string disposition = client.ResponseHeaders["content-disposition"];
Un ejemplo típico sería:
"attachment; filename=IDontKnowHowToGetTheRealFileNameHere.txt"
Esto lo logro con el código de wst.
Aquí está el código completo para descargar el archivo url en la carpeta c: / temp
public static void DownloadFile(string url)
{
using (WebClient client = new WebClient())
{
client.OpenRead(url);
string header_contentDisposition = client.ResponseHeaders["content-disposition"];
string filename = new ContentDisposition(header_contentDisposition).FileName;
//Start the download and copy the file to the destinationFolder
client.DownloadFile(new Uri(url), @"c:/temp/" + filename);
}
}
Puede usar el encabezado de content-disposition
HTTP para sugerir nombres de archivos para el contenido que está proporcionando:
Content-Disposition: attachment; filename=downloadedfile.xls;
Por lo tanto, en su script AwesomeSite.aspx
, debe establecer el encabezado de content-disposition
. En su clase de WebClient
, recuperaría ese encabezado para guardar el archivo como lo sugiere su sitio AwesomeSite
.
Tuve el mismo problema y encontré esta clase: System.Net.Mime.ContentDisposition .
using (WebClient client = new WebClient()){
client.OpenRead(url);
string header_contentDisposition = client.ResponseHeaders["content-disposition"];
string filename = new ContentDisposition(header_contentDisposition).FileName;
...do stuff...
}
La documentación de la clase sugiere que está diseñada para archivos adjuntos de correo electrónico, pero funciona bien en el servidor que solía probar, y es realmente bueno evitar el análisis.