удаление файла кеша asp.net - PullRequest
1 голос
/ 09 июня 2011

Я получаю асинхронные загрузки файлов из заполненных сообщений формы пользователя [используя инструмент, использующий iframes]] Я делаю на странице формы, настраивающей поле со скрытым GUID, который я передаю в iframe вСтрока запроса.Затем страница iframe обрабатывает загрузку, используя базовый метод, в соответствии с которым первые 2 знака guid для каталога и следующие 2 для подкаталога, в основном, для предотвращения тысяч файлов в 1 каталоге.

Myпроблема в этомЕсли пользователь загружает изображение и никогда не отправляет форму, файл должен быть удален. Я думаю об использовании объекта кэша, поскольку это среда с одним сервером.Таким образом, после публикации файла страница загрузки файла проверяет объект кэша на предмет postid. Если он находит его, он удаляет существующий файл [они загрузили файл, затем изменил его на новый], он записывает новый файл на диск.Моя проблема в том, что если они загрузят файл и просто никогда не отправят форму, мне нужно удалить файл.Я предполагаю, что могу использовать делегата в объекте кеша, чтобы это исправить?Примерно так: если форма отправляет, она делает недействительным объект кеша, поэтому срок его действия не истекает, и записывает его в базу данных как хороший файл, а если нет, то через 20 минут объект кеша удаляет любое имя файла в своем ключе.Вот код, который у меня есть до сих пор

 protected void Page_Load(object sender, EventArgs e)
    {
        string PostID = Request.QueryString["a"];
        HttpFileCollection hfc = Request.Files;
            for (int i = 0; i < hfc.Count; i++)
            {
                HttpPostedFile hpf = hfc[i];
                if (hpf.ContentLength > 0)
                {

                    if (Cache[PostID] != null)
                    {
        File.Delete(Server.MapPath("~/Uploads/") + 
      Cache[PostID].ToString().Substring(0,2) +
      Cache[PostID].ToString().Substring(2,2) + "/" + Cache[PostID].ToString());
                    }
                    System.IO.FileInfo fe = new System.IO.FileInfo(PostID);
                   string extension = fe.Extension;
                   string Directory1 = PostID.Substring(0, 2);
                   string Directory2 = PostID.Substring(2, 2);
                    if (!Directory.Exists(Server.MapPath("~/Uploads/") +
                        Directory1))
                    {
                       Directory.CreateDirectory(Server.MapPath("~/Uploads/") +
                       Directory1);
                    }
                    if (!Directory.Exists(Server.MapPath("~/Uploads/") +
                    Directory1 + "/" + Directory2)) {
                       Directory.CreateDirectory(Server.MapPath("~/Uploads/") + 
                       Directory1 + "/" + Directory2);
                    }
                    hpf.SaveAs(Server.MapPath("~/Uploads/") + 
                    Directory1 + "/" + Directory2 + "/" + 
                    PostID + "." + extension);

                    Cache.Insert("PostID", 
                    PostID + extension, 
                    null, 
                    System.Web.Caching.Cache.NoAbsoluteExpiration, 
                    TimeSpan.FromMinutes(20));
                }
            }           

Ответы [ 2 ]

2 голосов
/ 09 мая 2012

Просто мысль, но разве нельзя сначала загрузить файлы в промежуточную папку?Переместите файлы в окончательное местоположение при отправке формы.Сделайте предположение, что все файлы, которые все еще находятся в промежуточной папке после определенного периода времени, были оставлены, а затем удалите их с помощью периодически запускаемого сценария.

0 голосов
/ 09 мая 2012

Рассматривали ли вы использовать Session_End() в Global.asax для очистки файлов?Я никогда не использовал это событие.Я могу ошибаться, но, насколько я понимаю, это происходит после завершения сеанса по таймауту или по выходу из системы.

Создание структуры папок на основе первых 4 символов guid не будет уникальным.Столкновение случится.Используйте полный GUID в качестве имени папки.Вы можете сохранить GUID в базе данных, а затем получить GUID и сканировать каталог загрузки, удаляя найденные каталоги.

Временные каталоги Windows доступны в .Net Path.GetTempFileName()

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...