2010-04-22 4 views
8

Ich muss GEDCOM-Export in meiner Website implementieren.Response.TransmitFile und löschen Sie es nach der Übertragung

Mein .net-Code erstellt eine Datei auf dem Server, wenn der Export zu gedcom geklickt hat.

Dann muss ich es auf den Client vom Server herunterladen, sowie der Benutzer sollte gefragt werden, wo diese Datei gespeichert werden soll, was bedeutet, dass savedialog erforderlich ist.

Nachdem es heruntergeladen wurde, möchte ich diese Datei vom Server löschen.

Ich habe einen Code-Datei vom Server zum Client übertragen:

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

von diesem LINK

aber ich bin nicht in der Lage, die Datei nach diesem Code als Response.End endet Antwort zu löschen, so was auch immer Code geschrieben Nach dieser Zeile wird nicht ausgeführt.

Wenn ich Code, um Datei vor Response.End(); zu löschen, dann Datei wird nicht übertragen und ich bekomme einen Fehler.

Antwort

20

Alles, was Sie nach Response.End setzen gewonnen Es wird nicht ausgeführt, weil es eine ThreadAbortException auslöst, um die Ausführung der Seite an diesem Punkt zu stoppen.

Versuchen Sie stattdessen:

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

Was Response.Flush tut und was Response.End tut ?? Kann mir bitte einen Unterschied mitteilen? – Radhi

+0

Response.Flush erzwingt jede gepufferte Ausgabe (falls vorhanden), wirft aber die ThreadAbortException nicht ab - die Antwort wird noch ausgeführt. Response.End löscht, löst dann jedoch eine ThreadAbortException aus, die nicht gestoppt werden kann. Durch das Einfügen des Löschcodes in den Block "Finally" wird sichergestellt, dass er unabhängig vom Ergebnis ausgeführt wird. – Josh

+6

Dies funktioniert nicht, wenn der Benutzer im Dateidownload-Dialogfeld auf Abbrechen klickt. Wenn das passiert, wird eine HttpException mit der Meldung "Der Remote-Host hat die Verbindung geschlossen. Der Fehlercode ist 0x800703E3." dann schlägt der Delete-Befehl im finally-Block mit einer IOException fehl - "Der Prozess kann nicht auf die Datei 'C: \ Windows \ TEMP \ tmp5CA3.tmp' zugreifen, da sie von einem anderen Prozess verwendet wird." Ich habe einen Haken (HttpException) hinzugefügt und Response.End() innerhalb des Catchs aufgerufen und das hat für mich funktioniert – Colin

2

Wenn die Datei relativ klein ist, können Sie es in einen Byte-Array geladen werden, so dass Sie die Datei löschen können, während noch in der Lage sein, die Daten zu senden:

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

Hallo, hat Response.TransmitFile und Response.BinaryWrite haben einen Unterschied in performace? – Radhi

+0

@Radhi: Nicht wirklich. BinaryWrite ist natürlich schneller, da Sie die Daten bereits im Speicher haben, aber zusammen mit dem Laden der Daten macht es dasselbe wie TransmitFile. – Guffa

Verwandte Themen