Envoi d'un fichier sur HttpContext provoque navigateur pour bloquer
-
23-08-2019 - |
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();
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.