我有一个创建PDF的流程。我希望这些PDF是暂时的和短暂的。我希望能够在用户单击按钮时执行以下操作:
string CreatePDF()//returns fileName.pdf
PromptUserToDownloadPDF()
DeletePDF(fileName.pdf)
我希望避免创建清理过程并处理用户在运行清理时同时创建PDF的任何竞争条件。
在winforms中,我会同步提示用户下载文件。我怎样才能在网上做类似的任务?
更新
请注意,我正在使用第三方应用程序来创建PDF(Apache FOP)。基本上我(将)有一个调用命令行的函数:
C:> fop“inputfile”“output.pdf”
所以,在记忆中不是一种选择......除非我能以某种方式做到......
string CreatePDF()//returns fileName.pdf
string RecreatePDFInMemory()
DeletePDF(fileName.pdf)
PromptUserToDownloadPDF()
答案 0 :(得分:8)
这样的事情:
byte[] _pdfbytes = CreatePDF();
Response.ContentType = "application/pdf";
Response.AppendHeader("Content-Length", _pdfbytes.Length.ToString());
Response.BinaryWrite(_pdfbytes);
由于这会在内存中创建PDF,因此您无需担心清理。
编辑OP的编辑:
从CreatePDF
开始,您可以使用Path.GetTempFileName
创建临时文件并执行“fop”以写入该文件。在返回byte[]
之前立即删除该文件。我建议在finally
块内执行此删除操作。但是,“Fop”确实支持将其输出通过管道输出到stdout。使用CreatePDF
函数抓取可能更干净。
答案 1 :(得分:2)
考虑沿着这些方向做点什么。
与其他人在不同答案中提及的内容类似,您无需在系统中保存PDF文件,只需将其作为回复发送即可。
我不确定您是如何创建PDF的,但请尝试查看以下内容,看看您的流程是否可以使用此类内容。
HttpResponse currentResponse = HttpContext.Current.Response;
currentResponse.Clear();
currentResponse.ClearHeaders();
currentResponse.ContentType = "application/pdf";
currentResponse.AppendHeader("Content-Disposition", "attachment; filename=my.pdf");
//create the "my.pdf" here
currentResponse.Flush();
currentResponse.End();
答案 2 :(得分:1)
不确定您的进程,但您应该能够将PDF写入byte []并完全跳过写入磁盘。
byte[] pdf = GetPDFBytes(filename)
MemoryStream pdfStream = new MemoryStream(pdf);
然后使用pdfStream发回给用户。
答案 3 :(得分:0)
您可以使用asp.net页面流式传输文件。
我试图找到一篇非常古老的文章,用GIF(没有实际文件)来证明这一点
http://www.informit.com/articles/article.aspx?p=25487
它创建了一个特殊的页面,用于流出数据(在标题中适当地设置内容类型)。
同样,您可以创建一个“页面”来流式传输PDF - 它甚至可能不需要驻留在磁盘上,但如果确实存在,则可以在将其流式传输到浏览器后将其删除。