Question

Je vous envoie un fichier à l'utilisateur à l'aide d'un HttpHandler. Sur tous les navigateurs, après avoir vu / télécharger le fichier au moins une fois, le navigateur / application sur des vues / bloque les téléchargements. Voici le code:

    private void TransmitFile(HttpContext context, string filePath, string downloadName, bool forceDownload)
    {
        if (File.Exists(filePath))
        {
            string fileName = System.IO.Path.GetFileName(filePath);
            string extension = Path.GetExtension(filePath);
            FileInfo fileInfo = new FileInfo(filePath);

            // set the response info/headers
            context.Response.ClearContent();
            context.Response.ClearHeaders();
            context.Response.AddHeader("Content-Length", fileInfo.Length.ToString());
            if (forceDownload)
            {
                context.Response.AddHeader("Content-Disposition", "attachment; filename=" + downloadName.Replace(" ", "_") + extension);
                context.Response.BufferOutput = false;
            }

            string type = "";
            // set known types based on file extension  
            if (extension != null)
            {
                switch (extension.ToLower())
                {
                    case ".tif":
                    case ".tiff":
                        type = "image/tiff";
                        break;
                    case ".jpg":
                    case ".jpeg":
                        type = "image/jpeg";
                        break;
                    case ".gif":
                        type = "image/gif";
                        break;
                    case ".doc":
                    case ".rtf":
                        type = "Application/msword";
                        break;
                    case "pdf":
                        type = "Application/pdf";
                        break;
                    case "png":
                        type = "image/png";
                        break;
                    case "bmp":
                        type = "image/bmp";
                        break;
                    default:
                        type = "application/octet-stream";
                        break;
                }
            }

            context.Response.ContentType = type;
            context.Response.TransmitFile(filePath);
            context.Response.Flush();
        }
        else
        {
            Immersive.Diagnostics.Log.Warn("Requested file does not exist: " + filePath, this);
            Immersive.Diagnostics.Log.Warn("", this);
        }
    }

J'ai lu que l'appel Response.Close () et Response.End () ne sont pas une bonne idée? Ont essayé les deux en laissant, et enlever, et il arrive encore.

EDIT:

Il semble que TransmitFile a des problèmes connus. Vous trouverez une explication plus approfondie à: http: // www. improve.dk/blog/2008/03/29/response-transmitfile-close-will-kill-your-application

J'ai enlevé et changé pour TransmitFile WriteFile, et il fonctionne maintenant parfaitement.

context.Response.WriteFile(filePath);
context.Response.Flush();
context.Response.Close();
Était-ce utile?

La solution

Cela peut être un problème connu si le serveur que vous téléchargez à partir exécute Windows Server 2003 SP1.

Voici un correctif: http://support.microsoft.com/kb/902780

En outre, vérifiez si vous avez OutputCache activé sur la page, le cas échéant, essayez à nouveau le téléchargement sans.

Autres conseils

Quel est le motif que vous n'êtes pas en utilisant la mise en mémoire tampon? Vous êtes flush () uant il, même si vous ne l'utilisez pas. Et oui, je pense que vous devriez aussi faire un Response.End () après la flush ().

Faites-moi savoir si cela fonctionne et peut-être que je peux faire quelques tests de mon propre.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top