0

添付ファイル付きのメールを送信してからブラウザで表示するためだけに作成されたファイルを削除すると問題が発生します。これは電子メールを送信するためだけに作成されているため、このファイルを削除する必要があります。これどうやってするの。

これが私がこれまでに得たものです。

public void SendEmail()
 {
    EmailClient.Send(mailMessage);

    //View PDF Certificate in Browser
    ViewPDFinBrowser((string)fileObject);

    DeleteGeneratedTempCertificateFile((string)fileObject));
}    

public void ViewPDFinBrowser(string filePath)
  {
     PdfReader reader = new PdfReader(filePath);
     MemoryStream ms = new MemoryStream();

     PdfStamper stamper = new PdfStamper(reader, ms);
     stamper.ViewerPreferences = PdfWriter.PageLayoutSinglePage | PdfWriter.PageModeUseThumbs;
     stamper.Close();

     Response.Clear();
     Response.ContentType = "application/pdf";
     Response.OutputStream.Write(ms.GetBuffer(), 0, ms.GetBuffer().Length);
     Response.OutputStream.Close();
     HttpContext.Current.ApplicationInstance.CompleteRequest();

  }

  public static void DeleteGeneratedTempCertificateFile(Object fileObject)
  {
      string filePath = (string)fileObject;
      if (File.Exists(filePath))
      {
          File.Delete(filePath);
      }
  }

SendEmail() を呼び出すときに必要な手順は次のとおりです。

1) 添付ファイル付きのメールを送信 --> 一時ファイルが作成されました 2) 一時ファイルをブラウザーで表示 3) 一時ファイルを削除

ファイルが応答オブジェクトにある限り、エラーメッセージ (「ファイルは別のプロセスで使用されています。ファイルは別のプロセスで使用されています。応答ストリームを閉じるとファイルは削除されますが、その後はできません。ブラウザで表示します。

ボタンをクリックして新しいウィンドウでブラウザで表示するファイルを開くことができれば、ファイルを削除できると考えていました。または、10 分後にファイルを削除できると考えています。ユーザーが 1 ~ 2 分以上 PDF を表示しているサイトにいることはないためです。

サンプルコードで解決策の1つを教えてください。

あなたの時間と助けに感謝します。

4

1 に答える 1

1

他の人が言っているように、一時ファイルをディスクに書き込まずに、MemoryStreamをそのまま使用することをお勧めします。サードパーティのコンポーネントの実装ではこれが許可されない場合があります。そのような場合は、PDFファイルのバイナリコンテンツを書き込んだ後、必ずcloseを呼び出してください(および/または破棄する場合は、MSDNまたはサードパーティのAPIドキュメントで.Closeを確認してください。 ()実際には)不要になったすべてのストリームに。あなたの場合、httpリクエストを完了した後、msreaderを閉じてください。

ほとんどの場合、usingパターンの実装を検討してください。詳細については、 http://msdn.microsoft.com/en-us/library/aa664736.aspxを参照してください。ただし、このアプローチにも注意が必要です。たとえば、WCFクライアントでは、例外が発生する可能性があります(したがって、実際にはusing句内のすべてのコンテンツが破棄されるわけではありません)。

また、同時実行の問題にも注意してください。一時ファイル名を十分にランダムに保ち、ファイルがローカルディスクにすでに存在する状況を考慮します(つまり、操作に失敗し、リクエスターが表示するはずのない要求にバイナリを送信しないなど)。

于 2012-08-03T11:03:24.207 に答える