Descargar/transmitir archivo desde URL: asp.net
Necesito transmitir un archivo que hará que se guarde como mensaje en el navegador. El problema es que el directorio donde se encuentra el archivo está virtualmente asignado, por lo que no puedo usar Server.MapPath para determinar su ubicación real. El directorio no está en la misma ubicación (ni siquiera en el servidor físico en las cajas en vivo) que el sitio web.
Me gustaría algo como lo siguiente, pero eso me permitirá pasar una URL web y no la ruta del archivo del servidor.
Es posible que tenga que terminar construyendo la ruta de mi archivo a partir de una ruta base de configuración y luego agregar el resto de la ruta, pero espero poder hacerlo de esta manera.
var filePath = Server.MapPath(DOCUMENT_PATH);
if (!File.Exists(filePath))
return;
var fileInfo = new System.IO.FileInfo(filePath);
Response.ContentType = "application/octet-stream";
Response.AddHeader("Content-Disposition", String.Format("attachment;filename=\"{0}\"", filePath));
Response.AddHeader("Content-Length", fileInfo.Length.ToString());
Response.WriteFile(filePath);
Response.End();
Puede utilizar HttpWebRequest para obtener el archivo y transmitirlo al cliente. Esto le permite obtener el archivo con una URL. Un ejemplo de esto que encontré (pero no recuerdo dónde dar crédito) es
//Create a stream for the file
Stream stream = null;
//This controls how many bytes to read at a time and send to the client
int bytesToRead = 10000;
// Buffer to read bytes in chunk size specified above
byte[] buffer = new Byte[bytesToRead];
// The number of bytes read
try
{
//Create a WebRequest to get the file
HttpWebRequest fileReq = (HttpWebRequest) HttpWebRequest.Create(url);
//Create a response for this request
HttpWebResponse fileResp = (HttpWebResponse) fileReq.GetResponse();
if (fileReq.ContentLength > 0)
fileResp.ContentLength = fileReq.ContentLength;
//Get the Stream returned from the response
stream = fileResp.GetResponseStream();
// prepare the response to the client. resp is the client Response
var resp = HttpContext.Current.Response;
//Indicate the type of data being sent
resp.ContentType = MediaTypeNames.Application.Octet;
//Name the file
resp.AddHeader("Content-Disposition", "attachment; filename=\"" + fileName + "\"");
resp.AddHeader("Content-Length", fileResp.ContentLength.ToString());
int length;
do
{
// Verify that the client is connected.
if (resp.IsClientConnected)
{
// Read data into the buffer.
length = stream.Read(buffer, 0, bytesToRead);
// and write it out to the response's output stream
resp.OutputStream.Write(buffer, 0, length);
// Flush the data
resp.Flush();
//Clear the buffer
buffer = new Byte[bytesToRead];
}
else
{
// cancel the download if client has disconnected
length = -1;
}
} while (length > 0); //Repeat until no data is read
}
finally
{
if (stream != null)
{
//Close the input stream
stream.Close();
}
}
Descargue la URL a bytes y convierta los bytes en secuencia:
using (var client = new WebClient())
{
var content = client.DownloadData(url);
using (var stream = new MemoryStream(content))
{
...
}
}