6

ITextSharp と ASP.NET 1.1 を使用して、その場で PDF ファイルを作成しています。私のプロセスは次のとおりです-

  • サーバー上にファイルを作成する
  • ユーザーに表示されるように、ブラウザーを新しく作成された PDF ファイルにリダイレクトします。

私がしたいのは、ユーザーのブラウザーに表示されたらすぐにサーバーから PDF を削除することです。PDF ファイルは大きいため、メモリに保持するオプションはありません。サーバーへの初期書き込みが必要です。私は現在、ファイルを定期的にポーリングして削除するソリューションを使用していますが、クライアント マシンにダウンロードされた直後にファイルを削除するソリューションを希望します。これを行う方法はありますか?

4

4 に答える 4

6

ブラウザを作成したファイルにリダイレクトする代わりに、独自の HttpHandler を使用して自分でファイルを提供できます。次に、ファイルを提供した直後にファイルを削除することも、メモリ内にファイルを作成することもできます。

PDF ファイルをクライアントに直接書き込みます。

public class MyHandler : IHttpHandler {
    public void ProcessRequest(System.Web.HttpContext context) {
        context.Response.ContentType = "application/pdf";
        // ...
        PdfWriter.getInstance(document, context.Response.OutputStream);
        // ...

または、既に生成されたファイル 'filename' を読み取り、ファイルを提供して削除します。

context.Response.Buffer = false;
context.Response.BufferOutput = false;
context.Response.ContentType = "application/pdf";

Stream outstream = context.Response.OutputStream;
FileStream instream = 
    new FileStream(filename, FileMode.Open, FileAccess.Read, FileShare.Read);

byte[] buffer = new byte[BUFFER_SIZE];
int len;
while ((len = instream.Read(buffer, 0, BUFFER_SIZE)) > 0) {
    outstream.Write(buffer, 0, len);
}
outstream.Flush();
instream.Close();

// served the file -> now delete it 
File.Delete(filename);

このコードは試していません。これはちょうど私がそれがうまくいくと思う方法です...

于 2009-03-18T10:01:24.003 に答える
5

f3lixの答えに触発されました(f3lixに感謝します!)次のVB.netコードを思いつきました-

HttpContext.Current.Response.ClearContent()
HttpContext.Current.Response.ClearHeaders()
HttpContext.Current.Response.ContentType = "application/pdf"
HttpContext.Current.Response.TransmitFile(PDFFileName)
HttpContext.Current.Response.Flush()
HttpContext.Current.Response.Close()
File.Delete(PDFFileName)

これは機能しているように見えます。私が使用した「WriteFile」メソッドは、f3lix で使用されるストリーム メソッドよりも効率が悪いのでしょうか? どちらのソリューションよりも効率的な方法はありますか?

編集 (2009 年 3 月 19 日) 以下のコメントに基づいて、「WriteFile」メソッドを「TransmitFile」に変更しました。これは、送信前にファイル全体を Web サーバーのメモリに書き込むのではなく、ファイルをチャンクでクライアントに送信するように見えるためです。詳細については、こちらをご覧ください

于 2009-03-18T10:42:46.027 に答える
3

または、ディスクにまったく書き込まずにブラウザーに返すこともできます。

byte[] pdf;

using (MemoryStream ms = new MemoryStream()) {
    Document doc = new Document();
    PdfWriter.GetInstance(doc, ms);
    doc.AddTitle("Document Title");
    doc.Open();
    doc.Add(new Paragraph("My paragraph."));
    doc.Close();
    pdf = ms.GetBuffer();
}

Response.ContentType = "application/pdf";
Response.AddHeader("Content-Disposition", "attachment;filename=MyDocument.pdf");
Response.OutputStream.Write(pdf, 0, pdf.Length);
于 2010-01-22T15:37:05.643 に答える
0

ソリューション:

Response.TransmitFile(PDFFileName)
Response.Flush()
Response.Close()
File.Delete(PDFFileName)

私にはうまくいきません(ファイルがクライアントに届くことはありません)。ファイルが大きくなる可能性があるため、バイト配列を読み取って Response.BinaryWrite を呼び出すこともできません。ファイルが解放されるのを待ってから削除する非同期プロセスを開始するための唯一のハックですか?

于 2009-05-12T21:00:33.297 に答える