Создание публичных временных файлов со сроком действия - PullRequest
2 голосов
/ 26 июня 2009

Я создаю небольшое веб-приложение на win2003 с asp.net 2.0. Мне нужно создать небольшие файлы, которые, я полагаю, будут доступны для Интернета, и файлы должны иметь 10-минутное время истечения. Я не нашел никакой поддержки для этого в платформе, и мое другое решение, которое пришло мне на ум, - это запланированное задание, которое очищает файл каждые X минут. Но почему-то я думаю, что я не первый, кто сталкивается с этой проблемой и задается вопросом, есть ли какие-либо другие умные решения.

Заранее спасибо.

Ответы [ 3 ]

2 голосов
/ 26 июня 2009

Не зная больше о том, почему вы делаете это, я думаю, что ваше решение внешней программы для очистки файлов является лучшим решением. Альтернативой может быть сохранение «файлов» в базе данных и создание обработчика, который извлекает данные из базы данных, но только если срок действия «файла» не истек. Затем вы можете гораздо реже планировать задачу очистки в базе данных и при этом обслуживать только «файлы», срок действия которых не истек. Создание их на диске заставит вас регулярно выполнять очистку, чтобы гарантировать, что просроченные элементы больше не будут доступны.

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

0 голосов
/ 26 июня 2009

Является ли целью контроль доступа к файлам для удаленных пользователей?

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

Вот что-то похожее на то, что я делал в прошлом

protected void Button1_Click(object sender, EventArgs e)
        {
            string fileName = @"c:\SecureDirectory\DownloadableFile.txt";
            int exipireMinutes = -10;

            if (System.IO.File.Exists(fileName) && System.IO.File.GetCreationTime(fileName) >= DateTime.Now.AddMinutes(exipireMinutes))
            {
                byte[] fileBinary;
                using (System.IO.FileStream fs = System.IO.File.Open(Server.MapPath(fileName), System.IO.FileMode.Open))
                {
                    fileBinary = new byte[fs.Length];
                    fs.Read(fileBinary, 0, Convert.ToInt32(fs.Length));
                }
                Response.AddHeader("Content-disposition", "attachment; filename=" + fileName);
                Response.ContentType = "application/octet-stream";
                Response.BinaryWrite(fileBinary);
                Response.End();
            }
        }
0 голосов
/ 26 июня 2009

Поскольку он маленький, и если вы хотите, чтобы все было просто, просто проверяйте каждый N запросов на веб-сайт. Если вы считаете, что количество очищаемых файлов может увеличиться, прекратите очистку после того, как найдете несколько очищаемых, и позвольте следующему запросу очистить еще несколько. Преимущество заключается в том, что вам не нужно управлять внешним заданием (и устанавливать его, и продолжать его работу и т. Д.).

Вероятно, не очень хорошая идея для большого сайта.

...