Réponse.TransMitFile Ne pas télécharger et jeter aucune erreur
-
14-11-2019 - |
Question
J'utilise actuellement une HTTPresponse pour télécharger des fichiers de mon serveur.J'ai déjà quelques fonctions utilisées pour télécharger des fichiers Excel / Word, mais j'ai des difficultés à obtenir mon fichier texte simple (.txt) à télécharger.
Avec le fichier texte, je suis fondamentalement dumping du contenu d'une zone de texte dans un fichier, essayant de télécharger le fichier avec le HTTPResponse, puis supprimez le fichier texte temporaire.
Voici un exemple de mon code qui fonctionne pour les documents Excel / Word:
protected void linkInstructions_Click(object sender, EventArgs e)
{
String FileName = "BulkAdd_Instructions.doc";
String FilePath = Server.MapPath("~/TempFiles/BulkAdd_Instructions.doc");
System.Web.HttpResponse response = System.Web.HttpContext.Current.Response;
response.ClearContent();
response.Clear();
response.ContentType = "application/x-unknown";
response.AddHeader("Content-Disposition", "attachment; filename=" + FileName + ";");
response.TransmitFile(FilePath);
response.Flush();
response.End();
}
Et voici le morceau du code qui ne fonctionne pas.
Notez que le code fonctionne sans lancer d'erreurs.Le fichier est créé et supprimé, mais jamais jeté à l'utilisateur.
protected void saveLog(object sender, EventArgs e)
{
string date = DateTime.Now.ToString("MM_dd_yyyy_hhmm"); // Get Date/Time
string fileName = "BulkLog_"+ date + ".txt"; // Stitch File Name + Date/Time
string logText = errorLog.Text; // Get Text from TextBox
string halfPath = "~/TempFiles/" + fileName; // Add File Name to Path
string mappedPath = Server.MapPath(halfPath); // Create Full Path
File.WriteAllText(mappedPath, logText); // Write All Text to File
System.Web.HttpResponse response = System.Web.HttpContext.Current.Response;
response.ClearContent();
response.Clear();
response.ContentType = "text/plain";
response.AddHeader("Content-Disposition", "attachment; filename=" + fileName);
response.TransmitFile(mappedPath); // Transmit File
response.Flush();
System.IO.File.Delete(mappedPath); // Delete Temporary Log
response.End();
}
La solution 5
J'ai fini par résoudre le problème seul.Il s'avère que c'était un problème Ajax ne permettant pas à mon bouton de poster correctement.Cela a arrêté le transmetteur d'être tiré.
Merci pour l'aide!
Autres conseils
C'est parce que vous supprimez le fichier avant de pouvoir envoyer.
de msdn - httpresponse.end la méthode
envoie toutes les sorties tamponnées actuellement à le client, arrête l'exécution de la page, et soulève l'événement EndRequest.
Essayez de mettre votre système.file.file.delete (MappedPath);ligne après la réponse.end ();Dans mon test, il semblait alors de travailler.
En outre, une bonne idée peut être une bonne idée de vérifier si le fichier existe d'abord, je ne peux voir aucun fichier.exists de là, ne voulez pas d'exceptions de référence NULLL et de définir la longueur du contenu.
Edit: Voici le code que j'ai utilisé dans un projet au travail il y a un moment, pourrait vous aider à sortir un peu.
// 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 }
Et voici la méthode FileType que j'ai utilisée
//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"; } }
J'ai trébuché sur ce post dans ma recherche et remarqua que ce n'était pas utile pour nous dire pourquoi l'UpdatePanel a provoqué la question de la première place.
L'UpdatePanel est un post-pack asynchrone et une réponse .TransMitFile a besoin d'un post-plan complet pour fonctionner correctement.
Le contrôle qui déclenche le post-planche asynchrone doit être effectué une gâchette dans le Panneau Update:
<Triggers>
<asp:PostBackTrigger ControlID="ID_of_your_control_that_causes_postback" />
</Triggers>
Merci pour le suivi de votre problème.J'ai passé des heures à essayer de comprendre pourquoi aucun code d'erreur n'a été lancé malgré le fait que rien ne s'est passé.S'avère que c'était mon ajax updatepanel mystérieusement et secrètement de la route.