Удалить загруженный файл, если он не перемещен в другую папку - PullRequest
3 голосов
/ 21 декабря 2011

Я разрабатываю систему комментирования с asp.net. Пользователь может прикрепить изображение с помощью кнопки «Прикрепить» и опубликовать комментарий с помощью кнопки «Опубликовать». Загрузка изображения начинается, когда пользователь присоединяет его. Обработчик ASHX сохраняет загруженный файл в папку «temp». Если пользователь нажимает кнопку «Опубликовать», я перемещаю изображение в безопасное место. Если он не нажимает «Опубликовать», закрывает браузер и уходит, файл остается в папке «temp». Как я могу удалить файл из этой «временной» папки через час после загрузки?

подробности: Я подумал, используя System.Timers.Timer в файле Ashx, используемом для загрузки

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();
}

но я чувствую, что делаю неправильно.

Таймер срабатывает через 3 секунды, но HttpContext.Current в функции timer_Elapsed () возвращает ноль. Кроме того, имя файла также возвращает ноль после таймера. Я не смог найти способ передать имя файла в качестве параметра при привязке события. Просто это проблематично. Я ищу более элегантный способ удаления загруженного файла через час.

Ответы [ 2 ]

2 голосов
/ 21 декабря 2011

Я бы не использовал таймеры, так как вы создадите один таймер для файла, который не будет очень хорошо масштабироваться.

Как насчет этого, запустить процесс очистки в другом потоке в веб-приложении, запущенном при запуске приложения, который будет удалять временные файлы каждый раз по истечении сеанса. Таким образом, вам не нужны таймеры, так как процесс будет запрашиваться каждый раз, когда заканчивается сеанс. Вам понадобится класс для хранения ссылки (по уникальному имени, я полагаю) на файл, который еще жив (под этим я подразумеваю сеанс, к которому они принадлежат, все еще жив), который может проверить чистый процесс.

LMK, если вы хотите несколько указателей кода.

1 голос
/ 21 декабря 2011

HttpContext.Current должен быть нулевым, так как контекст умер , как только был отправлен ответ.

Если бы вы использовали unix, я бы предложил написать скрипт и запустить с использованием cron.Но, кажется, вы используете Windows.

Итак, напишите программу (exe), которая удаляет файлы (даже лучше только файлы изображений) из временной папки на основе даты создания.Google, и вы найдете много учебника, как это сделать.Удаление файла - это одна строка кода.Если вы используете системный временный каталог, это еще одна строка кода.Если вы используете пользовательский временный каталог, вы уже знаете путь.Если вы хотите проверить свойство времени создания (или свойство последнего изменения времени), вам нужно написать еще несколько строк.

Теперь запланируйте exe согласно вашему требованию, используя диспетчер задач Windows.Или вы можете использовать сторонние менеджеры задач, доступные для Windows.

...