4

これはとても簡単だと思います。私のプログラムは、自動化を使用してサーバー上にExcelファイルを作成します。その後、ユーザーにダウンロードするかどうかを強制的に選択させ、選択に関係なく、ファイルを削除して、スペースを占有しないようにします。これをどのように達成できるかについてのアイデアはありますか?

4

5 に答える 5

9

ファイルを入力バッファーに読み込んでからファイルを削除し、実際のファイルの代わりにバッファーをユーザーに送信することができます。

于 2009-08-20T19:33:07.850 に答える
1

ユーザーが実際にファイルのダウンロードを終了した時期を知るのは難しく、削除する前にファイルを削除したくないので、特定の時間(たとえば、24時間以上)より古いファイルを削除することをお勧めします。

ブラウザがこの情報を送信しないため、ユーザーがファイルのダウンロードを終了したかどうかを判断するのは困難です。また、ネットワークデータをパケットでスニッフィングし、開いている接続を管理するためにWebサーバーを詳細に構成する以外は、実際にはファイルが作成されないと信じています。エラー、簡単な方法はありません。

また、ファイルの読み取り方法と実際のサイズにも依存します。たとえば、1行ずつブラウザに出力するとメモリが節約されますが、ファイルのコンテンツを読み取るときに、コードがファイルの存在に依存するようになります。ある種のバッファを使用すると、Webサーバーは適切に機能し、サービスを提供できますが、訪問者の数、ファイルサイズ、平均ダウンロード速度によっては、メモリに数十GBのファイルがあるWebサーバーがいつでも存在する可能性があります。

数日分のデータを保存するのに十分なスペースを確保し、時々ファイルを削除する方が簡単です。

于 2009-08-20T19:35:23.930 に答える
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));
}
于 2009-08-20T19:43:18.467 に答える
0

しばらく前に質問があったことは知っていますが、このヒントが役立つと思いました。

以下は、トリックを実行する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();
}
于 2014-06-20T14:54:16.403 に答える
-1

Microsoft KB 257757に記載されているように、 Microsoftはサーバーで自動化を使用しないことをお勧めします。

Microsoftは現在、無人の非対話型クライアントアプリケーションまたはコンポーネント(ASP、ASP.NET、DCOM、およびNTサービスを含む)からのMicrosoft Officeアプリケーションの自動化を推奨しておらず、サポートしていません。Officeは不安定な動作を示す可能性があり、 /またはOfficeがこの環境で実行されている場合のデッドロック。

SpreadsheetGear for .NETおよびその他のサードパーティライブラリはそれを実行でき、より高速で信頼性が高くなります。SpreadsheetGearは、出力ストリームへの直接書き込みをサポートしているため、ディスク上に一時ファイルを作成する必要はありません。パフォーマンスが向上し、残ったファイルをクリーンアップする心配がありません。

ここでC#およびVBソースを使用したASP.NET Excelレポートのサンプルを確認できます。自分で試してみたい場合は、ここから無料の試用版をダウンロードしてください。

免責事項:私はSpreadsheetGearLLCを所有しています

于 2009-08-20T21:00:21.887 に答える