2010-04-22 10 views
8

Je dois mettre en œuvre l'exportation GEDCOM sur mon site.Response.TransmitFile et le supprimer après la transmission

Mon code .net a créé un fichier sur le serveur lorsque l'exportation vers gedcom a été cliquée.

Ensuite, je dois le télécharger sur le client depuis le serveur, ainsi que l'utilisateur doit être demandé où enregistrer ce fichier, ce qui signifie que saveialog est nécessaire. Après le téléchargement, je veux supprimer ce fichier du serveur.

J'obtenu un code à transmettre le fichier du serveur au client:

Response.ContentType = "text/xml"; 
Response.AppendHeader("Content-Disposition", "attachment; filename=" + FileName); 
Response.TransmitFile(Server.MapPath("~/" + FileName)); 
Response.End(); 

de cette LINK

mais je ne suis pas en mesure de supprimer le fichier après ce code comme Response.End termine réponse si tout le code écrit après que cette ligne n'est pas exécutée.

Si je code pour supprimer le fichier avant Response.End();, le fichier n'est pas transmis et j'obtiens une erreur.

Répondre

20

Tout ce que vous mettez après Response.End gagné Ne pas être exécuté car il déclenche ThreadAbortException pour arrêter l'exécution de la page à ce stade.

Essayez ceci:

string responseFile = Server.MapPath("~/" + FileName); 

try{ 
    Response.ContentType = "text/xml"; 
    Response.AppendHeader("Content-Disposition", "attachment; filename=" + FileName); 
    Response.TransmitFile(responseFile); 
    Response.Flush(); 
} 
finally { 
    File.Delete(responseFile); 
} 
+1

Qu'est-ce que Response.Flush fait et que Response.End fait? peut s'il vous plaît laissez-moi savoir la différence? – Radhi

+0

Response.Flush force toute sortie mise en mémoire tampon (s'il y en a) mais ne lance pas l'exception ThreadAbortException - la réponse est toujours en cours. Response.End vide mais renvoie une exception ThreadAbortException qui ne peut pas être arrêtée. Mettre le code de suppression dans le bloc Finally garantit qu'il s'exécutera quel que soit le résultat. – Josh

+6

Cela ne gère pas la situation lorsque l'utilisateur clique sur Annuler dans la boîte de dialogue de téléchargement de fichier. Lorsque cela se produit, une exception HttpException est lancée avec le message "L'hôte distant a fermé la connexion." Le code d'erreur est 0x800703E3. " puis dans le bloc finally, la suppression échoue avec une exception IO - "Le processus ne peut pas accéder au fichier 'C: \ Windows \ TEMP \ tmp5CA3.tmp' car il est utilisé par un autre processus." J'ai ajouté un catch (HttpException) et appelé Response.End() dans le catch et ça a marché pour moi – Colin

2

Si le fichier est assez petit, vous pouvez le charger dans un tableau d'octets de sorte que vous pouvez supprimer le fichier tout en étant capable d'envoyer les données:

Response.ContentType = "text/xml"; 
Response.AppendHeader("Content-Disposition", "attachment; filename=" + FileName); 
string path = Server.MapPath("~/" + FileName); 
byte[] data = File.ReadAllBytes(path); 
File.Delete(path); 
Response.BinaryWrite(data); 
Response.End(); 
+0

Salut, ne Response.TransmitFile et Response.BinaryWrite ont une différence de performace? – Radhi

+0

@Radhi: Pas vraiment. BinaryWrite est bien sûr plus rapide car vous avez déjà les données en mémoire, mais avec le chargement des données, il fait la même chose que TransmitFile. – Guffa