これはとても簡単だと思います。私のプログラムは、自動化を使用してサーバー上にExcelファイルを作成します。その後、ユーザーにダウンロードするかどうかを強制的に選択させ、選択に関係なく、ファイルを削除して、スペースを占有しないようにします。これをどのように達成できるかについてのアイデアはありますか?
5 に答える
ファイルを入力バッファーに読み込んでからファイルを削除し、実際のファイルの代わりにバッファーをユーザーに送信することができます。
ユーザーが実際にファイルのダウンロードを終了した時期を知るのは難しく、削除する前にファイルを削除したくないので、特定の時間(たとえば、24時間以上)より古いファイルを削除することをお勧めします。
ブラウザがこの情報を送信しないため、ユーザーがファイルのダウンロードを終了したかどうかを判断するのは困難です。また、ネットワークデータをパケットでスニッフィングし、開いている接続を管理するためにWebサーバーを詳細に構成する以外は、実際にはファイルが作成されないと信じています。エラー、簡単な方法はありません。
また、ファイルの読み取り方法と実際のサイズにも依存します。たとえば、1行ずつブラウザに出力するとメモリが節約されますが、ファイルのコンテンツを読み取るときに、コードがファイルの存在に依存するようになります。ある種のバッファを使用すると、Webサーバーは適切に機能し、サービスを提供できますが、訪問者の数、ファイルサイズ、平均ダウンロード速度によっては、メモリに数十GBのファイルがあるWebサーバーがいつでも存在する可能性があります。
数日分のデータを保存するのに十分なスペースを確保し、時々ファイルを削除する方が簡単です。
本当に良い方法は、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));
}
しばらく前に質問があったことは知っていますが、このヒントが役立つと思いました。
以下は、トリックを実行する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();
}
Microsoft KB 257757に記載されているように、 Microsoftはサーバーで自動化を使用しないことをお勧めします。
「Microsoftは現在、無人の非対話型クライアントアプリケーションまたはコンポーネント(ASP、ASP.NET、DCOM、およびNTサービスを含む)からのMicrosoft Officeアプリケーションの自動化を推奨しておらず、サポートしていません。Officeは不安定な動作を示す可能性があり、 /またはOfficeがこの環境で実行されている場合のデッドロック。」
SpreadsheetGear for .NETおよびその他のサードパーティライブラリはそれを実行でき、より高速で信頼性が高くなります。SpreadsheetGearは、出力ストリームへの直接書き込みをサポートしているため、ディスク上に一時ファイルを作成する必要はありません。パフォーマンスが向上し、残ったファイルをクリーンアップする心配がありません。
ここでC#およびVBソースを使用したASP.NET Excelレポートのサンプルを確認できます。自分で試してみたい場合は、ここから無料の試用版をダウンロードしてください。
免責事項:私はSpreadsheetGearLLCを所有しています