Pregunta

Estoy intentando usuario la Response.TransmitFile () para una descarga rápida. He leído una serie de mensajes sobre el tema y en base a mi método fuera el blog de Rick Strahl http://www.west-wind.com/weblog/posts/76293.aspx

La única diferencia (que puedo decir) es que estoy apuntando a un archivo físico fuera del directorio virtual. Este código se llama en un RadGrid Ajaxified ... Me pregunto si el Response.TransmitFile no funciona con llamadas AJAX? Aquí está mi fragmento de código:

            // Get the physical Path of the file
            string docFilePath = (string)args.AttachmentKeyValues["DocFilePath"];

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

            // Checking if file exists
            if (file.Exists)
            {
                Response.ClearContent();

                Response.AddHeader("Content-Disposition", "attachment; filename=" + file.Name);


                Response.AddHeader("Content-Length", file.Length.ToString());


                Response.ContentType = ReturnExtension(file.Extension.ToLower());


                Response.TransmitFile(file.FullName);

                Response.End();
            }

Vea el sistema sabe que el archivo existe ... se hace a través de la Response.End () sin error ... entonces continúa la aplicación adecuada ... excepto que no hay descarga del sistema.

El método ReturnExtension se levanta desde otro sitio (lo siento, no puedo recordar dónde!) De la siguiente manera

    string ReturnExtension(string fileExtension)
    {
        // In the long run this should go in a class
        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";
        }
    }
¿Fue útil?

Solución

Este problema es que no puedo hacer Response.TransmitFile () a partir de una llamada AJAX. Después de leer algunos blogs que utilizo la devolución de datos asincrónica para establecer el src de un iframe invisible. El iframe envía el archivo en su evento de carga.

Otros consejos

Me imagino que el código haciendo la transmisión no tiene los derechos para abrir ese archivo. Se puede llamar TransmitFile con un identificador de archivo ya está abierto? Eso debería funcionar mejor.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top