3 Stimmen

Hochgeladene Datei löschen, wenn sie nicht in einen anderen Ordner verschoben wird

Ich entwickle ein Kommentarsystem mit asp.net. Ein Benutzer kann ein Bild mit der Schaltfläche "Attach" anhängen und den Kommentar mit der Schaltfläche "Post" veröffentlichen. Das Hochladen des Bildes beginnt, wenn der Benutzer es anhängt. Ein ASHX-Handler speichert die hochgeladene Datei im Ordner "temp". Wenn der Benutzer auf die Schaltfläche "Posten" klickt, verschiebe ich das Bild an einen sicheren Ort. Wenn er nicht auf "Posten" klickt, den Browser schließt und weggeht, bleibt die Datei im "temp"-Ordner. Wie kann ich eine Datei eine Stunde nach dem Hochladen aus diesem "temp"-Ordner löschen?

Einzelheiten: Ich dachte, die Verwendung von System.Timers.Timer in der für das Hochladen verwendeten ashx-Datei

System.Timers.Timer timer = new System.Timers.Timer(300);
string fileName;

public void Cleaner()
{
    System.Timers.Timer timer = new System.Timers.Timer(300); //3 second
    timer.Elapsed += new System.Timers.ElapsedEventHandler(timer_Elapsed);
    timer.Start();
}

protected void timer_Elapsed(object sender, System.Timers.ElapsedEventArgs a)
{
    timer.Stop();
    timer.Close();

    string path = "temp";
    string mapPath = HttpContext.Current.Server.MapPath("../" + path);
    FileInfo TheFile = new FileInfo(mapPath + "\\" + fileName);
    if (TheFile.Exists) File.Delete(mapPath + "\\" + fileName);
}

public void ProcessRequest(HttpContext context)
{
    //Saving uploaded file
    Cleaner();
}

aber ich habe das Gefühl, dass ich nicht das Richtige tue.

Der Timer tickt nach 3 Sekunden, aber HttpContext.Current in der Funktion timer_Elapsed() gibt null zurück. Außerdem gibt der Dateiname nach Ablauf des Timers ebenfalls null zurück. Ich konnte keine Möglichkeit finden, den Dateinamen als Parameter beim Binden eines Ereignisses zu übergeben. Das ist einfach problematisch. Ich suche nach einer eleganteren Möglichkeit, die hochgeladene Datei nach einer Stunde zu löschen.

2voto

Myles McDonnell Punkte 12413

Ich würde Timer vermeiden, da Sie einen Timer pro Datei erstellen, was nicht sehr gut skalierbar ist.

Wie wäre es damit, einen Aufräumprozess in einem anderen Thread in der Webanwendung laufen zu lassen, der beim Start der Anwendung gestartet wird und die temporären Dateien jedes Mal löscht, wenn eine Sitzung abläuft. Auf diese Weise benötigen Sie keine Timer, da der Prozess jedes Mal, wenn eine Sitzung abläuft, angefordert wird. Sie benötigen eine Klasse, die einen Verweis (mit einem eindeutigen Namen, schätze ich) auf die Dateien speichert, die noch aktiv sind (damit meine ich, dass die Sitzung, zu der sie gehören, noch aktiv ist) und die der Bereinigungsprozess überprüfen kann.

Bitte melden Sie sich, wenn Sie Hinweise auf den Code benötigen.

1voto

Sarwar Erfan Punkte 17874

HttpContext.Current sollte null sein, da der Kontext gestorben ist sobald Antwort wurde gesendet.

Wenn Sie Unix verwenden, würde ich vorschlagen, ein Skript zu schreiben und mit Cron auszuführen. Aber Sie scheinen Windows zu verwenden.

Schreiben Sie also ein Programm (exe), das Dateien (am besten nur Bilddateien) anhand des Erstellungsdatums aus dem Temp-Verzeichnis löscht. Googeln Sie und Sie werden viele Anleitungen finden, wie man das macht. Das Löschen einer Datei ist nur eine Zeile Code. Wenn Sie das System-Temp-Verzeichnis verwenden, ist das eine weitere Zeile Code. Wenn Sie ein benutzerdefiniertes temporäres Verzeichnis verwenden, kennen Sie den Pfad bereits. Wenn Sie die Eigenschaft des Erstellungszeitpunkts (oder des letzten Änderungszeitpunkts) überprüfen wollen, müssen Sie einige weitere Zeilen schreiben.

Planen Sie nun die Exe nach Ihren Anforderungen mit dem Windows Task-Manager. Sie können auch Task-Manager von Drittanbietern verwenden, die für Windows verfügbar sind.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X