Удалить файл после загрузки пользователем - PullRequest
4 голосов
/ 20 августа 2009

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

Ответы [ 5 ]

9 голосов
/ 20 августа 2009

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

1 голос
/ 20 августа 2009

Действительно хороший способ, в вашем global.asax

Я думаю, что SO использует нечто подобное, хотя я забыл для чего ... (Я уверен, что украл у них этот код)

private static CacheItemRemovedCallback OnCacheRemove = null;

private void AddTask(string name, int seconds)
{
    OnCacheRemove = new CacheItemRemovedCallback(CacheItemRemoved);
    HttpRuntime.Cache.Insert(name, seconds, null, DateTime.Now.AddSeconds(seconds), Cache.NoSlidingExpiration, CacheItemPriority.NotRemovable, OnCacheRemove);
}

void Application_Start(object sender, EventArgs e) 
{
    // Code that runs on application startup

    // delete old spreadsheets every hour
    AddTask("DeleteDayOldSpreadsheets", 3600);

}

public void CacheItemRemoved(string k, object v, CacheItemRemovedReason r)
{
    // do stuff here
    switch (k)
    {
        case "DeleteDayOldSpreadsheets":
            // TODO: add your magic DELETE OLD SPREADSHEET code here
            break;    

        default:
            break;
    }

    // re-add our task so it recurs
    AddTask(k, Convert.ToInt32(v));
}
1 голос
/ 20 августа 2009

Трудно понять, когда пользователь фактически завершил загрузку файла, и вы не хотите удалять его перед этим, поэтому я советую удалять файлы старше определенного времени, например> 24 часов. .

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

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

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

0 голосов
/ 20 июня 2014

Я знаю, что вопрос задал некоторое время назад, но подумал, что этот совет будет полезен.

Ниже приведен код C #, который добивается цели.

Для дальнейшей информации я указал ссылку, по которой я нашел оригинальную идею. Это было полезно для меня.

ССЫЛКА

private void DownloadFile()
{
    Response.ContentType = ContentType;
    Response.AppendHeader("Content-Disposition", "attachment; filename=myFile.txt");
    Response.WriteFile(Server.MapPath("~/uploads/myFile.txt"));
    Response.Flush();   
    // Delete the file just before execute Response.End()
    System.IO.File.Delete(Server.MapPath("~/uploads/myFile.txt"));
    Response.End();
}
0 голосов
/ 21 августа 2009

Как указано в Microsoft KB 257757 , Microsoft не рекомендует использовать автоматизацию на сервере:

" В настоящее время Microsoft не рекомендует и не поддерживает автоматизацию приложений Microsoft Office из любых необслуживаемых неинтерактивных клиентских приложений или компонентов (включая ASP, ASP.NET, DCOM и NT Services), поскольку Office может демонстрировать нестабильное поведение и / или тупиковую ситуацию при работе Office в этой среде."

SpreadsheetGear for .NET и другие сторонние библиотеки могут это сделать, и они будут работать быстрее и надежнее. SpreadsheetGear поддерживает запись непосредственно в выходной поток, поэтому вам не нужно создавать временный файл на диске, что обеспечивает лучшую производительность и не беспокоится об удалении оставшихся файлов.

Вы можете ознакомиться с примерами отчетов ASP.NET Excel с C # и источником VB здесь и загрузить бесплатную пробную версию здесь , если хотите попробовать сами.

Отказ от ответственности: я владею SpreadsheetGear LLC

...