在按钮单击并删除文件的新窗口中查看浏览器中的PDF

时间:2012-08-03 10:36:37

标签: c# asp.net

我遇到删除创建文件的问题,只是为了发送带附件的电子邮件,然后在浏览器中查看。现在我需要删除此文件,因为这是为了发送电子邮件而创建的。我怎么能这样做。

这是我到目前为止所得到的。

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分钟后删除该文件。因为用户不会在现场查看PDF超过1-2分钟。

请通过示例代码告诉我一个解决方案。

感谢您的时间和帮助。

1 个答案:

答案 0 :(得分:1)

正如其他人所说,最好不要将临时文件写入磁盘,而是使用MemoryStream。有时第三方组件的实现不允许这样做,在这种情况下,在写完PDF文件的二进制内容之后,一定要调用close(和/或可能配置,总是检查MSDN或第三方API文档是什么.Close ()实际上)对所有不再需要的流。在您的情况下,在完成http请求后关闭 ms reader

在大多数情况下,请考虑实施使用模式。有关详细信息,请参阅http://msdn.microsoft.com/en-us/library/aa664736.aspx。但是请记住,这种方法也存在一些警告,例如在WCF客户端中可能导致异常(因此实际上并未处理using子句中的所有内容)。

另外,请记住任何并发问题。保持临时文件名随机,并考虑本地磁盘上已存在文件的情况(即操作失败,不向请求者不应看到的请求发送二进制文件等)。