Descargar/transmitir archivo desde URL: asp.net

Resuelto mp3duck asked hace 13 años • 9 respuestas

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();
mp3duck avatar Apr 08 '11 21:04 mp3duck
Aceptado

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();
        }
    }
Dallas avatar Apr 09 '2011 14:04 Dallas

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))
    {
        ...
    }
}   
Berezh avatar Feb 10 '2016 17:02 Berezh