2009-08-20 1 views
4

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

ответ

8

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

+0

и может PLS отправлять образцы кода ..? – shashwat

1

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

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

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

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

+0

Предположим, у меня нет доступа к серверу, на котором он будет работать. Как написать код для удаления файлов старше 24 часов и как я планирую его запустить? Любые идеи были бы полезны, так как я предпочел бы пойти по этому пути. –

1

Действительно хороший способ, в вашем 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

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

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

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

вы можете увидеть образцы ASP.NET Excel Создание отчетов с помощью C# и источник VB here и скачать бесплатную пробную версию here если вы хотите попробовать это для себя.

Отказ от ответственности: У меня есть SpreadsheetGear LLC

0

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

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

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

REFERENCE LINK

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(); 
} 
Смежные вопросы