Saltar al contenido

Response.TransmitFile no se descarga y no arroja errores

Solución:

Es porque está eliminando el archivo antes de que pueda enviarse.

Desde MSDN – Método HttpResponse.End

Envía todos los resultados almacenados en búfer al cliente, detiene la ejecución de la página y genera el evento EndRequest.

Intente poner su System.IO.File.Delete (mappedPath); línea después de la respuesta.End (); en mi prueba en ese momento parecía estar funcionando.

Además, podría ser una buena idea verificar si el archivo existe primero, no puede ver ningún archivo. Existe allí, no desea ninguna excepción de referencia nula y establecer la Longitud del contenido.

EDITAR: aquí está el código que usé en un proyecto en el trabajo hace un tiempo, podría ayudarlo un poco.

// Get the physical Path of the file
string filepath = System.Web.Hosting.HostingEnvironment.ApplicationPhysicalPath + folder + filename;

// Create New instance of FileInfo class to get the properties of the file being downloaded
FileInfo file = new FileInfo(filepath);

// Checking if file exists
if (file.Exists)
{                            
    // Clear the content of the response
    Response.ClearContent();

    // LINE1: Add the file name and attachment, which will force the open/cance/save dialog to show, to the header
    Response.AddHeader("Content-Disposition", String.Format("attachment; filename={0}", file.Name));

    // Add the file size into the response header
    Response.AddHeader("Content-Length", file.Length.ToString());

    // Set the ContentType
    Response.ContentType = ReturnFiletype(file.Extension.ToLower());

    // Write the file into the response (TransmitFile is for ASP.NET 2.0. In ASP.NET 1.1 you have to use WriteFile instead)
    Response.TransmitFile(file.FullName);

    // End the response
    Response.End();

    //send statistics to the class
}

Y aquí está el método Filetype que utilicé

//return the filetype to tell the browser. 
//defaults to "application/octet-stream" if it cant find a match, as this works for all file types.
public static string ReturnFiletype(string fileExtension)
{
    switch (fileExtension)
    {
        case ".htm":
        case ".html":
        case ".log":
            return "text/HTML";
        case ".txt":
            return "text/plain";
        case ".doc":
            return "application/ms-word";
        case ".tiff":
        case ".tif":
            return "image/tiff";
        case ".asf":
            return "video/x-ms-asf";
        case ".avi":
            return "video/avi";
        case ".zip":
            return "application/zip";
        case ".xls":
        case ".csv":
            return "application/vnd.ms-excel";
        case ".gif":
            return "image/gif";
        case ".jpg":
        case "jpeg":
            return "image/jpeg";
        case ".bmp":
            return "image/bmp";
        case ".wav":
            return "audio/wav";
        case ".mp3":
            return "audio/mpeg3";
        case ".mpg":
        case "mpeg":
            return "video/mpeg";
        case ".rtf":
            return "application/rtf";
        case ".asp":
            return "text/asp";
        case ".pdf":
            return "application/pdf";
        case ".fdf":
            return "application/vnd.fdf";
        case ".ppt":
            return "application/mspowerpoint";
        case ".dwg":
            return "image/vnd.dwg";
        case ".msg":
            return "application/msoutlook";
        case ".xml":
        case ".sdxl":
            return "application/xml";
        case ".xdp":
            return "application/vnd.adobe.xdp+xml";
        default:
            return "application/octet-stream";
    }
}

Me encontré con esta publicación en mi búsqueda y noté que no era útil para decirnos por qué UpdatePanel causó el problema en primer lugar.

UpdatePanel es una devolución de datos asincrónica, y Response.TransmitFile necesita una devolución de datos completa para funcionar correctamente.

El control que desencadena la devolución de datos asincrónica debe convertirse en un desencadenante en el UpdatePanel:

<Triggers>        
<asp:PostBackTrigger ControlID="ID_of_your_control_that_causes_postback" />
</Triggers>

Gracias por el seguimiento de su problema. Pasé horas tratando de averiguar por qué no se lanzaba ningún código de error a pesar de que no sucedió nada. Resulta que era mi UpdatePanel AJAX que se interponía misteriosa y secretamente en el camino.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *