【发布时间】:2012-08-03 19:03:24
【问题描述】:
我在删除仅为发送带有附件的电子邮件然后在浏览器中查看而创建的文件时遇到问题。现在我需要删除这个文件,因为它只是为了发送电子邮件而创建的。我该怎么做。
这是我到目前为止所得到的。
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 分钟。
请用示例代码告诉我一个解决方案。
感谢您的时间和帮助。
【问题讨论】:
-
为什么需要写文件呢?我直接从
MemoryStream在MailMessage创建了附件。 -
我已经尝试过了,可以使用内存流在浏览器中查看文件。但是以某种方式使用 meorystream,我无法将文件附加到 MailMessage.. 我只想使用这种方法。但它不工作,所以这就是为什么我选择这种方法.. 请帮助
-
您确定需要在添加到附件之前重置
MemoryStream吗?调试过了,确实不为空? -
是的,要获取文件作为附件,我们需要将内存流位置设置为 0.. 这就是谷歌搜索返回给我的结果。